added raw_topic, raw_privmsg and wrote the small "dead channel garbage collector"
[NeonServV5.git] / UserNode.c
index 89f32360da719bf66e75541a597a6d715157ffee..870f11e3ce33939472c98bd687a3e5b992ea282e 100644 (file)
@@ -109,7 +109,6 @@ struct UserNode* addUser(const char *nick) {
     return user;
 }
 
-
 struct UserNode* addUserMask(const char *mask) {
     char cmask[strlen(mask)+1];
     strcpy(cmask, mask);
@@ -118,7 +117,7 @@ struct UserNode* addUserMask(const char *mask) {
     for(i = 0; i < strlen(mask)+1; i++) {
         if(cmask[i] == '!') {
             cmask[i] = 0;
-            user = addUser(&cmask[0]);
+            user = addUser(cmask);
             if(user == NULL) return NULL;
             ii = i+1;
         } else if(cmask[i] == '.' && !user) {
@@ -137,6 +136,56 @@ struct UserNode* addUserMask(const char *mask) {
     return user;
 }
 
+struct UserNode* createTempUser(const char *mask) {
+    //note: it could also be a server we have to create a temponary user for...
+    char cmask[strlen(mask)+1];
+    strcpy(cmask, mask);
+    int i, ii = 0;
+    struct UserNode *user = NULL;
+    for(i = 0; i < strlen(mask)+1; i++) {
+        if(cmask[i] == '!') {
+            cmask[i] = 0;
+            struct UserNode *user = malloc(sizeof(*user));
+            if (!user)
+            {
+                perror("malloc() failed");
+                return NULL;
+            }
+            strcpy(user->nick, nick);
+            user->ident[0] = 0;
+            user->host[0] = 0;
+            user->realname[0] = 0;
+            user->flags = 0;
+            user->channel = NULL;
+            ii = i+1;
+        } else if(cmask[i] == '.' && !user) {
+            //it's a server
+            struct UserNode *user = malloc(sizeof(*user));
+            if (!user)
+            {
+                perror("malloc() failed");
+                return NULL;
+            }
+            strcpy(user->host, cmask);
+            user->ident[0] = 0;
+            user->host[0] = 0;
+            user->realname[0] = 0;
+            user->flags = USERFLAG_ISSERVER;
+            user->channel = NULL;
+            return user;
+        } else if(cmask[i] == '@') {
+            if(user == NULL) return NULL;
+            cmask[i] = 0;
+            strcpy(user->ident, &cmask[ii]);
+            ii = i+1;
+        } else if(cmask[i] == '\0') {
+            if(user == NULL) return NULL;
+            strcpy(user->host, &cmask[ii]);
+        }
+    }
+    return user;
+}
+
 int renameUser(struct UserNode* user, const char *new_nick) {
     if(!is_valid_nick(new_nick))
         return 0;
@@ -170,7 +219,7 @@ void delUser(struct UserNode* user, int freeUser) {
         struct ChanUser *chanUser, *next;
         for(chanUser = user->channel; chanUser; chanUser = next) {
             next = chanUser->next_chan;
-            quitChanUser(chanUser, freeUser);
+            removeChanUserFromLists(chanUser, 1, 0, freeUser);
         }
     }
     if(freeUser)