]> jfr.im git - solanum.git/blobdiff - modules/core/m_kill.c
Implement kill-cancelling hook.
[solanum.git] / modules / core / m_kill.c
index 17042fcce6e6b4fdcbaf9e22eabe47a3b3485fb7..a058ce82645eb99a784465411574329607a40793 100644 (file)
@@ -40,6 +40,7 @@
 #include "modules.h"
 #include "s_newconf.h"
 
+static int h_can_kill;
 static char buf[BUFSIZE];
 
 static int ms_kill(struct Client *, struct Client *, int, const char **);
@@ -54,7 +55,12 @@ struct Message kill_msgtab = {
 
 mapi_clist_av1 kill_clist[] = { &kill_msgtab, NULL };
 
-DECLARE_MODULE_AV1(kill, NULL, NULL, kill_clist, NULL, NULL, "$Revision: 3408 $");
+mapi_hlist_av1 kill_hlist[] = {
+       { "can_kill", &h_can_kill },
+       { NULL, NULL},
+};
+
+DECLARE_MODULE_AV1(kill, NULL, NULL, kill_clist, kill_hlist, NULL, "$Revision: 3408 $");
 
 /*
 ** mo_kill
@@ -68,6 +74,7 @@ mo_kill(struct Client *client_p, struct Client *source_p, int parc, const char *
        const char *inpath = client_p->name;
        const char *user;
        const char *reason;
+       hook_data_client_approval moduledata;
 
        user = parv[1];
 
@@ -115,6 +122,16 @@ mo_kill(struct Client *client_p, struct Client *source_p, int parc, const char *
                return 0;
        }
 
+       /* Last chance to stop the kill */
+       moduledata.client = source_p;
+       moduledata.target = target_p;
+       moduledata.approved = 1;
+       call_hook(h_can_kill, &moduledata);
+
+       if (moduledata.approved == 0)
+               /* Let the calleee send a message */
+               return 0;
+
        if(MyConnect(target_p))
                sendto_one(target_p, ":%s!%s@%s KILL %s :%s",
                           source_p->name, source_p->username, source_p->host,