From 2a0b9f96516033221544df57e8eda9ef9f80b53f Mon Sep 17 00:00:00 2001 From: pk910 Date: Sat, 17 Sep 2011 01:07:11 +0200 Subject: [PATCH] added +-ov to cmd_mode --- cmd_neonserv_mode.c | 52 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/cmd_neonserv_mode.c b/cmd_neonserv_mode.c index 6e79137..8358997 100644 --- a/cmd_neonserv_mode.c +++ b/cmd_neonserv_mode.c @@ -81,10 +81,48 @@ static void neonserv_cmd_mode_async1(struct ClientSocket *client, struct ClientS add = 0; break; case 'o': - - break; case 'v': - + if(arg == argc) { + reply(textclient, user, "NS_MODE_INVALID", modeStr[i]); + return; + } + carg = argv[arg++]; + if(uaccess < (modeStr[i] == 'o' ? db_canop : db_canvoice)) { + reply(textclient, user, "NS_MODE_ENFOPS", chan->name); + if(modeStr[i] == 'o') db_canop = -1; + else db_canvoice = -1; + break; + } + if((modeStr[i] == 'o' ? db_canop : db_canvoice) == -1) break; + struct UserNode *cuser; + struct ChanUser *chanuser; + cuser = searchUserByNick(carg); + if(!cuser) { + //check for an invisible user + for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { + if(!stricmp(chanuser->user->nick, carg)) { + cuser = chanuser->user; + break; + } + } + if(!cuser) break; + } else { + chanuser = getChanUser(cuser, chan); + if(!chanuser) break; + } + if(!(add ^ (chanuser->flags & (modeStr[i] == 'o' ? CHANUSERFLAG_OPPED : CHANUSERFLAG_VOICED)))) break; + if(!add) { + //check protection + if(modeStr[i] == 'o' && isNetworkService(cuser)) { + reply(textclient, user, "NS_SERVICE_IMMUNE", cuser->nick); + break; + } + if(isUserProtected(chan, cuser, user)) { + reply(textclient, user, "NS_USER_PROTECTED", cuser->nick); + break; + } + } + modeBufferSet(modeBuf, add, modeStr[i], carg); break; case 'b': @@ -137,7 +175,7 @@ static void neonserv_cmd_mode_async1(struct ClientSocket *client, struct ClientS } else carg = NULL; if((modetype & CHANNEL_MODE_TYPE) == CHANNEL_MODE_TYPE_D && isModeSet(chan->modes, modeStr[i]) == add) - continue; + break; if(!isModeAffected(changemodes, modeStr[i])) { if(!add && (modetype & CHANNEL_MODE_KEY)) { if(isModeSet(chan->modes, modeStr[i])) { @@ -152,7 +190,7 @@ static void neonserv_cmd_mode_async1(struct ClientSocket *client, struct ClientS modeBufferSet(modeBuf, 0, modeStr[i], current_val); flushModeBuffer(modeBuf); } - if(!add && !isModeSet(chan->modes, modeStr[i])) continue; + if(!add && !isModeSet(chan->modes, modeStr[i])) break; modeBufferSet(modeBuf, add, modeStr[i], carg); } else { modeBufferSimpleMode(modeBuf, add, modeStr[i]); @@ -168,7 +206,9 @@ static void neonserv_cmd_mode_async1(struct ClientSocket *client, struct ClientS } getFullModeString(changemodes, tmp); freeModeBuffer(modeBuf); - reply(textclient, user, "NS_MODE_DONE", tmp); + if(strcmp(tmp, "+")) + reply(textclient, user, "NS_MODE_DONE", tmp); + logEvent(event); freeModeNode(modelock); freeModeNode(changemodes); -- 2.20.1