fixed cache update when a bot disconnects from the network / parts a channel
authorpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 22:00:33 +0000 (00:00 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 22:00:33 +0000 (00:00 +0200)
src/IRCParser.c

index aeb0e6d40eb9480f09b8f894d5cbd464cb57435a..0188de9b6798918c21b6a300a9b121ad403120c6 100644 (file)
@@ -126,6 +126,19 @@ static void increase_viscount_butone(struct ChanNode *chan, struct ChanUser *ign
     }
 }
 
+static void decrease_viscount_butone(struct ChanNode *chan, struct ChanUser *ignore) {
+    struct ChanUser *chanuser, *next_chanuser;
+    
+    for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) {
+        next_chanuser = getChannelUsers(chan, chanuser);
+        if(chanuser == ignore)
+            continue;
+        chanuser->visCount--;
+        if(chanuser->visCount <= 0)
+            delChanUser(chanuser, 1);
+    }
+}
+
 static USERLIST_CALLBACK(got_channel_userlist) {
     struct ChanUser *chanuser = data;
     
@@ -267,6 +280,8 @@ static IRC_CMD(raw_part) {
         DESYNCHRONIZE(cache_sync);
         return 0;
     }
+    if(isBot(user) && user == client->user) 
+        decrease_viscount_butone(chan, chanuser);
     chanuser->visCount--;
     if(chanuser->visCount == 0) {
         delChanUser(chanuser, 0); //not free, yet!
@@ -323,6 +338,8 @@ static IRC_CMD(raw_kick) {
         DESYNCHRONIZE(cache_sync);
         return 0;
     }
+    if(isBot(target) && target == client->user) 
+        decrease_viscount_butone(chan, chanuser);
     chanuser->visCount--;
     if(chanuser->visCount == 0) {
         delChanUser(chanuser, 0); //not free, yet!
@@ -427,12 +444,13 @@ void bot_disconnect(struct ClientSocket *client) {
         struct ChanUser *chanuser, *next_chanuser;
         for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
             next_chanuser = getUserChannels(user, chanuser);
+            decrease_viscount_butone(chanuser->chan, chanuser);
             chanuser->visCount--;
             if(chanuser->visCount <= 0) {
                 delChanUser(chanuser, 0); //not free, yet!
                 event_part(chanuser, 1, "QUIT");
-                if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING))
-                    check_full_rejoin(chanuser->chan);
+                if(chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST)
+                    checkChannelVisibility(chanuser->chan);
                 freeChanUser(chanuser);
             }
         }