Merge branch 'development'
[NeonServV5.git] / src / UserNode.c
index d60127e2f6fd528d54a9806b1311a17abd997e00..cd8735e8f5ba7716b4cb5c3996d04b1353d53c7f 100644 (file)
@@ -1,4 +1,4 @@
-/* UserNode.c - NeonServ v5.3
+/* UserNode.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
 #include "tools.h"
 #include "IRCEvents.h"
 #include "IPNode.h"
+#include "log.h"
 
 static struct UserNode **userList;
 
+unsigned int valid_user_modes[] = {
+    1,  'o',
+    2,  'O',
+    3,  'i',
+    4,  'w',
+    5,  's',
+    6,  'd',
+    7,  'k',
+    8,  'g',
+    9,  'n',
+    10, 'I',
+    11, 'X',
+    12, 'S',
+    13, 'H',
+    14, 'c',
+    15, 'W',
+    16, 't',
+    17, 'D',
+    18, 'x',
+//  ^ maximum is 32!!!
+    0x00, 0x00
+};
+
 void init_UserNode() {
+    unsigned int *mode, flag = 1;
     userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList));
+    for (mode = valid_user_modes; mode[1]; mode += 2) {
+        mode[0] = flag;
+        flag = flag << 1;
+    }
 }
 
 void free_UserNode() {
@@ -65,6 +94,43 @@ static int get_nicklist_entry(int nick) {
     return -1; //ERROR!
 }
 
+static unsigned int* getUserModeOptions(char mode) {
+    unsigned int *cmode;
+    for (cmode = valid_user_modes; cmode[1]; cmode += 2) {
+        if(cmode[1] == mode)
+            return cmode;
+    }
+    return NULL;
+}
+
+int isUserModeSet(struct UserNode *user, char modeChar) {
+    unsigned int *modeOpt = getUserModeOptions(modeChar);
+    return (user->usermode & modeOpt[0]);
+}
+
+void parseUserModes(struct UserNode* user, char *modeStr) {
+    int i, add = 1;
+    unsigned int *modeOpt;
+    for(i = 0; i < strlen(modeStr); i++) {
+        if(modeStr[i] == '+') {
+            add = 1;
+            continue;
+        }
+        if(modeStr[i] == '-') {
+            add = 0;
+            continue;
+        }
+        modeOpt = getUserModeOptions(modeStr[i]);
+        if(!modeOpt) continue; // unknown mode?
+        if(add) {
+            user->usermode |= modeOpt[0];
+        } else {
+            user->usermode &= ~modeOpt[0];
+        }
+    }
+}
+
+
 struct UserNode* getUserByNick(const char *nick) { //case sensitive
     int userListIndex = get_nicklist_entry(*nick);
     if(userListIndex == -1 || userList[userListIndex] == NULL)
@@ -223,7 +289,7 @@ struct UserNode* addUser(const char *nick) {
     struct UserNode *user = malloc(sizeof(*user));
     if (!user)
     {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         return NULL;
     }
     strcpy(user->nick, nick);
@@ -235,6 +301,7 @@ struct UserNode* addUser(const char *nick) {
     user->flags = 0;
     user->channel = NULL;
     user->last_who = 0;
+    user->usermode = 0;
     SYNCHRONIZE(cache_sync);
     user->next = userList[userListIndex];
     userList[userListIndex] = user;
@@ -284,7 +351,7 @@ struct UserNode* createTempUser(const char *nick) {
     if(!user) {
         user = malloc(sizeof(*user));
         if (!user) {
-            perror("malloc() failed");
+            printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
             return NULL;
         }
         user->ident[0] = 0;
@@ -293,6 +360,7 @@ struct UserNode* createTempUser(const char *nick) {
         user->realname[0] = 0;
         user->flags = 0;
         user->channel = NULL;
+        user->usermode = 0;
         user->last_who = 0;
     } else
         user->flags &= ~USERFLAG_FREETMPUSER;
@@ -331,7 +399,7 @@ struct UserNode* createTempUserMask(const char *mask) {
             if(!user) {
                 user = malloc(sizeof(*user));
                 if (!user) {
-                    perror("malloc() failed");
+                    printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
                     return NULL;
                 }
                 user->ident[0] = 0;
@@ -340,6 +408,7 @@ struct UserNode* createTempUserMask(const char *mask) {
                 user->realname[0] = 0;
                 user->flags = 0;
                 user->channel = NULL;
+                user->usermode = 0;
                 user->last_who = 0;
             } else
                 user->flags &= ~USERFLAG_FREETMPUSER;
@@ -353,7 +422,7 @@ struct UserNode* createTempUserMask(const char *mask) {
             user = malloc(sizeof(*user));
             if (!user)
             {
-                perror("malloc() failed");
+                printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
                 return NULL;
             }
             strcpy(user->host, cmask);
@@ -366,6 +435,7 @@ struct UserNode* createTempUserMask(const char *mask) {
             user->realname[0] = 0;
             user->flags = USERFLAG_ISSERVER;
             user->channel = NULL;
+            user->usermode = 0;
             user->last_who = 0;
             break;
         } else if(cmask[i] == '@') {
@@ -379,7 +449,7 @@ struct UserNode* createTempUserMask(const char *mask) {
                 user = malloc(sizeof(*user));
                 if (!user)
                 {
-                    perror("malloc() failed");
+                    printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
                     return NULL;
                 }
                 strcpy(user->nick, cmask);
@@ -390,6 +460,7 @@ struct UserNode* createTempUserMask(const char *mask) {
                 user->realname[0] = 0;
                 user->flags = 0;
                 user->channel = NULL;
+                user->usermode = 0;
                 user->last_who = 0;
                 break;
             }