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