request and parse channel banlist on join
authorpk910 <philipp@zoelle1.de>
Wed, 14 Sep 2011 14:16:37 +0000 (16:16 +0200)
committerpk910 <philipp@zoelle1.de>
Wed, 14 Sep 2011 14:16:37 +0000 (16:16 +0200)
BanNode.c
BanNode.h
IRCParser.c

index 9be81b3c2ec8c62147d59cf886d57394b5f5acb3..9bdab6c4f5fe48d2ee7df92b74655244688764e7 100644 (file)
--- a/BanNode.c
+++ b/BanNode.c
@@ -11,6 +11,16 @@ struct BanNode* addChannelBan(struct ChanNode *chan, char *mask) {
     return ban;
 }
 
+struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask) {
+    struct BanNode *cban;
+    for(cban = chan->bans; cban; cban = cban->next) {
+        if(!match(cban->mask, mask)) {
+            return cban;
+        }
+    }
+    return NULL;
+}
+
 void removeChannelBanMask(struct ChanNode *chan, char *mask) {
     struct BanNode *cban, *last = NULL;
     for(cban = chan->bans; cban; cban = cban->next) {
index 5b3d406a614f5cc4ed87264ff3abc7d1b994cc0d..a699e3ffe02e8f079f77128483d09a405ca3be49 100644 (file)
--- a/BanNode.h
+++ b/BanNode.h
@@ -12,6 +12,7 @@ struct BanNode {
 };
 
 struct BanNode* addChannelBan(struct ChanNode *chan, char *mask);
+struct BanNode* getMatchingChannelBan(struct ChanNode *chan, char *mask);
 void removeChannelBanMask(struct ChanNode *chan, char *mask);
 void removeChannelBan(struct BanNode *ban);
 void removeChannelBans(struct ChanNode *chan);
index 04ec1446510e8b287817e45c74702557bd257d2b..4ed222335036a1d20a87d6b8db5ea5e4cc283359 100644 (file)
@@ -114,6 +114,7 @@ static IRC_CMD(raw_join) {
         struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot
         get_userlist(chan, got_channel_userlist, chanuser);
         putsock(client, "MODE %s", chan->name);
+        putsock(client, "MODE +b %s", chan->name);
     } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         struct ChanUser *chanuser = addChanUser(chan, user);
         event_join(chanuser);
@@ -342,10 +343,22 @@ static IRC_CMD(raw_mode) {
     return 1;
 }
 
+static IRC_CMD(raw_367) {
+    //Watchcat #pktest pk911!*@* TestBot!~bot@pktest.user.WebGamesNet 1315863279
+    struct ChanNode *chan = getChanByName(argv[1]);
+    if(!chan) return 0;
+    struct BanNode *ban;
+    while((ban = getMatchingChannelBan(chan, argv[2]))) {
+        removeChannelBan(ban);
+    }
+    addChannelBan(chan, argv[2]);
+}
+
 void init_parser() {
     //all the raws we receive...
     register_irc_function("001", raw_001);
     register_irc_function("324", raw_324);
+    register_irc_function("367", raw_367);
     register_irc_function("INVITE", raw_invite);
     register_irc_function("NOTICE", raw_notice);
     register_irc_function("TOPIC", raw_topic);