added OPER support (let the bots try to op themselves)
[NeonServV5.git] / src / UserNode.c
index 0f10b532e27f24d0cbc4f83741d0666995e1529d..7f82a475305220786f5a29ef4add3c168cabb426 100644 (file)
 
 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 +93,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)
@@ -235,6 +300,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;
@@ -293,6 +359,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;
@@ -340,6 +407,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;
@@ -366,6 +434,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] == '@') {
@@ -390,6 +459,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;
             }