X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/1af4eff6f6c76e359b8477f6f223133aefda4133..5a3e99829addc0686ce9ddf372a3dc9d28b44269:/include/channel.h diff --git a/include/channel.h b/include/channel.h index 76a1b178..19ca532f 100644 --- a/include/channel.h +++ b/include/channel.h @@ -32,6 +32,7 @@ #define MAXMODEPARAMSSERV 10 #include +#include "hook.h" struct Client; @@ -121,14 +122,24 @@ struct ChModeChange int mems; }; -typedef void (*ChannelModeFunc)(struct Client *source_p, struct Channel *chptr, - int alevel, int parc, int *parn, - const char **parv, int *errors, int dir, char c, long mode_type); +typedef void ChannelModeFunc(struct Client *source_p, struct Channel *chptr, + int alevel, const char *arg, int *errors, int dir, char c, long mode_type); + +enum chm_flags +{ + CHM_CAN_QUERY = 1 << 0, + CHM_OPS_QUERY = 1 << 1, + CHM_ARG_SET = 1 << 2, + CHM_ARG_DEL = 1 << 3, + CHM_ARGS = CHM_ARG_SET | CHM_ARG_DEL, + CHM_QUERYABLE = CHM_ARGS | CHM_CAN_QUERY, +}; struct ChannelMode { - ChannelModeFunc set_func; + ChannelModeFunc *set_func; long mode_type; + enum chm_flags flags; }; typedef int (*ExtbanFunc)(const char *data, struct Client *client_p, @@ -181,6 +192,7 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p, #define MODE_QUERY 0 #define MODE_ADD 1 #define MODE_DEL -1 +#define MODE_OP_QUERY 2 #define SecretChannel(x) ((x) && ((x)->mode.mode & MODE_SECRET)) #define HiddenChannel(x) ((x) && ((x)->mode.mode & MODE_PRIVATE)) @@ -200,6 +212,30 @@ typedef int (*ExtbanFunc)(const char *data, struct Client *client_p, #define EXTBAN_NOMATCH 0 /* valid mask, no match */ #define EXTBAN_MATCH 1 /* matches */ +int iter_comm_channels_step(rb_dlink_node *pos1, rb_dlink_node *pos2, + struct membership **ms1, struct membership **ms2, + struct Channel **chptr); + + +/* Iterate two sorted linked lists of channels, with heads headN, in lockstep. + At each iteration, chptr will be a channel in at least one of the lists, + and each msN will be non-null iff the channel is in its corresponding list. + + head1 and head2 must be linked list heads. + pos1, pos2, ms1, ms2 must be names of modifiable variables, and should not + be modified during iteration. It is safe to break or continue at any point + without any special cleanup. + + rb_dlink_node_t *pos1, *pos2, *head1, *head2; + struct membership *ms1, *ms2; + struct Channel *chptr; +*/ +#define ITER_COMM_CHANNELS(pos1, pos2, head1, head2, ms1, ms2, chptr) \ + for ((pos1) = (head1), (pos2) = (head2); \ + iter_comm_channels_step((pos1), (pos2), &(ms1), &(ms2), &(chptr)); \ + (ms1) && ((pos1) = (pos1)->next), (ms2) && ((pos2) = (pos2)->next)) + + extern rb_dlink_list global_channel_list; void init_channels(void); @@ -213,12 +249,14 @@ extern void destroy_channel(struct Channel *); extern int can_send(struct Channel *chptr, struct Client *who, struct membership *); -extern bool flood_attack_channel(int p_or_n, struct Client *source_p, +extern bool flood_attack_channel(enum message_type msgtype, struct Client *source_p, struct Channel *chptr, char *chname); +struct matchset; extern int is_banned(struct Channel *chptr, struct Client *who, - struct membership *msptr, const char *, const char *, const char **); + struct membership *msptr, const struct matchset *ms, + const char **); extern int is_quieted(struct Channel *chptr, struct Client *who, - struct membership *msptr, const char *, const char *); + struct membership *msptr, const struct matchset *ms); extern int can_join(struct Client *source_p, struct Channel *chptr, const char *key, const char **forward);