added cmd_delban
[NeonServV5.git] / ChanNode.c
index b8ff9f8e223ad59675a29adbaa0580678e87af05..4568e63faf51d22a1873c976c80f50ee764c40de 100644 (file)
@@ -1,6 +1,7 @@
 #include "ChanNode.h"
 #include "ChanUser.h"
 #include "UserNode.h"
+#include "BanNode.h"
 #include "modcmd.h"
 
 static struct ChanNode **chanList;
@@ -77,6 +78,24 @@ void init_ChanNode() {
     }
 }
 
+void free_ChanNode() {
+    //kamikaze free all channels and chanusers
+    int i;
+    struct ChanNode *chan, *next;
+    struct ChanUser *chanuser, *next_chanuser;
+    for(i = 0; i < 47; i++) {
+        for(chan = chanList[i]; chan; chan = next) {
+            next = chan->next;
+            for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) {
+                next_chanuser = getChannelUsers(chan, chanuser);
+                free(chanuser);
+            }
+            freeChanNode(chan);
+        }
+    }
+    free(chanList);
+}
+
 int is_valid_chan(const char *name) {
     unsigned int ii;
     if (*name !='#')
@@ -138,6 +157,8 @@ struct ChanNode* addChannel(const char *name) {
     }
     strcpy(chan->name, name);
     chan->user = NULL;
+    chan->bans = NULL;
+    chan->usercount = 0;
     chan->chanbot = NULL;
     chan->topic[0] = 0;
     chan->flags = 0;
@@ -196,6 +217,8 @@ void freeChanNode(struct ChanNode* chan) {
     }
     free(chan->mode_str_args);
     free(chan->mode_int_args);
+    if(chan->bans)
+        removeChannelBans(chan);
     free(chan);
 }
 
@@ -259,7 +282,10 @@ static void parseModesUserPriv(struct ChanNode* chan, unsigned char flag, int ad
 }
 
 static void parseModesBan(struct ChanNode* chan, int add, char *mask) {
-    //to be continued...
+    if(add)
+        addChannelBan(chan, mask);
+    else
+        removeChannelBanMask(chan, mask);
 }
 
 void parseModes(struct ChanNode* chan, char *modeStr, char **argv, int argc) {
@@ -356,4 +382,3 @@ void getModeString(struct ChanNode* chan, char *modesStr) {
     #undef MODE_VALUE
     #undef MODE_VALUE_INDEX
 }
-