]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/cmd_kill.cpp
Snomasks +k (kills) and +o (oper)
[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 <vector>
18 #include "inspircd_config.h"
19 #include "hash_map.h"
20 #include "configreader.h"
21 #include "users.h"
22 #include "modules.h"
23 #include "commands.h"
24
25 #include "commands/cmd_kill.h"
26
27
28
29 void 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;
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                         DELETE(u);
70                 }
71                 else
72                 {
73                         // local kill
74                         ServerInstance->Log(DEFAULT,"LOCAL KILL: %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
75                         user->WriteTo(u, "KILL %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
76                         ServerInstance->SNO->WriteToSnoMask('k',"Local Kill by %s: %s!%s@%s (%s)", user->nick, u->nick, u->ident, u->host, parameters[1]);
77                         snprintf(killreason,MAXQUIT,"Killed (%s (%s))", user->nick, parameters[1]);
78                         userrec::QuitUser(ServerInstance, u, killreason);
79                 }
80         }
81         else
82         {
83                 user->WriteServ( "401 %s %s :No such nick/channel", user->nick, parameters[0]);
84         }
85 }
86