-/* UserNode.c - NeonServ v5.4
+/* 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() {
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)
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);
user->flags = 0;
user->channel = NULL;
user->last_who = 0;
+ user->usermode = 0;
SYNCHRONIZE(cache_sync);
user->next = userList[userListIndex];
userList[userListIndex] = user;
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;
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
} else
user->flags &= ~USERFLAG_FREETMPUSER;
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;
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
} else
user->flags &= ~USERFLAG_FREETMPUSER;
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);
user->realname[0] = 0;
user->flags = USERFLAG_ISSERVER;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
break;
} else if(cmask[i] == '@') {
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);
user->realname[0] = 0;
user->flags = 0;
user->channel = NULL;
+ user->usermode = 0;
user->last_who = 0;
break;
}