X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FUserNode.c;h=a82e5ec701685f538abb8cedb7b79383c0f75f7f;hp=d60127e2f6fd528d54a9806b1311a17abd997e00;hb=4812835346f724fcea86e78f741cc6c72c86b676;hpb=fa67a6add4e9db31ca1f98b67028aa14ace92376 diff --git a/src/UserNode.c b/src/UserNode.c index d60127e..a82e5ec 100644 --- a/src/UserNode.c +++ b/src/UserNode.c @@ -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 @@ -23,8 +23,36 @@ 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; }