]> jfr.im git - solanum.git/blame - include/channel.h
chmode: Make mode table manageable
[solanum.git] / include / channel.h
CommitLineData
212380e3
AC
1/*
2 * ircd-ratbox: A slightly useful ircd.
3 * channel.h: The ircd channel header.
4 *
5 * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
6 * Copyright (C) 1996-2002 Hybrid Development Team
7 * Copyright (C) 2002-2004 ircd-ratbox development team
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22 * USA
212380e3
AC
23 */
24
25#ifndef INCLUDED_channel_h
26#define INCLUDED_channel_h
212380e3
AC
27
28#define MODEBUFLEN 200
29
30/* Maximum mode changes allowed per client, per server is different */
31#define MAXMODEPARAMS 4
32#define MAXMODEPARAMSSERV 10
33
07554369
EM
34#include <setup.h>
35
212380e3
AC
36struct Client;
37
38/* mode structure for channels */
39struct Mode
40{
41 unsigned int mode;
42 int limit;
43 char key[KEYLEN];
44 unsigned int join_num;
45 unsigned int join_time;
46 char forward[LOC_CHANNELLEN + 1];
47};
48
49/* channel structure */
50struct Channel
51{
5b96d9a6 52 rb_dlink_node node;
212380e3 53 struct Mode mode;
78e6b731 54 char *mode_lock;
212380e3
AC
55 char *topic;
56 char *topic_info;
57 time_t topic_time;
212380e3
AC
58 time_t last_knock; /* don't allow knock to flood */
59
5b96d9a6
AC
60 rb_dlink_list members; /* channel members */
61 rb_dlink_list locmembers; /* local channel members */
212380e3 62
8aabb973 63 rb_dlink_list invites;
5b96d9a6
AC
64 rb_dlink_list banlist;
65 rb_dlink_list exceptlist;
66 rb_dlink_list invexlist;
67 rb_dlink_list quietlist;
212380e3
AC
68
69 time_t first_received_message_time; /* channel flood control */
70 int received_number_of_privmsgs;
71 int flood_noticed;
72
73 unsigned int join_count; /* joins within delta */
74 unsigned int join_delta; /* last ts of join */
75
66769bc1 76 time_t bants;
212380e3
AC
77 time_t channelts;
78 char *chname;
2f9687c4
AC
79
80 struct Client *last_checked_client;
81 time_t last_checked_ts;
82 unsigned int last_checked_type;
83 int last_checked_result;
212380e3
AC
84};
85
86struct membership
87{
5b96d9a6
AC
88 rb_dlink_node channode;
89 rb_dlink_node locchannode;
90 rb_dlink_node usernode;
212380e3
AC
91
92 struct Channel *chptr;
93 struct Client *client_p;
94 unsigned int flags;
95
66769bc1 96 time_t bants;
212380e3
AC
97};
98
83294285 99#define BANLEN 195
212380e3
AC
100struct Ban
101{
102 char *banstr;
103 char *who;
104 time_t when;
765d839d 105 char *forward;
5b96d9a6 106 rb_dlink_node node;
212380e3
AC
107};
108
7d1f9131
JT
109struct mode_letter
110{
111 int mode;
112 char letter;
113};
114
212380e3
AC
115struct ChModeChange
116{
117 char letter;
118 const char *arg;
119 const char *id;
120 int dir;
212380e3 121 int mems;
212380e3
AC
122};
123
19716b9f
JT
124typedef void (*ChannelModeFunc)(struct Client *source_p, struct Channel *chptr,
125 int alevel, int parc, int *parn,
126 const char **parv, int *errors, int dir, char c, long mode_type);
127
212380e3
AC
128struct ChannelMode
129{
19716b9f 130 ChannelModeFunc set_func;
212380e3
AC
131 long mode_type;
132};
133
134typedef int (*ExtbanFunc)(const char *data, struct Client *client_p,
135 struct Channel *chptr, long mode_type);
136
137/* can_send results */
138#define CAN_SEND_NO 0
139#define CAN_SEND_NONOP 1
140#define CAN_SEND_OPV 2
141
142/* channel status flags */
143#define CHFL_PEON 0x0000 /* normal member of channel */
a0626e7c
AC
144#define CHFL_VOICE 0x0001 /* the power to speak */
145#define CHFL_CHANOP 0x0002 /* Channel operator */
146
212380e3
AC
147#define CHFL_BANNED 0x0008 /* cached as banned */
148#define CHFL_QUIETED 0x0010 /* cached as being +q victim */
149#define ONLY_SERVERS 0x0020
be29ec79 150#define ONLY_OPERS 0x0040
212380e3
AC
151#define ALL_MEMBERS CHFL_PEON
152#define ONLY_CHANOPS CHFL_CHANOP
153#define ONLY_CHANOPSVOICED (CHFL_CHANOP|CHFL_VOICE)
154
155#define is_chanop(x) ((x) && (x)->flags & CHFL_CHANOP)
156#define is_voiced(x) ((x) && (x)->flags & CHFL_VOICE)
157#define is_chanop_voiced(x) ((x) && (x)->flags & (CHFL_CHANOP|CHFL_VOICE))
212380e3
AC
158#define can_send_banned(x) ((x) && (x)->flags & (CHFL_BANNED|CHFL_QUIETED))
159
160/* channel modes ONLY */
161#define MODE_PRIVATE 0x0001
162#define MODE_SECRET 0x0002
163#define MODE_MODERATED 0x0004
164#define MODE_TOPICLIMIT 0x0008
165#define MODE_INVITEONLY 0x0010
166#define MODE_NOPRIVMSGS 0x0020
167#define MODE_REGONLY 0x0040
212380e3
AC
168#define MODE_EXLIMIT 0x0100 /* exempt from list limits, +b/+e/+I/+q */
169#define MODE_PERMANENT 0x0200 /* permanant channel, +P */
170#define MODE_OPMODERATE 0x0400 /* send rejected messages to ops */
171#define MODE_FREEINVITE 0x0800 /* allow free use of /invite */
172#define MODE_FREETARGET 0x1000 /* can be forwarded to without authorization */
173#define MODE_DISFORWARD 0x2000 /* disable channel forwarding */
174
175#define CHFL_BAN 0x10000000 /* ban channel flag */
176#define CHFL_EXCEPTION 0x20000000 /* exception to ban channel flag */
177#define CHFL_INVEX 0x40000000
178#define CHFL_QUIET 0x80000000
179
180/* mode flags for direction indication */
181#define MODE_QUERY 0
182#define MODE_ADD 1
183#define MODE_DEL -1
184
185#define SecretChannel(x) ((x) && ((x)->mode.mode & MODE_SECRET))
186#define HiddenChannel(x) ((x) && ((x)->mode.mode & MODE_PRIVATE))
187#define PubChannel(x) ((!x) || ((x)->mode.mode &\
188 (MODE_PRIVATE | MODE_SECRET)) == 0)
189
190/* channel visible */
191#define ShowChannel(v,c) (PubChannel(c) || IsMember((v),(c)))
192
193#define IsMember(who, chan) ((who && who->user && \
194 find_channel_membership(chan, who)) ? 1 : 0)
195
1af4eff6 196#define IsChannelName(name) ((name) && (IsChanPrefix(*(name))))
212380e3
AC
197
198/* extban function results */
199#define EXTBAN_INVALID -1 /* invalid mask, false even if negated */
200#define EXTBAN_NOMATCH 0 /* valid mask, no match */
201#define EXTBAN_MATCH 1 /* matches */
202
e8a8d7a4
EK
203int iter_comm_channels_step(rb_dlink_node *pos1, rb_dlink_node *pos2,
204 struct membership **ms1, struct membership **ms2,
205 struct Channel **chptr);
206
6b3ae7e7
EK
207
208/* Iterate two sorted linked lists of channels, with heads headN, in lockstep.
209 At each iteration, chptr will be a channel in at least one of the lists,
210 and each msN will be non-null iff the channel is in its corresponding list.
211
212 head1 and head2 must be linked list heads.
213 pos1, pos2, ms1, ms2 must be names of modifiable variables, and should not
214 be modified during iteration. It is safe to break or continue at any point
215 without any special cleanup.
216
217 rb_dlink_node_t *pos1, *pos2, *head1, *head2;
218 struct membership *ms1, *ms2;
219 struct Channel *chptr;
220*/
221#define ITER_COMM_CHANNELS(pos1, pos2, head1, head2, ms1, ms2, chptr) \
222 for ((pos1) = (head1), (pos2) = (head2); \
223 iter_comm_channels_step((pos1), (pos2), &(ms1), &(ms2), &(chptr)); \
224 (ms1) && ((pos1) = (pos1)->next), (ms2) && ((pos2) = (pos2)->next))
e8a8d7a4
EK
225
226
5b96d9a6 227extern rb_dlink_list global_channel_list;
212380e3
AC
228void init_channels(void);
229
230struct Channel *allocate_channel(const char *chname);
231void free_channel(struct Channel *chptr);
765d839d 232struct Ban *allocate_ban(const char *, const char *, const char *);
212380e3
AC
233void free_ban(struct Ban *bptr);
234
235
236extern void destroy_channel(struct Channel *);
237
55abcbb2 238extern int can_send(struct Channel *chptr, struct Client *who,
212380e3 239 struct membership *);
3b9507d0 240extern bool flood_attack_channel(int p_or_n, struct Client *source_p,
15484f02 241 struct Channel *chptr, char *chname);
a7d4a0ab 242struct matchset;
212380e3 243extern int is_banned(struct Channel *chptr, struct Client *who,
a7d4a0ab
EK
244 struct membership *msptr, const struct matchset *ms,
245 const char **);
212380e3 246extern int is_quieted(struct Channel *chptr, struct Client *who,
a7d4a0ab 247 struct membership *msptr, const struct matchset *ms);
fe74401b
JT
248extern int can_join(struct Client *source_p, struct Channel *chptr,
249 const char *key, const char **forward);
212380e3
AC
250
251extern struct membership *find_channel_membership(struct Channel *, struct Client *);
252extern const char *find_channel_status(struct membership *msptr, int combine);
253extern void add_user_to_channel(struct Channel *, struct Client *, int flags);
254extern void remove_user_from_channel(struct membership *);
255extern void remove_user_from_channels(struct Client *);
256extern void invalidate_bancache_user(struct Client *);
257
5b96d9a6 258extern void free_channel_list(rb_dlink_list *);
212380e3 259
3a46803f 260extern bool check_channel_name(const char *name);
212380e3
AC
261
262extern void channel_member_names(struct Channel *chptr, struct Client *,
263 int show_eon);
264
265extern void del_invite(struct Channel *chptr, struct Client *who);
266
3b8a6350 267const char *channel_modes(struct Channel *chptr, struct Client *who);
212380e3
AC
268
269extern struct Channel *find_bannickchange_channel(struct Client *client_p);
270
271extern void check_spambot_warning(struct Client *source_p, const char *name);
272
273extern void check_splitmode(void *);
274
275void set_channel_topic(struct Channel *chptr, const char *topic,
276 const char *topic_info, time_t topicts);
277
278extern void init_chcap_usage_counts(void);
279extern void set_chcap_usage_counts(struct Client *serv_p);
280extern void unset_chcap_usage_counts(struct Client *serv_p);
281extern void send_cap_mode_changes(struct Client *client_p, struct Client *source_p,
282 struct Channel *chptr, struct ChModeChange foo[], int);
283
dca9e552
JT
284void resv_chan_forcepart(const char *name, const char *reason, int temp_time);
285
212380e3
AC
286extern void set_channel_mode(struct Client *client_p, struct Client *source_p,
287 struct Channel *chptr, struct membership *msptr, int parc, const char *parv[]);
8727cbe8 288extern void set_channel_mlock(struct Client *client_p, struct Client *source_p,
07554369 289 struct Channel *chptr, const char *newmlock, bool propagate);
212380e3
AC
290
291extern struct ChannelMode chmode_table[256];
292
a383180a 293extern bool add_id(struct Client *source_p, struct Channel *chptr, const char *banid,
765d839d 294 const char *forward, rb_dlink_list * list, long mode_type);
212380e3 295
765d839d
EM
296extern struct Ban * del_id(struct Channel *chptr, const char *banid, rb_dlink_list * list,
297 long mode_type);
212380e3
AC
298
299extern ExtbanFunc extban_table[256];
300
301extern int match_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
302extern int valid_extban(const char *banstr, struct Client *client_p, struct Channel *chptr, long mode_type);
303const char * get_extban_string(void);
304
3ee43bcf 305extern int get_channel_access(struct Client *source_p, struct Channel *chptr, struct membership *msptr, int dir, const char *modestr);
212380e3 306
27912fd4
AC
307extern void send_channel_join(struct Channel *chptr, struct Client *client_p);
308
212380e3 309#endif /* INCLUDED_channel_h */