]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/chanserv.c
hash: add extra metadata to server link handlers
[irc/evilnet/x3.git] / src / chanserv.c
index ef3dcd6dad007d9da45c7ce9e9bbada4d0215b65..23ca05917de445a9ab8963192589916540dc31fd 100644 (file)
@@ -8727,10 +8727,19 @@ handle_part(struct modeNode *mn, UNUSED_ARG(const char *reason))
     if(IsHelping(mn->user) && IsSupportHelper(mn->user))
     {
         unsigned int ii;
-        for(ii = 0; ii < chanserv_conf.support_channels.used; ++ii)
-             if(find_handle_in_channel(chanserv_conf.support_channels.list[ii], mn->user->handle_info, mn->user))
+        for(ii = 0; ii < chanserv_conf.support_channels.used; ++ii) {
+            struct chanNode *channel;
+            struct userNode *exclude;
+            /* When looking at the channel that is being /part'ed, we
+             * have to skip over the client that is leaving.  For
+             * other channels, we must not do that.
+             */
+            channel = chanserv_conf.support_channels.list[ii];
+            exclude = (channel == mn->channel) ? mn->user : NULL;
+            if(find_handle_in_channel(channel, mn->user->handle_info, exclude))
                 break;
-         if(ii == chanserv_conf.support_channels.used)
+        }
+        if(ii == chanserv_conf.support_channels.used)
             HANDLE_CLEAR_FLAG(mn->user->handle_info, HELPING);
     }
 }
@@ -8949,7 +8958,7 @@ handle_unreg(UNUSED_ARG(struct userNode *user), struct handle_info *handle)
 }
 
 static int 
-handle_server_link(UNUSED_ARG(struct server *server))
+handle_server_link(UNUSED_ARG(struct server *server), UNUSED_ARG(void *extra))
 {
     struct chanData *cData;
 
@@ -9950,7 +9959,7 @@ init_chanserv(const char *nick)
     conf_register_reload(chanserv_conf_read);
 
     if (nick) {
-        reg_server_link_func(handle_server_link);
+        reg_server_link_func(handle_server_link, NULL);
         reg_new_channel_func(handle_new_channel);
         reg_join_func(handle_join);
         reg_part_func(handle_part);