]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/cmd_kill.cpp
Add const std::string &original_command to OnPreCommand and OnPostCommand, which...
[user/henk/code/inspircd.git] / src / cmd_kill.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 #include "configreader.h"
18 #include "users.h"
19 #include "modules.h"
20 #include "commands/cmd_kill.h"
21
22 extern "C" command_t* init_command(InspIRCd* Instance)
23 {
24         return new cmd_kill(Instance);
25 }
26
27 /** Handle /KILL
28  */
29 CmdResult cmd_kill::Handle (const char** parameters, int pcnt, userrec *user)
30 {
31         userrec *u = ServerInstance->FindNick(parameters[0]);
32         char killreason[MAXBUF];
33         int MOD_RESULT = 0;
34
35         ServerInstance->Log(DEBUG,"kill: %s %s", parameters[0], parameters[1]);
36
37         if (u)
38         {
39                 ServerInstance->Log(DEBUG, "into kill mechanism");
40                 FOREACH_RESULT(I_OnKill, OnKill(user, u, parameters[1]));
41
42                 if (MOD_RESULT)
43                 {
44                         ServerInstance->Log(DEBUG, "A module prevented the kill with result %d", MOD_RESULT);
45                         return CMD_FAILURE;
46                 }
47
48                 if (!IS_LOCAL(u))
49                 {
50                         // remote kill
51                         ServerInstance->SNO->WriteToSnoMask('k',"Remote kill by %s: %s!%s@%s (%s)", user->nick, u->nick, u->ident, u->host, parameters[1]);
52                         snprintf(killreason, MAXQUIT,"[%s] Killed (%s (%s))", ServerInstance->Config->ServerName, user->nick, parameters[1]);
53                         u->WriteCommonExcept("QUIT :%s", killreason);
54                         FOREACH_MOD(I_OnRemoteKill, OnRemoteKill(user, u, killreason));
55                         
56                         user_hash::iterator iter = ServerInstance->clientlist.find(u->nick);
57
58                         if (iter != ServerInstance->clientlist.end())
59                         {
60                                 ServerInstance->Log(DEBUG,"deleting user hash value %d", iter->second);
61                                 ServerInstance->clientlist.erase(iter);
62                         }
63
64                         if (u->registered == REG_ALL)
65                         {
66                                 u->PurgeEmptyChannels();
67                         }
68
69                         if (u == user)
70                         {
71                                 std::string original_command = std::string("KILL ") + u->nick + " :"+parameters[1];
72                                 FOREACH_MOD(I_OnPostCommand,OnPostCommand("KILL", parameters, pcnt, user, CMD_SUCCESS,original_command));
73                                 return CMD_USER_DELETED;
74                         }
75                         DELETE(u);
76                 }
77                 else
78                 {
79                         // local kill
80                         ServerInstance->Log(DEFAULT,"LOCAL KILL: %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
81                         user->WriteTo(u, "KILL %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
82                         ServerInstance->SNO->WriteToSnoMask('k',"Local Kill by %s: %s!%s@%s (%s)", user->nick, u->nick, u->ident, u->host, parameters[1]);
83                         snprintf(killreason,MAXQUIT,"Killed (%s (%s))", user->nick, parameters[1]);
84                         userrec::QuitUser(ServerInstance, u, killreason);
85                 }
86         }
87         else
88         {
89                 user->WriteServ( "401 %s %s :No such nick/channel", user->nick, parameters[0]);
90                 return CMD_FAILURE;
91         }
92
93         return CMD_SUCCESS;
94 }
95