X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/f06c147c70cf72b40e4ec0ec3b5aca86662beb80..fc579e36e7201b9fcedf1f44f6d8746aa7fe1918:/modules/core/m_mode.c diff --git a/modules/core/m_mode.c b/modules/core/m_mode.c index 1653b09..5345519 100644 --- a/modules/core/m_mode.c +++ b/modules/core/m_mode.c @@ -21,7 +21,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * - * $Id: m_mode.c 1006 2006-03-09 15:32:14Z nenolod $ */ #include "stdinc.h" @@ -42,9 +41,12 @@ #include "packet.h" #include "s_newconf.h" +struct module_modes ModuleModes; + static int m_mode(struct Client *, struct Client *, int, const char **); static int ms_mode(struct Client *, struct Client *, int, const char **); static int ms_tmode(struct Client *, struct Client *, int, const char **); +static int ms_mlock(struct Client *, struct Client *, int, const char **); static int ms_bmask(struct Client *, struct Client *, int, const char **); struct Message mode_msgtab = { @@ -55,18 +57,21 @@ struct Message tmode_msgtab = { "TMODE", 0, 0, 0, MFLG_SLOW, {mg_ignore, mg_ignore, {ms_tmode, 4}, {ms_tmode, 4}, mg_ignore, mg_ignore} }; +struct Message mlock_msgtab = { + "MLOCK", 0, 0, 0, MFLG_SLOW, + {mg_ignore, mg_ignore, {ms_mlock, 3}, {ms_mlock, 3}, mg_ignore, mg_ignore} +}; struct Message bmask_msgtab = { "BMASK", 0, 0, 0, MFLG_SLOW, {mg_ignore, mg_ignore, mg_ignore, {ms_bmask, 5}, mg_ignore, mg_ignore} }; -mapi_clist_av1 mode_clist[] = { &mode_msgtab, &tmode_msgtab, &bmask_msgtab, NULL }; +mapi_clist_av1 mode_clist[] = { &mode_msgtab, &tmode_msgtab, &mlock_msgtab, &bmask_msgtab, NULL }; DECLARE_MODULE_AV1(mode, NULL, NULL, mode_clist, NULL, NULL, "$Revision: 1006 $"); /* * m_mode - MODE command handler - * parv[0] - sender * parv[1] - channel */ static int @@ -205,6 +210,37 @@ ms_tmode(struct Client *client_p, struct Client *source_p, int parc, const char return 0; } +static int +ms_mlock(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) +{ + struct Channel *chptr = NULL; + + /* Now, try to find the channel in question */ + if(!IsChanPrefix(parv[2][0]) || !check_channel_name(parv[2])) + { + sendto_one_numeric(source_p, ERR_BADCHANNAME, form_str(ERR_BADCHANNAME), parv[2]); + return 0; + } + + chptr = find_channel(parv[2]); + + if(chptr == NULL) + { + sendto_one_numeric(source_p, ERR_NOSUCHCHANNEL, + form_str(ERR_NOSUCHCHANNEL), parv[2]); + return 0; + } + + /* TS is higher, drop it. */ + if(atol(parv[1]) > chptr->channelts) + return 0; + + if(IsServer(source_p)) + set_channel_mlock(client_p, source_p, chptr, parv[3], TRUE); + + return 0; +} + static int ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char *parv[]) { @@ -260,7 +296,7 @@ ms_bmask(struct Client *client_p, struct Client *source_p, int parc, const char case 'q': banlist = &chptr->quietlist; - mode_type = CHFL_QUIET; + mode_type = ModuleModes.CHFL_QUIET; mems = ALL_MEMBERS; break;