From: pk910 Date: Fri, 12 Aug 2011 04:51:27 +0000 (+0200) Subject: added special modes handler X-Git-Tag: v5.3~590 X-Git-Url: http://git.pk910.de/?a=commitdiff_plain;h=17f9ddca080323f71c8b13336544c1fbc24af0ad;p=NeonServV5.git added special modes handler --- diff --git a/ChanNode.c b/ChanNode.c index 93f4266..5bca72e 100644 --- a/ChanNode.c +++ b/ChanNode.c @@ -237,6 +237,21 @@ void* getModeValue(struct ChanNode* chan, char modeChar) { #undef MODE_VALUE_INDEX } +static void parseModesUserPriv(struct ChanNode* chan, unsigned char flag, int add, char *nick) { + struct UserNode *user = getUserByNick(nick); + if(user == NULL) return; + struct ChanUser *chanuser = getChanUser(user, chan); + if(chanuser == NULL) return; + if(add) + chanuser->flags |= flag; + else + chanuser->flags &= ~flag; +} + +static void parseModesBan(struct ChanNode* chan, int add, char *mask) { + //to be continued... +} + void parseModes(struct ChanNode* chan, char *modeStr, char **argv, int argc) { int i, argpos = 0, add = 1; #define MODE_TYPE (modeOpt[2] & CHANNEL_MODE_TYPE) @@ -255,7 +270,23 @@ void parseModes(struct ChanNode* chan, char *modeStr, char **argv, int argc) { modeOpt = getModeOptions(modeStr[i]); if(!modeOpt) continue; // unknown mode? if(MODE_TYPE == CHANNEL_MODE_TYPE_A) { + if(argpos == argc) continue; //special mode ;) + switch(modeStr[i]) { + case 'o': + parseModesUserPriv(chan, CHANUSERFLAG_OPPED, add, argv[argc]); + break; + case 'v': + parseModesUserPriv(chan, CHANUSERFLAG_VOICED, add, argv[argc]); + break; + case 'b': + parseModesBan(chan, add, argv[argc]); + break; + default: + //we have an unknown TYPE_A mode??? + break; + } + argc++; continue; } if(add) { diff --git a/ChanUser.h b/ChanUser.h index f979893..c12de4a 100644 --- a/ChanUser.h +++ b/ChanUser.h @@ -11,7 +11,7 @@ struct ChanNode; struct UserNode; struct ChanUser { - char flags; + unsigned char flags; struct ChanNode *chan; struct UserNode *user;