fixed viscount update when another bot joins a channel
[NeonServV5.git] / src / IRCParser.c
index f9e79e0c127c720b34a67f96db5217334d0a2738..1d53ec2aa1ba6c4e82e0d1a53a527ded07a56747 100644 (file)
@@ -171,7 +171,7 @@ static IRC_CMD(raw_join) {
         event_registered(user, from);
         user->flags &= ~USERFLAG_WAS_REGISTERING;
     } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
-        if(!isBot(user)) {
+        if(client->user != user) { //bots are allowed to add themselves
             DESYNCHRONIZE(cache_sync);
             return 1; //ignore join
         }
@@ -187,7 +187,7 @@ static IRC_CMD(raw_join) {
         //join user to an existing channel
         chanuser = addChanUser(chan, user);
         chanuser->visCount = 1;
-        if(isBot(user)) {
+        if(isBot(user) && client->user == 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);
@@ -210,7 +210,7 @@ static IRC_CMD(raw_join) {
         chanuser = getChanUser(user, chan);
         chanuser->visCount++;
         
-        if(isBot(user) && !(chanuser->flags & CHANUSERFLAG_INVISIBLE))
+        if(isBot(user) && client->user == user)
             increase_viscount_butone(chan, chanuser);
         
         //if multiple bots see the user, it can't be invisible
@@ -395,13 +395,16 @@ static IRC_CMD(raw_quit) {
     struct ChanUser *chanuser, *next_chanuser;
     for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
         next_chanuser = getUserChannels(user, chanuser);
-        chanuser->visCount--;
-        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))
-                check_full_rejoin(chanuser->chan);
-            freeChanUser(chanuser);
+        //decrease visCount counter only if client is in the channel
+        if(isUserOnChan(client->user, chanuser->chan)) {
+            chanuser->visCount--;
+            if(chanuser->visCount <= 0 && !(user->flags & USERFLAG_WAS_REGISTERING)) {
+                delChanUser(chanuser, 0); //not free, yet!
+                event_part(chanuser, 1, argv[0]);
+                if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING))
+                    check_full_rejoin(chanuser->chan);
+                freeChanUser(chanuser);
+            }
         }
     }