This code was originally written by Entrope for u2.10.11.05, a minor change was needed for u2.10.12. Compiles cleanly and initial testing showed a single part message as it should be.

Gavin Grieve
diff -r -u ircu2.10/ChangeLog ircu2.10.12/ChangeLog
--- ircu2.10/ChangeLog  2003-08-14 03:01:44.000000000 +1200
+++ ircu2.10.12/ChangeLog       2004-01-21 13:44:06.000000000 +1300
@@ -1,3 +1,17 @@
+2004-01-21 Gavin Grieve <[EMAIL PROTECTED]>
+
+       * ircd/channel.c, include/channel.h: bring forward the IsUserParting()
+         code to resolve the multiple part messages bug written by Entrope.
+
 2003-08-12 Timothy Vogelsang <[EMAIL PROTECTED]>
 
         * ircd/match.c: (match) rewrote function based on existing
diff -r -u ircu2.10/include/channel.h ircu2.10.12/include/channel.h
--- ircu2.10/include/channel.h  2003-08-12 21:41:16.000000000 +1200
+++ ircu2.10.12/include/channel.h       2004-01-21 13:05:22.000000000 +1300
@@ -70,6 +70,7 @@
 #define CHFL_BURST_ALREADY_OPPED       0x04000  /* In oob BURST, but was already 
joined and opped */
 #define CHFL_BURST_ALREADY_VOICED      0x08000  /* In oob BURST, but was already 
joined and voiced */
 #define CHFL_CHANNEL_MANAGER   0x10000 /* Set when creating channel or using Apass */
+#define CHFL_USER_PARTING       0x20000  /* User is already parting that channel */
 
 #define CHFL_OVERLAP         (CHFL_CHANOP | CHFL_VOICE)
 #define CHFL_BANVALIDMASK    (CHFL_BANVALID | CHFL_BANNED)
@@ -191,6 +192,7 @@
 #define IsBurstJoined(x)    ((x)->status & CHFL_BURST_JOINED)
 #define IsVoicedOrOpped(x)  ((x)->status & CHFL_VOICED_OR_OPPED)
 #define IsChannelManager(x) ((x)->status & CHFL_CHANNEL_MANAGER)
+#define IsUserParting(x)    ((x)->status & CHFL_USER_PARTING)
 
 #define SetBanned(x)        ((x)->status |= CHFL_BANNED)
 #define SetBanValid(x)      ((x)->status |= CHFL_BANVALID)
@@ -200,6 +202,7 @@
 #define SetZombie(x)        ((x)->status |= CHFL_ZOMBIE)
 #define SetChannelManager(x) ((x)->status |= CHFL_CHANNEL_MANAGER)
 #define SetOpLevel(x, v)    (void)((x)->oplevel = (v))
+#define SetUserParting(x)   ((x)->status |= CHFL_USER_PARTING)
 
 #define ClearBanned(x)      ((x)->status &= ~CHFL_BANNED)
 #define ClearBanValid(x)    ((x)->status &= ~CHFL_BANVALID)
diff -r -u ircu2.10/ircd/channel.c ircu2.10.12/ircd/channel.c
--- ircu2.10/ircd/channel.c     2003-08-12 21:41:16.000000000 +1200
+++ ircu2.10.12/ircd/channel.c  2004-01-21 13:08:24.000000000 +1300
@@ -3139,6 +3139,11 @@
 
   if (jbuf->jb_type == JOINBUF_TYPE_PART ||
       jbuf->jb_type == JOINBUF_TYPE_PARTALL) {
+    struct Membership *member = find_member_link(chan, jbuf->jb_source);
+    if (IsUserParting(member))
+      return;
+    SetUserParting(member);
+
     /* Send notification to channel */
     if (!(flags & CHFL_ZOMBIE))
       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_PART, chan, NULL,

Reply via email to