added special modes handler
[NeonServV5.git] / ChanNode.c
index 93f4266c4e754e68ad6f60ceb9aed0a8002d7ecb..5bca72ea2bf361cf9ca57ae8ecae8b248e63d5e2 100644 (file)
@@ -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) {