Merge branch 'development'
[NeonServV5.git] / src / IRCParser.c
index d9a707f63d024576c02c2a5bdc1cef516ed1515e..701ad457b54d592ecae6b15c02d9d110916e2a88 100644 (file)
@@ -113,7 +113,7 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char *
     if(!irc_cmd) {
         event_raw(client, from, cmd, argv, argc);
     } else if(!ret) {
-        printf_log("main", LOG_WARNING | LOG_IRCRAW, "PARSE ERROR: %s\n", cmd);
+        printf_log("main", LOG_WARNING | LOG_IRCRAW, "PARSE ERROR: %s %s %s\n", (from ? from : "*"), cmd, merge_argv(argv, 0, argc));
     }
 }
 
@@ -481,7 +481,8 @@ static IRC_CMD(raw_kick) {
     chanuser->visCount--;
     if(chanuser->visCount == 0) {
         delChanUser(chanuser, 0); //not free, yet!
-        event_kick(user, chanuser, argv[2]);
+        if(user)
+            event_kick(user, chanuser, argv[2]);
         freeChanUser(chanuser);
     }
     
@@ -556,6 +557,7 @@ static IRC_CMD(raw_quit) {
     if(user->channel == NULL) {
         if(isBot(user)) {
             //ASSERT
+                       DESYNCHRONIZE(cache_sync);
             return 0;
         }
         if((user->flags & USERFLAG_WAS_REGISTERING)) {
@@ -640,6 +642,7 @@ static IRC_CMD(raw_privmsg) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
+        if(stricmplen(from, "***!", 4) == 0) return 1; /* ZNC Playback */
         user = createTempUserMask(from);
                if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
@@ -684,6 +687,7 @@ static IRC_CMD(raw_privmsg) {
 }
 
 static IRC_CMD(raw_notice) {
+    if(from == NULL && argc && !stricmp(argv[0], "AUTH")) return 1; //NOTICE AUTH is NOT a parse error ;)
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {