X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_silence.cpp;h=d9ddb8c77a82b1c3dcb5e79f082fa031a3e0c83f;hb=f1712e6f0b58098250791ffc60815fa3fc462607;hp=2f1654016aa8c14b64dea0ea131f3f6c4d6b7e51;hpb=3c8b0ea13b84b52b95c7e0b17f1ddf208045d665;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_silence.cpp b/src/modules/m_silence.cpp index 2f1654016..d9ddb8c77 100644 --- a/src/modules/m_silence.cpp +++ b/src/modules/m_silence.cpp @@ -12,7 +12,6 @@ */ #include "inspircd.h" -#include "wildcard.h" /* $ModDesc: Provides support for the /SILENCE command */ @@ -51,6 +50,41 @@ static int SILENCE_ALL = 0x0020; /* a all, (pcint) */ static int SILENCE_EXCLUDE = 0x0040; /* x exclude this pattern */ +class CommandSVSSilence : public Command +{ + public: + CommandSVSSilence(InspIRCd* Instance) : Command(Instance,"SVSSILENCE", 0, 2) + { + this->source = "m_silence.so"; + syntax = " {[+|-] }"; + TRANSLATE3(TR_NICK, TR_TEXT, TR_END); /* we watch for a nick. not a UID. */ + } + + CmdResult Handle (const std::vector& parameters, User *user) + { + /* + * XXX: thought occurs to me + * We may want to change the syntax of this command to + * SVSSILENCE + - + + * style command so services can modify lots of entries at once. + * leaving it backwards compatible for now as it's late. -- w + */ + if (!ServerInstance->ULine(user->server)) + return CMD_FAILURE; + + User *u = ServerInstance->FindNick(parameters[0]); + if (!u) + return CMD_FAILURE; + + if (IS_LOCAL(u)) + { + ServerInstance->Parser->CallHandler("SILENCE", std::vector(++parameters.begin(), parameters.end()), u); + } + + return CMD_SUCCESS; + } +}; + class CommandSilence : public Command { unsigned int& maxsilence; @@ -62,9 +96,9 @@ class CommandSilence : public Command TRANSLATE3(TR_TEXT, TR_TEXT, TR_END); } - CmdResult Handle (const char* const* parameters, int pcnt, User *user) + CmdResult Handle (const std::vector& parameters, User *user) { - if (!pcnt) + if (!parameters.size()) { // no parameters, show the current silence list. // Use Extensible::GetExt to fetch the silence list @@ -75,32 +109,32 @@ class CommandSilence : public Command { for (silencelist::const_iterator c = sl->begin(); c != sl->end(); c++) { - user->WriteNumeric(271, "%s %s %s %s",user->nick, user->nick,c->first.c_str(), DecompPattern(c->second).c_str()); + user->WriteNumeric(271, "%s %s %s %s",user->nick.c_str(), user->nick.c_str(),c->first.c_str(), DecompPattern(c->second).c_str()); } } - user->WriteNumeric(272, "%s :End of Silence List",user->nick); + user->WriteNumeric(272, "%s :End of Silence List",user->nick.c_str()); return CMD_LOCALONLY; } - else if (pcnt > 0) + else if (parameters.size() > 0) { // one or more parameters, add or delete entry from the list (only the first parameter is used) - std::string mask = parameters[0] + 1; - char action = *parameters[0]; + std::string mask = parameters[0].substr(1); + char action = parameters[0][0]; // Default is private and notice so clients do not break int pattern = CompilePattern("pn"); // if pattern supplied, use it - if (pcnt > 1) { - pattern = CompilePattern(parameters[1]); + if (parameters.size() > 1) { + pattern = CompilePattern(parameters[1].c_str()); } - + if (!mask.length()) { // 'SILENCE +' or 'SILENCE -', assume *!*@* mask = "*!*@*"; } - + ModeParser::CleanMask(mask); if (action == '-') @@ -118,7 +152,7 @@ class CommandSilence : public Command if (listitem == mask && i->second == pattern) { sl->erase(i); - user->WriteNumeric(950, "%s %s :Removed %s %s from silence list",user->nick, user->nick, mask.c_str(), DecompPattern(pattern).c_str()); + user->WriteNumeric(950, "%s %s :Removed %s %s from silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str()); if (!sl->size()) { delete sl; @@ -128,7 +162,7 @@ class CommandSilence : public Command } } } - user->WriteNumeric(952, "%s %s :%s %s does not exist on your silence list",user->nick, user->nick, mask.c_str(), DecompPattern(pattern).c_str()); + user->WriteNumeric(952, "%s %s :%s %s does not exist on your silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str()); } else if (action == '+') { @@ -143,7 +177,7 @@ class CommandSilence : public Command } if (sl->size() > maxsilence) { - user->WriteNumeric(952, "%s %s :Your silence list is full",user->nick, user->nick); + user->WriteNumeric(952, "%s %s :Your silence list is full",user->nick.c_str(), user->nick.c_str()); return CMD_FAILURE; } for (silencelist::iterator n = sl->begin(); n != sl->end(); n++) @@ -151,7 +185,7 @@ class CommandSilence : public Command irc::string listitem = n->first.c_str(); if (listitem == mask && n->second == pattern) { - user->WriteNumeric(952, "%s %s :%s %s is already on your silence list",user->nick, user->nick, mask.c_str(), DecompPattern(pattern).c_str()); + user->WriteNumeric(952, "%s %s :%s %s is already on your silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str()); return CMD_FAILURE; } } @@ -163,7 +197,7 @@ class CommandSilence : public Command { sl->push_back(silenceset(mask,pattern)); } - user->WriteNumeric(951, "%s %s :Added %s %s to silence list",user->nick, user->nick, mask.c_str(), DecompPattern(pattern).c_str()); + user->WriteNumeric(951, "%s %s :Added %s %s to silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), DecompPattern(pattern).c_str()); return CMD_SUCCESS; } } @@ -184,7 +218,7 @@ class CommandSilence : public Command case 'c': p |= SILENCE_CHANNEL; break; - case 'i': + case 'i': p |= SILENCE_INVITE; break; case 'n': @@ -232,16 +266,20 @@ class CommandSilence : public Command class ModuleSilence : public Module { - CommandSilence* mycommand; + CommandSilence* cmdsilence; + CommandSVSSilence *cmdsvssilence; unsigned int maxsilence; public: - + ModuleSilence(InspIRCd* Me) : Module(Me), maxsilence(32) { OnRehash(NULL, ""); - mycommand = new CommandSilence(ServerInstance,maxsilence); - ServerInstance->AddCommand(mycommand); + cmdsilence = new CommandSilence(ServerInstance,maxsilence); + cmdsvssilence = new CommandSVSSilence(ServerInstance); + ServerInstance->AddCommand(cmdsilence); + ServerInstance->AddCommand(cmdsvssilence); + Implementation eventlist[] = { I_OnRehash, I_OnBuildExemptList, I_OnUserQuit, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnUserPreInvite }; ServerInstance->Modules->Attach(eventlist, this, 7); } @@ -342,13 +380,17 @@ class ModuleSilence : public Module int MatchPattern(User* dest, User* source, int pattern) { + /* Server source */ + if (!source || !dest) + return 1; + silencelist* sl; dest->GetExt("silence_list", sl); if (sl) { for (silencelist::const_iterator c = sl->begin(); c != sl->end(); c++) { - if (((((c->second & pattern) > 0)) || ((c->second & SILENCE_ALL) > 0)) && (ServerInstance->MatchText(source->GetFullHost(), c->first))) + if (((((c->second & pattern) > 0)) || ((c->second & SILENCE_ALL) > 0)) && (InspIRCd::Match(source->GetFullHost(), c->first))) return !(((c->second & SILENCE_EXCLUDE) > 0)); } } @@ -358,10 +400,10 @@ class ModuleSilence : public Module virtual ~ModuleSilence() { } - + virtual Version GetVersion() { - return Version(1, 2, 0, 1, VF_COMMON | VF_VENDOR, API_VERSION); + return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION); } };