fixed initial cache buildup (increase viscount per bot on join)
authorpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 21:24:15 +0000 (23:24 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 20 Aug 2012 21:24:15 +0000 (23:24 +0200)
src/IRCParser.c
src/WHOHandler.c

index efbdbfd525e47ffbca041585976edcc945858668..e2a53aad606d4e858678b1e3c9febd2dd9acfcdc 100644 (file)
@@ -116,8 +116,21 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char *
     }
 }
 
+static void increase_viscount_butone(struct ChanNode *chan, struct ChanUser *ignore) {
+    struct ChanUser *chanuser;
+    
+    for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+        if(chanuser == ignore)
+            continue;
+        chanuser2->visCount++;
+    }
+}
+
 static USERLIST_CALLBACK(got_channel_userlist) {
     struct ChanUser *chanuser = data;
+    
+    increase_viscount_butone(chanuser->chan, chanuser);
+    
     event_join(chanuser);
 }
 
@@ -161,13 +174,24 @@ static IRC_CMD(raw_join) {
         
         event_registered(user, from);
         user->flags &= ~USERFLAG_WAS_REGISTERING;
-    } else if(!isUserOnChan(user, chan)) {
-        //join user to an existing channel
+    } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         chanuser = addChanUser(chan, user);
         chanuser->visCount = 1;
+        
         if(isBot(user) && isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible
             chanuser->flags |= CHANUSERFLAG_INVISIBLE;
         
+        get_userlist_with_invisible(chan, 0, got_channel_userlist, chanuser);
+    } else if(!isUserOnChan(user, chan)) {
+        //join user to an existing channel
+        chanuser = addChanUser(chan, user);
+        chanuser->visCount = 1;
+        if(isBot(user)) {
+            if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible
+                chanuser->flags |= CHANUSERFLAG_INVISIBLE;
+            increase_viscount_butone(chan, chanuser);
+        }
+        
         event_join(chanuser);
         
         if(!(user->flags & USERFLAG_ISBOT) && (chan->flags & CHANFLAG_REJOINING)) {
@@ -184,6 +208,10 @@ static IRC_CMD(raw_join) {
         //user is already in the channel
         chanuser = getChanUser(user, chan);
         chanuser->visCount++;
+        
+        if(isBot(user) && !(chanuser->flags & CHANUSERFLAG_INVISIBLE))
+            increase_viscount_butone(chan, chanuser);
+        
         //if multiple bots see the user, it can't be invisible
         chanuser->flags &= ~CHANUSERFLAG_INVISIBLE;
     }
@@ -363,7 +391,7 @@ static IRC_CMD(raw_quit) {
     for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
         next_chanuser = getUserChannels(user, chanuser);
         chanuser->visCount--;
-        if(chanuser->visCount == 0) {
+        if(chanuser->visCount <= 0) {
             delChanUser(chanuser, 0); //not free, yet!
             event_part(chanuser, 1, argv[0]);
             if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING))
@@ -400,7 +428,7 @@ void bot_disconnect(struct ClientSocket *client) {
         for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
             next_chanuser = getUserChannels(user, chanuser);
             chanuser->visCount--;
-            if(chanuser->visCount == 0) {
+            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))
index 7a8a3548ea359fa5aee74e48fc84e25e1d4ab8f5..13786787b1187f68b4a5ea18d8c8f373fc545554 100644 (file)
@@ -30,7 +30,7 @@
 #define WHOQUEUETYPE_CHECKTYPE 0x07
 #define WHOQUEUETYPE_FOUND     0x08
 
-#define MAXCALLBACKS 3
+#define MAXCALLBACKS 10
 
 struct WHOQueueEntry {
     char type;