X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FModeNode.c;h=f3579cd42b71654ae34d168eddec03bf6393b5c8;hp=79f240cec1a50af15d5744719dce0c39adfbdc2e;hb=HEAD;hpb=c575e458c6257e75b97884847143b20965a5dfda diff --git a/src/ModeNode.c b/src/ModeNode.c index 79f240c..f3579cd 100644 --- a/src/ModeNode.c +++ b/src/ModeNode.c @@ -1,5 +1,5 @@ -/* ModeNode.c - NeonServ v5.2 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* ModeNode.c - NeonServ v5.6 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,34 +19,37 @@ #include "ChanUser.h" #include "UserNode.h" #include "BanNode.h" +#include "log.h" static int modes_with_strarg, modes_with_intarg, modes_count; unsigned int valid_modes[] = { /* Thats our mode list :P */ 1, 'b', CHANNEL_MODE_TYPE_A, 2, 'o', CHANNEL_MODE_TYPE_A, - 3, 'v', CHANNEL_MODE_TYPE_A, - 4, 'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY, - 5, 'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER, - 6, 'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER, - 7, 'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING, - 8, 'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING, - 9, 'c', CHANNEL_MODE_TYPE_D, - 10, 'C', CHANNEL_MODE_TYPE_D, - 11, 'i', CHANNEL_MODE_TYPE_D, - 12, 'm', CHANNEL_MODE_TYPE_D, - 13, 'M', CHANNEL_MODE_TYPE_D, - 14, 'n', CHANNEL_MODE_TYPE_D, - 15, 'N', CHANNEL_MODE_TYPE_D, - 16, 'p', CHANNEL_MODE_TYPE_D, - 17, 'r', CHANNEL_MODE_TYPE_D, - 18, 's', CHANNEL_MODE_TYPE_D, - 19, 't', CHANNEL_MODE_TYPE_D, - 20, 'u', CHANNEL_MODE_TYPE_D, - 21, 'D', CHANNEL_MODE_TYPE_D, - 22, 'd', CHANNEL_MODE_TYPE_D, - 23, 'R', CHANNEL_MODE_TYPE_D, - 24, 'z', CHANNEL_MODE_TYPE_D, + 3, 'h', CHANNEL_MODE_TYPE_A, + 4, 'v', CHANNEL_MODE_TYPE_A, + 5, 'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY, + 6, 'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER, + 7, 'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER, + 8, 'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING, + 9, 'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING, + 10, 'c', CHANNEL_MODE_TYPE_D, + 11, 'C', CHANNEL_MODE_TYPE_D, + 12, 'i', CHANNEL_MODE_TYPE_D, + 13, 'm', CHANNEL_MODE_TYPE_D, + 14, 'M', CHANNEL_MODE_TYPE_D, + 15, 'n', CHANNEL_MODE_TYPE_D, + 16, 'N', CHANNEL_MODE_TYPE_D, + 17, 'p', CHANNEL_MODE_TYPE_D, + 18, 'r', CHANNEL_MODE_TYPE_D, + 19, 's', CHANNEL_MODE_TYPE_D, + 20, 'S', CHANNEL_MODE_TYPE_D, + 21, 't', CHANNEL_MODE_TYPE_D, + 22, 'u', CHANNEL_MODE_TYPE_D, + 23, 'D', CHANNEL_MODE_TYPE_D, + 24, 'd', CHANNEL_MODE_TYPE_D, + 25, 'R', CHANNEL_MODE_TYPE_D, + 26, 'z', CHANNEL_MODE_TYPE_D, // ^ maximum is 32!!! 0x00, 0x00, 0x00 }; @@ -75,7 +78,7 @@ struct ModeNode *createModeNode(struct ChanNode *chan) { struct ModeNode *modes = malloc(sizeof(*modes)); if (!modes) { - perror("malloc() failed"); + printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__); return NULL; } modes->chan = chan; @@ -145,6 +148,8 @@ static void parseModesUserPriv(struct ModeNode* modes, unsigned char flag, int a chanuser->flags |= flag; else chanuser->flags &= ~flag; + if((chanuser->flags & CHANUSERFLAG_OPPED_OR_VOICED) && (chanuser->flags & CHANUSERFLAG_INVISIBLE)) + chanuser->flags &= ~CHANUSERFLAG_INVISIBLE; } static void parseModesBan(struct ModeNode* modes, int add, char *mask) { @@ -179,6 +184,9 @@ void parseModes(struct ModeNode* modes, char *modeStr, char **argv, int argc) { case 'o': parseModesUserPriv(modes, CHANUSERFLAG_OPPED, add, argv[argpos]); break; + case 'h': + parseModesUserPriv(modes, CHANUSERFLAG_HALFOPPED, add, argv[argpos]); + break; case 'v': parseModesUserPriv(modes, CHANUSERFLAG_VOICED, add, argv[argpos]); break; @@ -277,7 +285,7 @@ int parseMode(struct ModeNode* modes, int add, char mode, char *param) { modes->modes &= ~modeOpt[0]; modes->allmodes |= modeOpt[0]; if(MODE_TYPE == CHANNEL_MODE_TYPE_B) { - if(!param) return 0; + if(!param && !(modeOpt[2] & CHANNEL_MODE_KEY)) return 0; if(MODE_VALUE == CHANNEL_MODE_VALUE_STRING) { free(modes->mode_str_args[MODE_VALUE_INDEX]); modes->mode_str_args[MODE_VALUE_INDEX] = NULL;