added +-ov to cmd_mode
authorpk910 <philipp@zoelle1.de>
Fri, 16 Sep 2011 23:07:11 +0000 (01:07 +0200)
committerpk910 <philipp@zoelle1.de>
Fri, 16 Sep 2011 23:07:11 +0000 (01:07 +0200)
cmd_neonserv_mode.c

index 6e791372566e575f6852b60442f1df0989f89615..835899737108fb034d00db318673076ba27f68a1 100644 (file)
@@ -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);