fixed renameAccount function (merging mode)
[NeonServV5.git] / src / IRCParser.c
index 675dc40ae7d7d6b3a0a6f129c2e524e6bf12e2db..bcb9f026897a838cc34cc392d903b4bba8820a2a 100644 (file)
@@ -30,6 +30,7 @@
 #include "bots.h"
 #include "timeq.h"
 #include "ConfigParser.h"
+#include "statistics.h"
 
 struct irc_cmd *irc_commands = NULL;
 //static struct UserNode *registering_users = NULL;
@@ -334,14 +335,20 @@ static IRC_CMD(raw_join) {
         
         event_registered(user, from);
         user->flags &= ~USERFLAG_WAS_REGISTERING;
+        if(user->last_who > REWHO_TIMEOUT)
+            user->last_who -= REWHO_TIMEOUT;
+        
+        event_join(chanuser);
     } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         if(client->user != user) { //bots are allowed to add themselves
             DESYNCHRONIZE(cache_sync);
             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 +409,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
@@ -626,8 +646,7 @@ static IRC_CMD(raw_privmsg) {
     if(argv[0][0] == '#') { //Channel message
         struct ChanNode *chan = getChanByName(argv[0]);
         if(chan && client == get_first_prefered_bot_in_channel(chan)) {
-            if(statistics_enabled)
-                statistics_privmsg++;
+            statistics_privmsg++;
             if(argv[1][0] == '\001') {
                 char *cmd = &argv[1][1];
                 char *text = strstr(cmd, " ");