]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/cmd_kill.cpp
Put some client quit stuff in cmd_quit into the Qq snomasks properly
[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 void cmd_kill::Handle (const char** parameters, int pcnt, userrec *user)
23 {
24         userrec *u = ServerInstance->FindNick(parameters[0]);
25         char killreason[MAXBUF];
26         int MOD_RESULT = 0;
27
28         ServerInstance->Log(DEBUG,"kill: %s %s", parameters[0], parameters[1]);
29
30         if (u)
31         {
32                 ServerInstance->Log(DEBUG, "into kill mechanism");
33                 FOREACH_RESULT(I_OnKill, OnKill(user, u, parameters[1]));
34
35                 if (MOD_RESULT)
36                 {
37                         ServerInstance->Log(DEBUG, "A module prevented the kill with result %d", MOD_RESULT);
38                         return;
39                 }
40
41                 if (!IS_LOCAL(u))
42                 {
43                         // remote kill
44                         ServerInstance->SNO->WriteToSnoMask('k',"Remote kill by %s: %s!%s@%s (%s)", user->nick, u->nick, u->ident, u->host, parameters[1]);
45                         snprintf(killreason, MAXQUIT,"[%s] Killed (%s (%s))", ServerInstance->Config->ServerName, user->nick, parameters[1]);
46                         u->WriteCommonExcept("QUIT :%s", killreason);
47                         FOREACH_MOD(I_OnRemoteKill, OnRemoteKill(user, u, killreason));
48                         
49                         user_hash::iterator iter = ServerInstance->clientlist.find(u->nick);
50
51                         if (iter != ServerInstance->clientlist.end())
52                         {
53                                 ServerInstance->Log(DEBUG,"deleting user hash value %d", iter->second);
54                                 ServerInstance->clientlist.erase(iter);
55                         }
56
57                         if (u->registered == REG_ALL)
58                         {
59                                 u->PurgeEmptyChannels();
60                         }
61
62                         DELETE(u);
63                 }
64                 else
65                 {
66                         // local kill
67                         ServerInstance->Log(DEFAULT,"LOCAL KILL: %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
68                         user->WriteTo(u, "KILL %s :%s!%s!%s (%s)", u->nick, ServerInstance->Config->ServerName, user->dhost, user->nick, parameters[1]);
69                         ServerInstance->SNO->WriteToSnoMask('k',"Local Kill by %s: %s!%s@%s (%s)", user->nick, u->nick, u->ident, u->host, parameters[1]);
70                         snprintf(killreason,MAXQUIT,"Killed (%s (%s))", user->nick, parameters[1]);
71                         userrec::QuitUser(ServerInstance, u, killreason);
72                 }
73         }
74         else
75         {
76                 user->WriteServ( "401 %s %s :No such nick/channel", user->nick, parameters[0]);
77         }
78 }
79