]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_silence.cpp
m_spanningtree SVSNICK needs 3 parameters
[user/henk/code/inspircd.git] / src / modules / m_silence.cpp
index eae6bf35c383849b4df9075f2db352a724433360..81e4bc3d8d9714c55c5cea7748db2949bd82acde 100644 (file)
@@ -1,16 +1,26 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ *   Copyright (C) 2005-2007 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2006 John Brooks <john.brooks@dereferenced.net>
  *
- * 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 <http://www.gnu.org/licenses/>.
  */
 
+
 #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 = "<target> {[+|-]<mask> <p|c|i|n|t|a|x>}";
-               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<std::string>& parameters, User *user)
@@ -85,7 +95,10 @@ class CommandSVSSilence : public Command
 
        RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
        {
-               return ROUTE_BROADCAST;
+               User* target = ServerInstance->FindNick(parameters[0]);
+               if (target)
+                       return ROUTE_OPT_UCAST(target->server);
+               return ROUTE_LOCALONLY;
        }
 };
 
@@ -112,7 +125,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 +146,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 +162,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 +175,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 +184,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 +200,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 +219,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 +267,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 "<none>";
        }
 
 };
@@ -276,9 +302,10 @@ class ModuleSilence : public Module
                OnRehash(NULL);
                ServerInstance->AddCommand(&cmdsilence);
                ServerInstance->AddCommand(&cmdsvssilence);
+               ServerInstance->Extensions.Register(&cmdsilence.ext);
 
-               Implementation eventlist[] = { I_OnRehash, I_OnBuildExemptList, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnUserPreInvite };
-               ServerInstance->Modules->Attach(eventlist, this, 6);
+               Implementation eventlist[] = { I_OnRehash, I_On005Numeric, I_OnUserPreNotice, I_OnUserPreMessage, I_OnUserPreInvite };
+               ServerInstance->Modules->Attach(eventlist, this, 5);
        }
 
        void OnRehash(User* user)
@@ -304,7 +331,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 +395,7 @@ class ModuleSilence : public Module
 
        Version GetVersion()
        {
-               return Version("Provides support for the /SILENCE command", VF_COMMON | VF_VENDOR, API_VERSION);
+               return Version("Provides support for the /SILENCE command", VF_OPTCOMMON | VF_VENDOR);
        }
 };