fixed cache asyncs caused by users rejoining the channel to fast
authorpk910 <philipp@zoelle1.de>
Mon, 10 Sep 2012 13:48:08 +0000 (15:48 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 10 Sep 2012 13:48:08 +0000 (15:48 +0200)
PART, JOIN, PART, JOIN instead of PART, PART, JOIN, JOIN (2 bots)

src/ChanUser.h
src/IRCParser.c
src/modules/NeonServ.mod/cmd_neonserv_nicklist.c

index e98a8cd25efeecddff6e6e28ac3ef791306b07b0..62d8361ca7c3a6c7313841588746b343845d669a 100644 (file)
 #define _ChanUser_h
 #include "main.h"
 
-#define CHANUSERFLAG_OPPED  0x01
-#define CHANUSERFLAG_VOICED 0x02
+#define CHANUSERFLAG_OPPED     0x01
+#define CHANUSERFLAG_VOICED    0x02
 #define CHANUSERFLAG_INVISIBLE 0x04
 #define CHANUSERFLAG_HALFOPPED 0x08
+#define CHANUSERFLAG_PARTING   0x10
 
 #define CHANUSERFLAG_OPPED_OR_VOICED (CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED)
 
@@ -34,7 +35,8 @@ struct ChanUser {
     struct ChanNode *chan;
     struct UserNode *user;
     
-    int visCount; //visible counter - if this is 0, the ChanUser gets removed
+    int visCount : 8; //visible counter - if this is 0, the ChanUser gets removed
+    int old_visCount : 8;
     
     int chageEvents;
     time_t changeTime;
index bf7755142b7f9f7049a4a77fba4ce41b950dc7dd..fc6b607cbf2e98c8ce3bba734090cf4eec9dcf31 100644 (file)
@@ -404,11 +404,24 @@ static IRC_CMD(raw_part) {
         decrease_viscount_butone(chan, chanuser);
         chan->botcount--;
     }
+    if(chanuser->flags & CHANUSERFLAG_PARTING)
+        chanuser->old_visCount--;
     chanuser->visCount--;
     if(chanuser->visCount == 0) {
         delChanUser(chanuser, 0); //not free, yet!
         event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL));
         freeChanUser(chanuser);
+    } else if(!(chanuser->flags & CHANUSERFLAG_PARTING)) {
+        chanuser->flags |= CHANUSERFLAG_PARTING;
+        chanuser->old_visCount = chanuser->visCount;
+    } else if(chanuser->old_visCount == 0) {
+        int visCount = chanuser->visCount;
+        delChanUser(chanuser, 0); //not free, yet!
+        event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL));
+        freeChanUser(chanuser);
+        chanuser = addChanUser(chan, user);
+        chanuser->visCount = visCount;
+        event_join(chanuser);
     }
     
     //check if channel is still present
index 129d79cae1216f311f2c866c86e949974f04a07b..12311600c968eae3553612bd75c5a7949349f524 100644 (file)
@@ -129,7 +129,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
     int chanuser_count;
     char statebuf[5];
     char accessbuf[50];
-    char viscountbuf[5];
+    char viscountbuf[50];
     int uaccess;
     
     i = 3;
@@ -278,7 +278,10 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli
             accessbufpos += sprintf(accessbuf+accessbufpos, ")");
         content[2] = accessbuf;
         if(flags & NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT) {
-            sprintf(viscountbuf, "%d", chanuser->visCount);
+            if(chanuser->flags & CHANUSERFLAG_PARTING)
+                sprintf(viscountbuf, "%d (\003P\003 %d)", chanuser->visCount, chanuser->old_visCount);
+            else
+                sprintf(viscountbuf, "%d", chanuser->visCount);
             content[3] = viscountbuf;
         }
         table_add(table, content);