]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_sanick.cpp
Switch <stdint.h> test to use a test file too.
[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                 allow_empty_last_param = false;
34                 flags_needed = 'o'; Penalty = 0; syntax = "<nick> <new-nick>";
35                 TRANSLATE3(TR_NICK, TR_TEXT, TR_END);
36         }
37
38         CmdResult Handle (const std::vector<std::string>& parameters, User *user)
39         {
40                 User* target = ServerInstance->FindNick(parameters[0]);
41
42                 /* Do local sanity checks and bails */
43                 if (IS_LOCAL(user))
44                 {
45                         if (target && ServerInstance->ULine(target->server))
46                         {
47                                 user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Cannot use an SA command on a u-lined client",user->nick.c_str());
48                                 return CMD_FAILURE;
49                         }
50
51                         if ((!target) || (target->registered != REG_ALL))
52                         {
53                                 user->WriteServ("NOTICE %s :*** No such nickname: '%s'", user->nick.c_str(), parameters[0].c_str());
54                                 return CMD_FAILURE;
55                         }
56
57                         if (!ServerInstance->IsNick(parameters[1].c_str(), ServerInstance->Config->Limits.NickMax))
58                         {
59                                 user->WriteServ("NOTICE %s :*** Invalid nickname '%s'", user->nick.c_str(), parameters[1].c_str());
60                                 return CMD_FAILURE;
61                         }
62                 }
63
64                 /* Have we hit target's server yet? */
65                 if (target && IS_LOCAL(target))
66                 {
67                         std::string oldnick = user->nick;
68                         std::string newnick = target->nick;
69                         if (target->ChangeNick(parameters[1], true))
70                         {
71                                 ServerInstance->SNO->WriteGlobalSno('a', oldnick+" used SANICK to change "+newnick+" to "+parameters[1]);
72                         }
73                         else
74                         {
75                                 ServerInstance->SNO->WriteGlobalSno('a', oldnick+" failed SANICK (from "+newnick+" to "+parameters[1]+")");
76                         }
77                 }
78
79                 return CMD_SUCCESS;
80         }
81
82         RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
83         {
84                 User* dest = ServerInstance->FindNick(parameters[0]);
85                 if (dest)
86                         return ROUTE_OPT_UCAST(dest->server);
87                 return ROUTE_LOCALONLY;
88         }
89 };
90
91
92 class ModuleSanick : public Module
93 {
94         CommandSanick cmd;
95  public:
96         ModuleSanick()
97                 : cmd(this)
98         {
99         }
100
101         void init()
102         {
103                 ServerInstance->Modules->AddService(cmd);
104         }
105
106         virtual ~ModuleSanick()
107         {
108         }
109
110         virtual Version GetVersion()
111         {
112                 return Version("Provides support for SANICK command", VF_OPTCOMMON | VF_VENDOR);
113         }
114
115 };
116
117 MODULE_INIT(ModuleSanick)