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':
} 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])) {
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]);
}
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);