]> jfr.im git - solanum.git/commitdiff
Add client_quit hook
authorEd Kellett <redacted>
Sat, 23 May 2020 18:10:07 +0000 (19:10 +0100)
committerEd Kellett <redacted>
Sat, 23 May 2020 18:10:07 +0000 (19:10 +0100)
include/hook.h
modules/core/m_quit.c

index 099eeec7e37e93870230049a1b0d4a2ca0422989..7cc3bd54340a1ad5afeda6e99945ee7114cca3e7 100644 (file)
@@ -113,6 +113,13 @@ typedef struct
        const char *comment;
 } hook_data_client_exit;
 
+typedef struct
+{
+       struct Client *client;
+       const char *reason;
+       const char *orig_reason;
+} hook_data_client_quit;
+
 typedef struct
 {
        struct Client *client;
index f1851dde5eb4c5cf8b70b7e75e2d0fd5b5fbd2a0..a986a327f97beefb5de9c96fa5c0dd84ee664b7c 100644 (file)
@@ -39,6 +39,8 @@ static const char quit_desc[] = "Provides the QUIT command to allow a user to le
 static void m_quit(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
 static void ms_quit(struct MsgBuf *, struct Client *, struct Client *, int, const char **);
 
+static int h_client_quit;
+
 struct Message quit_msgtab = {
        "QUIT", 0, 0, 0, 0,
        {{m_quit, 0}, {m_quit, 0}, {ms_quit, 0}, mg_ignore, mg_ignore, {m_quit, 0}}
@@ -46,7 +48,12 @@ struct Message quit_msgtab = {
 
 mapi_clist_av1 quit_clist[] = { &quit_msgtab, NULL };
 
-DECLARE_MODULE_AV2(quit, NULL, NULL, quit_clist, NULL, NULL, NULL, NULL, quit_desc);
+mapi_hlist_av1 quit_hlist[] = {
+       { "client_quit", &h_client_quit },
+       { NULL, NULL }
+};
+
+DECLARE_MODULE_AV2(quit, NULL, NULL, quit_clist, quit_hlist, NULL, NULL, NULL, quit_desc);
 
 /*
 ** m_quit
@@ -55,25 +62,33 @@ DECLARE_MODULE_AV2(quit, NULL, NULL, quit_clist, NULL, NULL, NULL, NULL, quit_de
 static void
 m_quit(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
-       char *comment = LOCAL_COPY((parc > 1 && parv[1]) ? parv[1] : client_p->name);
+       char *comment_copy = LOCAL_COPY((parc > 1 && parv[1]) ? parv[1] : client_p->name);
+       const char *comment = comment_copy;
        char reason[REASONLEN + 1];
+       hook_data_client_quit hdata;
 
        source_p->flags |= FLAGS_NORMALEX;
 
-       if(strlen(comment) > (size_t) REASONLEN)
-               comment[REASONLEN] = '\0';
+       if (strlen(comment_copy) > (size_t) REASONLEN)
+               comment_copy[REASONLEN] = '\0';
+
+       strip_colour(comment_copy);
 
-       strip_colour(comment);
+       hdata.client = client_p;
+       hdata.reason = hdata.orig_reason = comment;
+       call_hook(h_client_quit, &hdata);
+       comment = hdata.reason;
 
-       if(ConfigFileEntry.client_exit && comment[0])
+       /* don't add Quit: if the reason comes from a module */
+       if (ConfigFileEntry.client_exit && hdata.reason == hdata.orig_reason && comment[0])
        {
                snprintf(reason, sizeof(reason), "Quit: %s", comment);
                comment = reason;
        }
 
-       if(!IsOper(source_p) &&
+       if (comment == NULL || (!IsOper(source_p) && hdata.reason == hdata.orig_reason &&
           (source_p->localClient->firsttime + ConfigFileEntry.anti_spam_exit_message_time) >
-          rb_current_time())
+          rb_current_time()))
        {
                exit_client(client_p, source_p, source_p, "Client Quit");
                return;