diff --git a/Changes b/Changes index c5be3d02e..a5777be9c 100644 --- a/Changes +++ b/Changes @@ -1948,3 +1948,5 @@ seen. gmtime warning still there - Made set::allow-userhost-change force-rejoin work. - Fixed chmode +u bug when chanop was parting but wasn't sent to normal users. - Added allow-userhost-change checks to /vhost. +- Added SVSWATCH: allows U-lined server to modify the watch list of a user. +- Added SVSSILENCE: allows U-lined server to modify the silence list of a user. diff --git a/help.conf b/help.conf index 03ccd0583..c931c522f 100644 --- a/help.conf +++ b/help.conf @@ -69,8 +69,8 @@ help Svscmds { " a specific command."; " -"; " ==-----------oOo-----------=="; - " SVSNICK SVSMODE SVSKILL"; - " SVSNOOP SVSJOIN SVSPART"; + " SVSNICK SVSMODE SVSKILL SVSWATCH"; + " SVSNOOP SVSJOIN SVSPART SVSSILENCE"; " SVSO SWHOIS SQLINE SVSNLINE"; " UNSQLINE SVS2MODE SVSFLINE"; " SVSMOTD SVSTIME SVSLUSERS"; @@ -1117,3 +1117,18 @@ help Svslusers { " Example: SVSLUSERS irc.test.com -1 200"; }; +help Svswatch { + " Changes the WATCH list of a user."; + " Must be sent trough an U:Lined server."; + " Syntax: SVSWATCH :"; + " Example: SVSWATCH Blah :+Blih!*@* +Bluh!*@* +Bleh!*@*.com"; +}; + +help Svssilence { + " Changes the SILENCE list of a user."; + " Must be sent trough an U:Lined server."; + " In contrast to the SILENCE command, you can add/remove"; + " multiple entries in one line."; + " Syntax: SVSSILENCE :"; + " Example: SILENCE Blah :+*!*@*.com +*!*@*.bla.co.uk"; +}; diff --git a/include/h.h b/include/h.h index cb41ee818..b091db40a 100644 --- a/include/h.h +++ b/include/h.h @@ -180,6 +180,7 @@ extern void set_snomask(aClient *sptr, char *snomask); extern char *get_sno_str(aClient *sptr); /* for services */ extern void del_invite(aClient *, aChannel *); +extern int add_silence(aClient *, char *, int); extern int del_silence(aClient *, char *); extern void send_user_joins(aClient *, aClient *); extern void clean_channelname(char *); diff --git a/makefile.win32 b/makefile.win32 index 78a4cc431..addae8a7b 100644 --- a/makefile.win32 +++ b/makefile.win32 @@ -47,7 +47,8 @@ MOD_FILES=SRC/L_COMMANDS.OBJ SRC/M_CHGHOST.OBJ SRC/M_SDESC.OBJ SRC/M_SETIDENT.OB SRC/M_SQLINE.OBJ SRC/M_KILL.OBJ SRC/M_TSCTL.OBJ SRC/M_UNKLINE.OBJ \ SRC/M_UNSQLINE.OBJ SRC/M_UNZLINE.OBJ SRC/M_WHOIS.OBJ \ SRC/SCAN.OBJ SRC/SCAN_SOCKS.OBJ SRC/SCAN_HTTP.OBJ SRC/M_TKL.OBJ SRC/M_VHOST.OBJ \ - SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ + SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ \ + SRC/M_SVSWATCH.OBJ SRC/M_SVSSILENCE.OBJ ALL: CONF UNREAL.EXE WIRCD.EXE @@ -365,6 +366,12 @@ src/m_svspart.obj: src/modules/m_svspart.c $(INCLUDES) src/m_svslusers.obj: src/modules/m_svslusers.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/m_svslusers.c +src/m_svswatch.obj: src/modules/m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svswatch.c + +src/m_svssilence.obj: src/modules/m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svssilence.c + src/scan.obj: src/modules/scan.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/scan.c diff --git a/makefile.win32.ssl b/makefile.win32.ssl index c9687cbe5..90baaa071 100644 --- a/makefile.win32.ssl +++ b/makefile.win32.ssl @@ -50,7 +50,8 @@ MOD_FILES=SRC/L_COMMANDS.OBJ SRC/M_CHGHOST.OBJ SRC/M_SDESC.OBJ SRC/M_SETIDENT.OB SRC/M_SQLINE.OBJ SRC/M_KILL.OBJ SRC/M_TSCTL.OBJ SRC/M_UNKLINE.OBJ \ SRC/M_UNSQLINE.OBJ SRC/M_UNZLINE.OBJ SRC/M_WHOIS.OBJ \ SRC/SCAN.OBJ SRC/SCAN_SOCKS.OBJ SRC/SCAN_HTTP.OBJ SRC/M_TKL.OBJ SRC/M_VHOST.OBJ \ - SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ + SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ \ + SRC/M_SVSWATCH.OBJ SRC/M_SVSSILENCE.OBJ ALL: CONF UNREAL.EXE WIRCD.EXE @@ -368,6 +369,12 @@ src/m_svspart.obj: src/modules/m_svspart.c $(INCLUDES) src/m_svslusers.obj: src/modules/m_svslusers.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/m_svslusers.c +src/m_svswatch.obj: src/modules/m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svswatch.c + +src/m_svssilence.obj: src/modules/m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svssilence.c + src/scan.obj: src/modules/scan.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/scan.c diff --git a/makefile.win32.ssl.ziplink b/makefile.win32.ssl.ziplink index d9cc45d70..ca231ebcc 100644 --- a/makefile.win32.ssl.ziplink +++ b/makefile.win32.ssl.ziplink @@ -57,7 +57,8 @@ MOD_FILES=SRC/L_COMMANDS.OBJ SRC/M_CHGHOST.OBJ SRC/M_SDESC.OBJ SRC/M_SETIDENT.OB SRC/M_SQLINE.OBJ SRC/M_KILL.OBJ SRC/M_TSCTL.OBJ SRC/M_UNKLINE.OBJ \ SRC/M_UNSQLINE.OBJ SRC/M_UNZLINE.OBJ SRC/M_WHOIS.OBJ \ SRC/SCAN.OBJ SRC/SCAN_SOCKS.OBJ SRC/SCAN_HTTP.OBJ SRC/M_TKL.OBJ SRC/M_VHOST.OBJ \ - SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ + SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ \ + SRC/M_SVSWATCH.OBJ SRC/M_SVSSILENCE.OBJ ALL: CONF UNREAL.EXE WIRCD.EXE @@ -378,6 +379,12 @@ src/m_svspart.obj: src/modules/m_svspart.c $(INCLUDES) src/m_svslusers.obj: src/modules/m_svslusers.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/m_svslusers.c +src/m_svswatch.obj: src/modules/m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svswatch.c + +src/m_svssilence.obj: src/modules/m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svssilence.c + src/scan.obj: src/modules/scan.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/scan.c diff --git a/makefile.win32.ziplink b/makefile.win32.ziplink index fac0b149e..645283d9b 100644 --- a/makefile.win32.ziplink +++ b/makefile.win32.ziplink @@ -52,7 +52,8 @@ MOD_FILES=SRC/L_COMMANDS.OBJ SRC/M_CHGHOST.OBJ SRC/M_SDESC.OBJ SRC/M_SETIDENT.OB SRC/M_SQLINE.OBJ SRC/M_KILL.OBJ SRC/M_TSCTL.OBJ SRC/M_UNKLINE.OBJ \ SRC/M_UNSQLINE.OBJ SRC/M_UNZLINE.OBJ SRC/M_WHOIS.OBJ \ SRC/SCAN.OBJ SRC/SCAN_SOCKS.OBJ SRC/SCAN_HTTP.OBJ SRC/M_TKL.OBJ SRC/M_VHOST.OBJ \ - SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ + SRC/M_CYCLE.OBJ SRC/M_SVSJOIN.OBJ SRC/M_SVSPART.OBJ SRC/M_SVSLUSERS.OBJ \ + SRC/M_SVSWATCH.OBJ SRC/M_SVSSILENCE.OBJ ALL: CONF UNREAL.EXE WIRCD.EXE @@ -373,6 +374,12 @@ src/m_svspart.obj: src/modules/m_svspart.c $(INCLUDES) src/m_svslusers.obj: src/modules/m_svslusers.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/m_svslusers.c +src/m_svswatch.obj: src/modules/m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svswatch.c + +src/m_svssilence.obj: src/modules/m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) src/modules/m_svssilence.c + src/scan.obj: src/modules/scan.c $(INCLUDES) $(CC) $(CFLAGS) src/modules/scan.c diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in index d7cfdbf20..307ebf162 100644 --- a/src/modules/Makefile.in +++ b/src/modules/Makefile.in @@ -33,7 +33,7 @@ R_MODULES=m_sethost.so m_chghost.so m_chgident.so m_setname.so \ m_quit.so m_rakill.so m_rping.so m_sendumode.so m_sqline.so \ m_tsctl.so m_unkline.so m_unsqline.so m_unzline.so m_whois.so \ m_tkl.so m_vhost.so m_cycle.so m_svsjoin.so m_svspart.so \ - scan.so scan_socks.so scan_http.so web/httpd.so + m_svswatch.so m_svssilence.so scan.so scan_socks.so scan_http.so web/httpd.so COMMANDS=m_sethost.c m_chghost.c m_chgident.c m_setname.c m_setident.c \ m_sdesc.c m_svsmode.c m_swhois.c m_svsmotd.c m_svsnline.c \ @@ -43,7 +43,7 @@ COMMANDS=m_sethost.c m_chghost.c m_chgident.c m_setname.c m_setident.c \ m_quit.c m_rakill.c m_rping.c m_sendumode.c m_sqline.c \ m_tsctl.c m_unkline.c m_unsqline.c m_unzline.c m_whois.c \ m_tkl.c m_vhost.c m_cycle.c m_svsjoin.c m_svspart.c \ - m_svslusers.c + m_svslusers.c m_svswatch.c m_svssilence.c MODULES=commands.so $(R_MODULES) @@ -233,6 +233,14 @@ m_svslusers.so: m_svslusers.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o m_svslusers.so m_svslusers.c +m_svswatch.so: m_svswatch.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ + -o m_svswatch.so m_svswatch.c + +m_svssilence.so: m_svssilence.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ + -o m_svssilence.so m_svssilence.c + scan.so: scan.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o scan.so scan.c diff --git a/src/modules/l_commands.c b/src/modules/l_commands.c index a0d034170..188086a3f 100644 --- a/src/modules/l_commands.c +++ b/src/modules/l_commands.c @@ -93,6 +93,7 @@ extern int m_unzline_Init(ModuleInfo *modinfo), m_unkline_Init(ModuleInfo *modin extern int m_sqline_Init(ModuleInfo *modinfo), m_unsqline_Init(ModuleInfo *modinfo), m_tkl_Init(ModuleInfo *modinfo); extern int m_vhost_Init(ModuleInfo *modinfo), m_cycle_Init(ModuleInfo *modinfo), m_svsjoin_Init(ModuleInfo *modinfo); extern int m_svspart_Init(ModuleInfo *modinfo), m_svslusers_Init(ModuleInfo *modinfo); +extern int m_svswatch_Init(ModuleInfo *modinfo), m_svssilence_Init(ModuleInfo *modinfo); #ifdef GUEST extern int m_guest_Init(ModuleInfo *modinfo); #endif @@ -115,6 +116,7 @@ extern int m_unzline_Load(int module_load), m_unkline_Load(int module_load); extern int m_sqline_Load(int module_load), m_unsqline_Load(int module_load), m_tkl_Load(int module_load); extern int m_vhost_Load(int module_load), m_cycle_Load(int module_load), m_svsjoin_Load(int module_load); extern int m_svspart_Load(int module_load), m_svslusers_Load(int module_load); +extern int m_svswatch_Load(int module_load), m_svssilence_Load(int module_load); #ifdef GUEST extern int m_guest_Load(int module_load); #endif @@ -133,6 +135,7 @@ extern int m_pingpong_Unload(), m_oper_Unload(), m_akill_Unload(), m_rakill_Unlo extern int m_unzline_Unload(), m_unkline_Unload(); extern int m_sqline_Unload(), m_unsqline_Unload(), m_tkl_Unload(), m_vhost_Unload(); extern int m_cycle_Unload(), m_svsjoin_Unload(), m_svspart_Unload(), m_svslusers_Unload(); +extern int m_svswatch_Unload(), m_svssilence_Unload(); #ifdef GUEST extern int m_guest_Unload(); #endif @@ -218,6 +221,8 @@ int l_commands_Init(ModuleInfo *modinfo) m_cycle_Init(&ModCmdsInfo); m_svsjoin_Init(&ModCmdsInfo); m_svspart_Init(&ModCmdsInfo); + m_svswatch_Init(&ModCmdsInfo); + m_svssilence_Init(&ModCmdsInfo); m_svslusers_Init(&ModCmdsInfo); #ifdef GUEST m_guest_Init(&ModCmdsInfo); @@ -276,6 +281,8 @@ int l_commands_Load(int module_load) m_cycle_Load(module_load); m_svsjoin_Load(module_load); m_svspart_Load(module_load); + m_svswatch_Load(module_load); + m_svssilence_Load(module_load); m_svslusers_Load(module_load); #ifdef GUEST m_guest_Load(module_load); @@ -335,6 +342,8 @@ int l_commands_Unload(int module_unload) m_cycle_Unload(); m_svsjoin_Unload(); m_svspart_Unload(); + m_svswatch_Unload(); + m_svssilence_Unload(); m_svslusers_Unload(); #ifdef GUEST m_guest_Unload(); diff --git a/src/modules/m_svssilence.c b/src/modules/m_svssilence.c new file mode 100644 index 000000000..8d1b2f974 --- /dev/null +++ b/src/modules/m_svssilence.c @@ -0,0 +1,161 @@ +/* + * Unreal Internet Relay Chat Daemon, src/modules/m_svssilence.c + * (C) 2003 Bram Matthys (Syzop) and the UnrealIRCd Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include "h.h" +#include "proto.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif + +DLLFUNC int m_svssilence(aClient *cptr, aClient *sptr, int parc, char *parv[]); + +/* Place includes here */ +#define MSG_SVSSILENCE "SVSSILENCE" +#define TOK_SVSSILENCE "Bs" + +#ifndef DYNAMIC_LINKING +ModuleHeader m_svssilence_Header +#else +#define m_svssilence_Header Mod_Header +ModuleHeader Mod_Header +#endif + = { + "svssilence", /* Name of module */ + "$Id$", /* Version */ + "command /svssilence", /* Short description of module */ + "3.2-b8-1", + NULL + }; + + +/* The purpose of these ifdefs, are that we can "static" link the ircd if we + * want to +*/ + +/* This is called on module init, before Server Ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Init(ModuleInfo *modinfo) +#else +int m_svssilence_Init(ModuleInfo *modinfo) +#endif +{ + /* + * We call our add_Command crap here + */ + add_Command(MSG_SVSSILENCE, TOK_SVSSILENCE, m_svssilence, MAXPARA); + return MOD_SUCCESS; + +} + +/* Is first run when server is 100% ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Load(int module_load) +#else +int m_svssilence_Load(int module_load) +#endif +{ + return MOD_SUCCESS; + +} + + +/* Called when module is unloaded */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Unload(int module_unload) +#else +int m_svssilence_Unload(int module_unload) +#endif +{ + if (del_Command(MSG_SVSSILENCE, TOK_SVSSILENCE, m_svssilence) < 0) + { + sendto_realops("Failed to delete commands when unloading %s", + m_svssilence_Header.name); + } + return MOD_SUCCESS; +} + +/* m_svssilence() + * written by Syzop (copied a lot from m_silence), + * suggested by . + * parv[0] - sender + * parv[1] - target nick + * parv[2] - space delimited silence list (+Blah +Blih -Bluh etc) + * SERVER DISTRIBUTION: + * In contrast to the normal SILENCE command, this is sent to all servers + * because it can/will add&remove multiple silence entries at once. + */ +CMD_FUNC(m_svssilence) +{ + aClient *acptr; + int mine; + char *p, *cp, c; + + if (!IsULine(sptr)) + return 0; + + if (parc < 3 || BadPtr(parv[2]) || !(acptr = find_person(parv[1], NULL))) + return 0; + + sendto_serv_butone_token(sptr, parv[0], MSG_SVSSILENCE, TOK_SVSSILENCE, "%s :%s", parv[1], parv[2]); + + mine = MyClient(acptr) ? 1 : 0; + + for (p = strtok(parv[2], " "); p; p = strtok(NULL, " ")) + { + c = *p; + if ((c == '-') || (c == '+')) + p++; + else if (!(index(p, '@') || index(p, '.') || + index(p, '!') || index(p, '*'))) + { + /* "no such nick" */ + continue; + } + else + c = '+'; + cp = pretty_mask(p); + if ((c == '-' && !del_silence(acptr, cp)) || + (c != '-' && !add_silence(acptr, cp, 0))) + { + if (mine) + sendto_prefix_one(acptr, acptr, ":%s SILENCE %c%s", parv[0], c, cp); + } + } + return 0; +} diff --git a/src/modules/m_svswatch.c b/src/modules/m_svswatch.c new file mode 100644 index 000000000..645281031 --- /dev/null +++ b/src/modules/m_svswatch.c @@ -0,0 +1,137 @@ +/* + * Unreal Internet Relay Chat Daemon, src/modules/m_svswatch.c + * (C) 2003 Bram Matthys (Syzop) and the UnrealIRCd Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 1, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "config.h" +#include "struct.h" +#include "common.h" +#include "sys.h" +#include "numeric.h" +#include "msg.h" +#include "channel.h" +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include "h.h" +#include "proto.h" +#ifdef STRIPBADWORDS +#include "badwords.h" +#endif +#ifdef _WIN32 +#include "version.h" +#endif + +DLLFUNC int m_svswatch(aClient *cptr, aClient *sptr, int parc, char *parv[]); + +/* Place includes here */ +#define MSG_SVSWATCH "SVSWATCH" +#define TOK_SVSWATCH "BW" + +#ifndef DYNAMIC_LINKING +ModuleHeader m_svswatch_Header +#else +#define m_svswatch_Header Mod_Header +ModuleHeader Mod_Header +#endif + = { + "svswatch", /* Name of module */ + "$Id$", /* Version */ + "command /svswatch", /* Short description of module */ + "3.2-b8-1", + NULL + }; + + +/* The purpose of these ifdefs, are that we can "static" link the ircd if we + * want to +*/ + +/* This is called on module init, before Server Ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Init(ModuleInfo *modinfo) +#else +int m_svswatch_Init(ModuleInfo *modinfo) +#endif +{ + /* + * We call our add_Command crap here + */ + add_Command(MSG_SVSWATCH, TOK_SVSWATCH, m_svswatch, MAXPARA); + return MOD_SUCCESS; + +} + +/* Is first run when server is 100% ready */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Load(int module_load) +#else +int m_svswatch_Load(int module_load) +#endif +{ + return MOD_SUCCESS; + +} + + +/* Called when module is unloaded */ +#ifdef DYNAMIC_LINKING +DLLFUNC int Mod_Unload(int module_unload) +#else +int m_svswatch_Unload(int module_unload) +#endif +{ + if (del_Command(MSG_SVSWATCH, TOK_SVSWATCH, m_svswatch) < 0) + { + sendto_realops("Failed to delete commands when unloading %s", + m_svswatch_Header.name); + } + return MOD_SUCCESS; +} + +/* m_svswatch() - written by Syzop, suggested by Griever. + * parv[0] - sender + * parv[1] - target nick + * parv[2] - parameters + */ +CMD_FUNC(m_svswatch) +{ + aClient *acptr; + if (!IsULine(sptr)) + return 0; + + if (parc < 3 || BadPtr(parv[2]) || !(acptr = find_person(parv[1], NULL))) + return 0; + + if (MyClient(acptr)) + { + parv[0] = parv[1]; + parv[1] = parv[2]; + (void)m_watch(acptr, acptr, 2, parv); + } + else + sendto_one(acptr, ":%s SVSWATCH %s :%s", parv[0], parv[1], parv[2]); + + return 0; +} diff --git a/src/s_user.c b/src/s_user.c index f22768dc0..96db74ea2 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -2705,7 +2705,7 @@ int del_silence(aClient *sptr, char *mask) return -1; } -static int add_silence(aClient *sptr, char *mask) +int add_silence(aClient *sptr, char *mask, int senderr) { Link *lp; int cnt = 0, len = 0; @@ -2716,8 +2716,8 @@ static int add_silence(aClient *sptr, char *mask) if (MyClient(sptr)) if ((len > MAXSILELENGTH) || (++cnt >= MAXSILES)) { - sendto_one(sptr, err_str(ERR_SILELISTFULL), - me.name, sptr->name, mask); + if (senderr) + sendto_one(sptr, err_str(ERR_SILELISTFULL), me.name, sptr->name, mask); return -1; } else @@ -2784,7 +2784,7 @@ CMD_FUNC(m_silence) c = '+'; cp = pretty_mask(cp); if ((c == '-' && !del_silence(sptr, cp)) || - (c != '-' && !add_silence(sptr, cp))) + (c != '-' && !add_silence(sptr, cp, 1))) { sendto_prefix_one(sptr, sptr, ":%s SILENCE %c%s", parv[0], c, cp); @@ -2809,7 +2809,7 @@ CMD_FUNC(m_silence) } else { - (void)add_silence(sptr, parv[2]); + (void)add_silence(sptr, parv[2], 1); if (!MyClient(acptr)) sendto_one(acptr, ":%s SILENCE %s :%s", parv[0], parv[1], parv[2]);