X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_silence.cpp;h=c82ab3f9d6052ecf7c21f571bdfee029291b119a;hb=e5518238259b9988a2a6d8ef654b69034628c10d;hp=cbaab25475f25eebe3118f45747b9ca719c0f7b5;hpb=cd712c40e1b352c05e7ae0f72e0a5e84cdf64323;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_silence.cpp b/src/modules/m_silence.cpp index cbaab2547..c82ab3f9d 100644 --- a/src/modules/m_silence.cpp +++ b/src/modules/m_silence.cpp @@ -1,16 +1,26 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2006-2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2005-2007 Craig Edwards + * Copyright (C) 2006 John Brooks * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd 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, version 2. * - * --------------------------------------------------- + * 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, see . */ + #include "inspircd.h" /* $ModDesc: Provides support for the /SILENCE command */ @@ -56,7 +66,7 @@ class CommandSVSSilence : public Command CommandSVSSilence(Module* Creator) : Command(Creator,"SVSSILENCE", 2) { syntax = " {[+|-] }"; - TRANSLATE3(TR_NICK, TR_TEXT, TR_END); /* we watch for a nick. not a UID. */ + TRANSLATE4(TR_NICK, TR_TEXT, TR_TEXT, TR_END); /* we watch for a nick. not a UID. */ } CmdResult Handle (const std::vector& parameters, User *user) @@ -77,7 +87,7 @@ class CommandSVSSilence : public Command if (IS_LOCAL(u)) { - ServerInstance->Parser->CallHandler("SILENCE", std::vector(++parameters.begin(), parameters.end()), u); + ServerInstance->Parser->CallHandler("SILENCE", std::vector(parameters.begin() + 1, parameters.end()), u); } return CMD_SUCCESS; @@ -85,7 +95,10 @@ class CommandSVSSilence : public Command RouteDescriptor GetRouting(User* user, const std::vector& parameters) { - return ROUTE_BROADCAST; + User* target = ServerInstance->FindNick(parameters[0]); + if (target) + return ROUTE_OPT_UCAST(target->server); + return ROUTE_LOCALONLY; } }; @@ -97,6 +110,7 @@ class CommandSilence : public Command CommandSilence(Module* Creator, unsigned int &max) : Command(Creator, "SILENCE", 0), maxsilence(max), ext("silence_list", Creator) { + allow_empty_last_param = false; syntax = "{[+|-] }"; TRANSLATE3(TR_TEXT, TR_TEXT, TR_END); } @@ -112,7 +126,8 @@ class CommandSilence : public Command { for (silencelist::const_iterator c = sl->begin(); c != sl->end(); c++) { - user->WriteNumeric(271, "%s %s %s %s",user->nick.c_str(), user->nick.c_str(),c->first.c_str(), DecompPattern(c->second).c_str()); + std::string decomppattern = DecompPattern(c->second); + user->WriteNumeric(271, "%s %s %s %s",user->nick.c_str(), user->nick.c_str(),c->first.c_str(), decomppattern.c_str()); } } user->WriteNumeric(272, "%s :End of Silence List",user->nick.c_str()); @@ -132,6 +147,12 @@ class CommandSilence : public Command pattern = CompilePattern(parameters[1].c_str()); } + if (pattern == 0) + { + user->WriteServ("NOTICE %s :Bad SILENCE pattern",user->nick.c_str()); + return CMD_INVALID; + } + if (!mask.length()) { // 'SILENCE +' or 'SILENCE -', assume *!*@* @@ -142,6 +163,7 @@ class CommandSilence : public Command if (action == '-') { + std::string decomppattern = DecompPattern(pattern); // fetch their silence list silencelist* sl = ext.get(user); // does it contain any entries and does it exist? @@ -154,7 +176,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.c_str(), user->nick.c_str(), 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.c_str()); if (!sl->size()) { ext.unset(user); @@ -163,7 +185,7 @@ class CommandSilence : public Command } } } - 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()); + 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.c_str()); } else if (action == '+') { @@ -179,12 +201,14 @@ class CommandSilence : public Command user->WriteNumeric(952, "%s %s :Your silence list is full",user->nick.c_str(), user->nick.c_str()); return CMD_FAILURE; } + + std::string decomppattern = DecompPattern(pattern); for (silencelist::iterator n = sl->begin(); n != sl->end(); n++) { 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.c_str(), user->nick.c_str(), 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.c_str()); return CMD_FAILURE; } } @@ -196,7 +220,7 @@ class CommandSilence : public Command { sl->push_back(silenceset(mask,pattern)); } - 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()); + user->WriteNumeric(951, "%s %s :Added %s %s to silence list",user->nick.c_str(), user->nick.c_str(), mask.c_str(), decomppattern.c_str()); return CMD_SUCCESS; } } @@ -244,21 +268,24 @@ class CommandSilence : public Command std::string DecompPattern (const int pattern) { std::string out; - if ((pattern & SILENCE_PRIVATE) > 0) + if (pattern & SILENCE_PRIVATE) out += ",privatemessages"; - if ((pattern & SILENCE_CHANNEL) > 0) + if (pattern & SILENCE_CHANNEL) out += ",channelmessages"; - if ((pattern & SILENCE_INVITE) > 0) + if (pattern & SILENCE_INVITE) out += ",invites"; - if ((pattern & SILENCE_NOTICE) > 0) + if (pattern & SILENCE_NOTICE) out += ",privatenotices"; - if ((pattern & SILENCE_CNOTICE) > 0) + if (pattern & SILENCE_CNOTICE) out += ",channelnotices"; - if ((pattern & SILENCE_ALL) > 0) + if (pattern & SILENCE_ALL) out = ",all"; - if ((pattern & SILENCE_EXCLUDE) > 0) + if (pattern & SILENCE_EXCLUDE) out += ",exclude"; - return "<" + out.substr(1) + ">"; + if (out.length()) + return "<" + out.substr(1) + ">"; + else + return ""; } }; @@ -272,19 +299,23 @@ class ModuleSilence : public Module ModuleSilence() : maxsilence(32), cmdsilence(this, maxsilence), cmdsvssilence(this) + { + } + + void init() { OnRehash(NULL); - ServerInstance->AddCommand(&cmdsilence); - ServerInstance->AddCommand(&cmdsvssilence); + ServerInstance->Modules->AddService(cmdsilence); + ServerInstance->Modules->AddService(cmdsvssilence); + ServerInstance->Modules->AddService(cmdsilence.ext); Implementation eventlist[] = { I_OnRehash, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnUserPreInvite }; - ServerInstance->Modules->Attach(eventlist, this, 5); + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } void OnRehash(User* user) { - ConfigReader Conf; - maxsilence = Conf.ReadInteger("silence", "maxentries", 0, true); + maxsilence = ServerInstance->Config->ConfValue("silence")->getInt("maxentries", 32); if (!maxsilence) maxsilence = 32; } @@ -304,7 +335,7 @@ class ModuleSilence : public Module { if (IS_LOCAL(i->first)) { - if (MatchPattern(i->first, sender, public_silence) == MOD_RES_ALLOW) + if (MatchPattern(i->first, sender, public_silence) == MOD_RES_DENY) { exempt_list.insert(i->first); } @@ -368,7 +399,7 @@ class ModuleSilence : public Module Version GetVersion() { - return Version("Provides support for the /SILENCE command", VF_COMMON | VF_VENDOR); + return Version("Provides support for the /SILENCE command", VF_OPTCOMMON | VF_VENDOR); } };