use putsock function instead of iohandler functions for login commands (PASS, USER...
[NeonServV5.git] / src / IRCParser.c
index 675dc40ae7d7d6b3a0a6f129c2e524e6bf12e2db..fc6b607cbf2e98c8ce3bba734090cf4eec9dcf31 100644 (file)
@@ -340,8 +340,10 @@ static IRC_CMD(raw_join) {
             return 1; //ignore join
         }
         
-        chanuser = addChanUser(chan, user);
-        chanuser->visCount = 1;
+        if(!(chanuser = getChanUser(user, chan))) {
+            chanuser = addChanUser(chan, user);
+        }
+        chanuser->visCount++;
         chan->botcount++;
         
         if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible
@@ -402,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