fixed temporary user management
[NeonServV5.git] / src / IRCParser.c
index b95d8f659f2f613f7860efb6b5053ea20129e259..750ac7b783c871643de7fe85ecb1b04cf7a491ee 100644 (file)
@@ -1,5 +1,5 @@
 /* IRCParser.c - NeonServ v5.3
- * Copyright (C) 2011  Philipp Kreil (pk910)
+ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -395,7 +395,8 @@ static IRC_CMD(raw_kick) {
     int keep_channel = 1;
     if(isUserOnChan(target, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         if(user == NULL) {
-            user = createTempUser(from);
+            user = createTempUserMask(from);
+                       if(!user) return 0;
             user->flags |= USERFLAG_ISTMPUSER;
         }
         struct ChanUser *chanuser = getChanUser(target, chan);
@@ -424,7 +425,8 @@ static IRC_CMD(raw_topic) {
     if(chan == NULL) return 0;
     if(chan->chanbot != client->user) return 1; //just ignore it to prevent event duplicates
     if(user == NULL) {
-        user = createTempUser(from);
+        user = createTempUserMask(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     event_topic(user, chan, argv[1]);
@@ -436,7 +438,8 @@ static IRC_CMD(raw_privmsg) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
-        user = createTempUser(from);
+        user = createTempUserMask(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(!stricmp(user->nick, "*status") && !match("Disconnected from IRC.*", argv[1])) {
@@ -493,7 +496,8 @@ static IRC_CMD(raw_notice) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
-        user = createTempUser(from);
+        user = createTempUserMask(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(argv[0][0] == '#') { //Channel notice
@@ -547,7 +551,8 @@ static IRC_CMD(raw_invite) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
-        user = createTempUser(from);
+        user = createTempUserMask(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     event_invite(client, user, argv[1]);
@@ -558,7 +563,8 @@ static IRC_CMD(raw_mode) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) {
-        user = createTempUser(from);
+        user = createTempUserMask(from);
+               if(!user) return 0;
         user->flags |= USERFLAG_ISTMPUSER;
     }
     if(argv[0][0] == '#') {
@@ -566,8 +572,8 @@ static IRC_CMD(raw_mode) {
         struct ChanNode *chan = getChanByName(argv[0]);
         if(!chan) return 0;
         if(chan->chanbot != client->user) return 1;
-        event_mode(user, chan, argv[1], argv+2, argc-2);
         parseModes(chan->modes, argv[1], argv+2, argc-2);
+        event_mode(user, chan, argv[1], argv+2, argc-2);
     } else {
         //UserMode
     }
@@ -686,7 +692,12 @@ char* merge_argv_char(char **argv, int start, int end, char seperator) {
     for(i = start; i < end; i++) {
         p = argv[i];
         while(*p) p++;
-        *p = seperator;
+        if(i < end-1) {
+            while(p != argv[i+1]) {
+                *p++ = seperator;
+            }
+        } else
+            *p = seperator;
     }
     if(p) *p = '\0';
     return argv[start];