]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_sanick.cpp
m_services_account Fix possible recursion when checking 'U' extbans
[user/henk/code/inspircd.git] / src / modules / m_sanick.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
5  *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
6  *   Copyright (C) 2004-2005 Craig Edwards <craigedwards@brainbox.cc>
7  *
8  * This file is part of InspIRCd.  InspIRCd is free software: you can
9  * redistribute it and/or modify it under the terms of the GNU General Public
10  * License as published by the Free Software Foundation, version 2.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21
22 #include "inspircd.h"
23
24 /* $ModDesc: Provides support for SANICK command */
25
26 /** Handle /SANICK
27  */
28 class CommandSanick : public Command
29 {
30  public:
31         CommandSanick(Module* Creator) : Command(Creator,"SANICK", 2)
32         {
33                 flags_needed = 'o'; Penalty = 0; syntax = "<nick> <new-nick>";
34                 TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
35         }
36
37         CmdResult Handle (const std::vector<std::string>& parameters, User *user)
38         {
39                 User* target = ServerInstance->FindNick(parameters[0]);
40
41                 /* Do local sanity checks and bails */
42                 if (IS_LOCAL(user))
43                 {
44                         if (target && ServerInstance->ULine(target->server))
45                         {
46                                 user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Cannot use an SA command on a u-lined client",user->nick.c_str());
47                                 return CMD_FAILURE;
48                         }
49
50                         if (!target)
51                         {
52                                 user->WriteServ("NOTICE %s :*** No such nickname: '%s'", user->nick.c_str(), parameters[0].c_str());
53                                 return CMD_FAILURE;
54                         }
55
56                         if (!ServerInstance->IsNick(parameters[1].c_str(), ServerInstance->Config->Limits.NickMax))
57                         {
58                                 user->WriteServ("NOTICE %s :*** Invalid nickname '%s'", user->nick.c_str(), parameters[1].c_str());
59                                 return CMD_FAILURE;
60                         }
61                 }
62
63                 /* Have we hit target's server yet? */
64                 if (target && IS_LOCAL(target))
65                 {
66                         std::string oldnick = user->nick;
67                         std::string newnick = target->nick;
68                         if (target->ChangeNick(parameters[1], true))
69                         {
70                                 ServerInstance->SNO->WriteGlobalSno('a', oldnick+" used SANICK to change "+newnick+" to "+parameters[1]);
71                         }
72                         else
73                         {
74                                 ServerInstance->SNO->WriteGlobalSno('a', oldnick+" failed SANICK (from "+newnick+" to "+parameters[1]+")");
75                         }
76                 }
77
78                 return CMD_SUCCESS;
79         }
80
81         RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
82         {
83                 User* dest = ServerInstance->FindNick(parameters[0]);
84                 if (dest)
85                         return ROUTE_OPT_UCAST(dest->server);
86                 return ROUTE_LOCALONLY;
87         }
88 };
89
90
91 class ModuleSanick : public Module
92 {
93         CommandSanick cmd;
94  public:
95         ModuleSanick()
96                 : cmd(this)
97         {
98                 ServerInstance->AddCommand(&cmd);
99         }
100
101         virtual ~ModuleSanick()
102         {
103         }
104
105         virtual Version GetVersion()
106         {
107                 return Version("Provides support for SANICK command", VF_OPTCOMMON | VF_VENDOR);
108         }
109
110 };
111
112 MODULE_INIT(ModuleSanick)