/* * Copyright © 2005 William Pitcock, et al. * Rights to this code are as documented in doc/pod/license.pod. * * Data structures for channel information. * * $Id: channels.h,v 1.5 2007/09/05 11:23:13 pippijn Exp $ */ #ifndef CHANNELS_H #define CHANNELS_H #include #include #define MAXEXTMODES 5 // Channel modes enum { CMODE_INVITE = 1 << 0, CMODE_KEY = 1 << 1, CMODE_LIMIT = 1 << 2, CMODE_MOD = 1 << 3, CMODE_NOEXT = 1 << 4, CMODE_OP = 1 << 5, /* SPECIAL */ CMODE_PRIV = 1 << 6, /* AKA PARA */ CMODE_SEC = 1 << 7, CMODE_TOPIC = 1 << 8, CMODE_VOICE = 1 << 9 /* SPECIAL */ }; class channel_t : public zero_initialised { struct callbacks { functor::callback1 add; functor::callback1 akick_add; functor::callback1 remove; functor::callback6 can_change_topic; functor::callback3 message; functor::callback1 topic; functor::callback1 tschange; }; public: unsigned modes; char *name; char *key; unsigned int limit; char *extmodes[MAXEXTMODES]; /* non-standard simple modes with param eg +j */ unsigned int nummembers; time_t ts; char *topic; char *topic_setter; time_t topicts; list_t members; list_t bans; static callbacks callback; }; /* struct for channel memberships */ class chanuser_t : public zero_initialised { struct callbacks { functor::callback1 join; functor::callback1 part; }; public: unsigned modes; channel_t *chan; user_t *user; node_t unode; node_t cnode; static callbacks callback; }; struct chanban_t : zero_initialised { channel_t *chan; char *mask; int type; /* 'b', 'e', 'I', etc -- jilles */ }; enum mtype { MTYPE_NUL, MTYPE_ADD, MTYPE_DEL }; struct cmode_t { char mode; unsigned int value; }; struct extmode_t { char mode; bool (*check) (char const * const, channel_t *, mychan_t *, user_t *, myuser_t *); }; #if 0 /* channel related hooks */ typedef struct { chanuser_t *cu; /* Write NULL here if you kicked the user. When kicking the last user, you must join a service first, otherwise the channel may be destroyed and crashes may occur. The service may not part until you return; chanserv provides MC_INHABIT to help with this. This also prevents kick/rejoin floods. If this is NULL, a previous function kicked the user */ } hook_channel_joinpart_t; typedef struct { user_t *u; channel_t *c; char *msg; } hook_cmessage_data_t; struct hook_channel_topic_check_t { user_t *u; /* Online user that changed the topic */ server_t *s; /* Server that restored a topic */ channel_t *c; /* Channel still has old topic */ char const * const setter; /* Stored setter string, can be nick, nick!user@host or server */ time_t ts; /* Time the topic was changed */ char const * const topic; /* New topic */ int approved; /* Write non-zero here to cancel the change */ hook_channel_topic_check_t (char const * const _setter, char const * const _topic) : setter (_setter), topic (_topic) { } }; #endif /* cmode.C */ E char *flags_to_string (int flags); E int mode_to_flag (char c); E void channel_mode (user_t *source, channel_t *chan, int parc, char const * const parv[]); E void channel_mode (user_t *source, channel_t *chan, char const * const arg); E void channel_mode_va (user_t *source, channel_t *chan, int parc, char const * const parv0, ...); E void clear_simple_modes (channel_t *c); E char *channel_modes (channel_t *c, bool doparams); E void modestack_flush_channel (channel_t *channel); E void modestack_forget_channel (channel_t *channel); E void modestack_finalize_channel (channel_t *channel); E void modestack_mode_simple (char *source, channel_t *channel, mtype dir, int flags); E void modestack_mode_limit (char *source, channel_t *channel, mtype dir, unsigned int limit); E void modestack_mode_ext (char *source, channel_t *channel, mtype dir, int i, char const * const value); E void modestack_mode_param (char *source, channel_t *channel, mtype dir, char type, char const * const value); E void check_modes (mychan_t *mychan, bool sendnow); /* channels.C */ typedef std::pair channel_pair; typedef std::map channel_map; E channel_map chanlist; E void init_channels (void); E channel_t *channel_add (char const * const name, unsigned int ts, server_t *creator); E void channel_delete (channel_t *c); E channel_t *channel_find (char const * const name); E chanuser_t *chanuser_add (channel_t *chan, char const * const user); E void chanuser_delete (channel_t *chan, user_t *user); E chanuser_t *chanuser_find (channel_t *chan, user_t *user); E chanban_t *chanban_add (channel_t *chan, char const * const mask, int type); E void chanban_delete (chanban_t *c); E chanban_t *chanban_find (channel_t *chan, char const * const mask, int type); E void chanban_clear (channel_t *chan); #endif