added simple channel ban cache
authorpk910 <philipp@zoelle1.de>
Sun, 28 Aug 2011 13:55:59 +0000 (15:55 +0200)
committerpk910 <philipp@zoelle1.de>
Sun, 28 Aug 2011 13:55:59 +0000 (15:55 +0200)
BanNode.c [new file with mode: 0644]
BanNode.h [new file with mode: 0644]
ChanNode.c
ChanNode.h

diff --git a/BanNode.c b/BanNode.c
new file mode 100644 (file)
index 0000000..45ba199
--- /dev/null
+++ b/BanNode.c
@@ -0,0 +1,54 @@
+
+#include "BanNode.h"
+#include "ChanNode.h"
+
+struct BanNode* addChannelBan(struct ChanNode *chan, char *mask) {
+    struct BanNode *ban = malloc(sizeof(*ban));
+    ban->chan = chan;
+    ban->mask = strdup(mask);
+    ban->next = chan->bans;
+    chan->bans = ban;
+}
+
+void removeChannelBanMask(struct ChanNode *chan, char *mask) {
+    struct BanNode *cban, *last = NULL;
+    for(cban = chan->bans; cban; cban = cban->next) {
+        if(!strcmp(cban->mask, mask)) {
+            if(last)
+                last->next = ban->next;
+            else
+                chan->bans = ban->next;
+            free(ban->mask);
+            free(ban);
+            break;
+        } else 
+            last = ban;
+    }
+}
+
+void removeChannelBan(struct BanNode *ban) {
+    struct BanNode *cban, *last = NULL;
+    struct ChanNode *chan = ban->chan;
+    for(cban = chan->bans; cban; cban = cban->next) {
+        if(cban == ban) {
+            if(last)
+                last->next = ban->next;
+            else
+                chan->bans = ban->next;
+            free(ban->mask);
+            free(ban);
+            break;
+        } else 
+            last = ban;
+    }
+}
+
+void removeChannelBans(struct ChanNode *chan) {
+    struct BanNode *ban, *next;
+    for(ban = chan->bans; ban; ban = next) {
+        next = ban->next;
+        free(ban->mask);
+        free(ban);
+    }
+    channel->bans = NULL;
+}
diff --git a/BanNode.h b/BanNode.h
new file mode 100644 (file)
index 0000000..56937e7
--- /dev/null
+++ b/BanNode.h
@@ -0,0 +1,19 @@
+#ifndef _BanNode_h
+#define _BanNode_h
+#include "main.h"
+
+struct ChanNode;
+
+struct BanNode {
+    char *mask;
+    struct ChanNode *chan;
+    
+    struct BanNode *next;
+};
+
+struct BanNode* addChannelBan(struct ChanNode *chan, char *mask);
+void removeChannelBanMask(char *mask);
+void removeChannelBan(struct BanNode *ban);
+void removeChannelBans(struct ChanNode *chan);
+
+#endif
\ No newline at end of file
index e00acb601866ee6428046b2671fb640c321b7a81..7313bf347d1515c612d247a9a23b662d3d2dbae9 100644 (file)
@@ -156,6 +156,7 @@ 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;
@@ -278,7 +279,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) {
index 8b8808ca9963e5a5783fdf73a0693a10231e2bc5..213f8aea193815e5ce844d7bdba4f09bdd9cf659 100644 (file)
@@ -18,8 +18,9 @@ struct ChanNode {
     unsigned int modes;
     char **mode_str_args;
     int *mode_int_args;
-    struct UserNode *chanbot;
+    struct BanNode *bans;
     
+    struct UserNode *chanbot;
     struct trigger_cache *trigger;
     int channel_id;