1 /* 2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd) 3 * 4 * Copyright (c) 1997-2021 ircd-hybrid development team 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 19 * USA 20 */ 21 22 /*! \file channel.h 23 * \brief Responsible for managing channels, members, bans and topics 24 * \version $Id: channel.h 9858 2021-01-01 04:43:42Z michael $ 25 */ 26 27 #ifndef INCLUDED_channel_h 28 #define INCLUDED_channel_h 29 30 #include "ircd_defs.h" /* KEYLEN, CHANNELLEN */ 31 #include "extban.h" 32 33 #define AddMemberFlag(x, y) ((x)->flags |= (y)) 34 #define DelMemberFlag(x, y) ((x)->flags &= ~(y)) 35 36 enum 37 { 38 CAN_SEND_NO = 0, 39 CAN_SEND_NONOP = -1, 40 CAN_SEND_OPV = -2 41 }; 42 43 enum 44 { 45 MSG_FLOOD_NOTICED = 1 << 0, 46 JOIN_FLOOD_NOTICED = 1 << 1 47 }; 48 49 #define SetFloodNoticed(x) ((x)->flags |= MSG_FLOOD_NOTICED) 50 #define IsSetFloodNoticed(x) ((x)->flags & MSG_FLOOD_NOTICED) 51 #define ClearFloodNoticed(x) ((x)->flags &= ~MSG_FLOOD_NOTICED) 52 53 #define SetJoinFloodNoticed(x) ((x)->flags |= JOIN_FLOOD_NOTICED) 54 #define IsSetJoinFloodNoticed(x) ((x)->flags & JOIN_FLOOD_NOTICED) 55 #define ClearJoinFloodNoticed(x) ((x)->flags &= ~JOIN_FLOOD_NOTICED) 56 57 struct Client; 58 59 /*! \brief Mode structure for channels */ 60 struct Mode 61 { 62 unsigned int mode; /**< simple modes */ 63 unsigned int limit; /**< +l userlimit */ 64 char key[KEYLEN + 1]; /**< +k key */ 65 }; 66 67 /*! \brief Channel structure */ 68 struct Channel 69 { 70 dlink_node node; 71 72 struct Channel *hnextch; 73 struct Mode mode; 74 75 char topic[TOPICLEN + 1]; 76 char topic_info[NICKLEN + USERLEN + HOSTLEN + 3]; 77 78 uintmax_t creation_time; /**< Real time */ 79 uintmax_t topic_time; /**< Real time */ 80 uintmax_t last_knock_time; /**< Don't allow knock to flood; monotonic time */ 81 uintmax_t last_invite_time; /**< Monotonic time */ 82 uintmax_t last_join_time; /**< Monotonic time */ 83 uintmax_t first_received_message_time; /*!< Channel flood control; monotonic time */ 84 unsigned int flags; 85 unsigned int received_number_of_privmsgs; 86 87 dlink_list members_local; /*!< local members are here too */ 88 dlink_list members; 89 dlink_list invites; 90 dlink_list banlist; 91 dlink_list exceptlist; 92 dlink_list invexlist; 93 94 float number_joined; 95 96 char name[CHANNELLEN + 1]; 97 size_t name_len; 98 }; 99 100 /*! \brief ChannelMember structure */ 101 struct ChannelMember 102 { 103 dlink_node locchannode; /**< link to channel->members_local */ 104 dlink_node channode; /**< link to channel->members */ 105 dlink_node usernode; /**< link to client->channel */ 106 struct Channel *channel; /**< Channel pointer */ 107 struct Client *client; /**< Client pointer */ 108 unsigned int flags; /**< user/channel flags, e.g. CHFL_CHANOP */ 109 }; 110 111 enum { BANSTRLEN = 200 }; /* XXX */ 112 113 /*! \brief Ban structure. Used for b/e/I n!u\@h masks */ 114 struct Ban 115 { 116 dlink_node node; 117 unsigned int extban; 118 char banstr[BANSTRLEN]; 119 char name[NICKLEN + 1]; 120 char user[USERLEN + 1]; 121 char host[HOSTLEN + 1]; 122 char who[NICKLEN + USERLEN + HOSTLEN + 3]; 123 size_t banstr_len; /**< Cached string length of Ban::banstr */ 124 uintmax_t when; /**< Time this ban has been set; real time */ 125 struct irc_ssaddr addr; 126 int bits; 127 int type; 128 }; 129 130 extern const dlink_list *channel_get_list(void); 131 extern bool channel_check_name(const char *, bool); 132 extern int can_send(struct Channel *, struct Client *, struct ChannelMember *, const char *, bool); 133 extern bool is_banned(struct Channel *, struct Client *); 134 extern bool find_bmask(struct Client *, struct Channel*, const dlink_list *, struct Extban *); 135 extern bool member_has_flags(const struct ChannelMember *, const unsigned int); 136 137 extern void channel_do_join(struct Client *, char *, char *); 138 extern void channel_do_part(struct Client *, char *, const char *); 139 extern void remove_ban(struct Ban *, dlink_list *); 140 extern void add_user_to_channel(struct Channel *, struct Client *, unsigned int, bool); 141 extern void remove_user_from_channel(struct ChannelMember *); 142 extern void channel_demote_members(struct Channel *, const struct Client *, unsigned int, const char); 143 extern void channel_send_namereply(struct Client *, struct Channel *); 144 extern void channel_send_modes(struct Client *, const struct Channel *); 145 extern void channel_modes(const struct Channel *, const struct Client *, const struct ChannelMember *, char *, char *); 146 extern void check_spambot_warning(struct Client *, const char *); 147 extern void channel_free(struct Channel *); 148 extern void channel_set_topic(struct Channel *, const char *, const char *, uintmax_t, bool); 149 150 extern const char *member_get_prefix(const struct ChannelMember *, bool); 151 extern size_t member_get_prefix_len(const struct ChannelMember *, bool); 152 153 extern struct Channel *channel_make(const char *); 154 extern struct ChannelMember *member_find_link(const struct Client *, const struct Channel *); 155 #endif /* INCLUDED_channel_h */ 156