added cmd_unban, cmd_unbanall, cmd_unbanme
authorpk910 <philipp@zoelle1.de>
Tue, 20 Sep 2011 19:41:32 +0000 (21:41 +0200)
committerpk910 <philipp@zoelle1.de>
Tue, 20 Sep 2011 19:50:33 +0000 (21:50 +0200)
WHOHandler.c
WHOHandler.h
bot_NeonServ.c
cmd_neonserv_unban.c [new file with mode: 0644]
cmd_neonserv_unbanall.c [new file with mode: 0644]
cmd_neonserv_unbanme.c [new file with mode: 0644]
tools.h

index 4f9675663c79598bf5d8846ec93e695ee570970f..f924e463f7bf1c44eb826a7133f9669e932751bd 100644 (file)
@@ -179,7 +179,7 @@ void recv_whohandler_354(struct ClientSocket *client, char **argv, unsigned int
             entry->user->flags |= USERFLAG_ISAUTHED;
         }
         userauth_callback_t *callback = entry->callback;
-        callback(client, entry->user, entry->data);
+        callback(client, entry->user->nick, entry->user, entry->data);
     }
 }
 
@@ -208,7 +208,7 @@ void recv_whohandler_315(struct ClientSocket *client, char **argv, unsigned int
     } else if(type & WHOQUEUETYPE_USERAUTH) {
         if(!(entry->type & WHOQUEUETYPE_FOUND)) {
             userauth_callback_t *callback = entry->callback;
-            callback(client, NULL, entry->data);
+            callback(client, entry->user->nick, NULL, entry->data);
         }
     }
     free(entry);
index 0ce05efc7fabbbe13fddaaf6bb6ff1785c2ec7f4..31485f82d9eb87436e99939871e2fa4e594337fd 100644 (file)
@@ -10,7 +10,7 @@ struct UserNode;
 #define USERLIST_CALLBACK(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(struct ChanNode *chan), UNUSED_ARG(void *data))
 typedef USERLIST_CALLBACK(userlist_callback_t);
 
-#define USERAUTH_CALLBACK(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(struct UserNode *user), UNUSED_ARG(void *data))
+#define USERAUTH_CALLBACK(NAME) void NAME(UNUSED_ARG(struct ClientSocket *client), UNUSED_ARG(char *user_nick), UNUSED_ARG(struct UserNode *user), UNUSED_ARG(void *data))
 typedef USERAUTH_CALLBACK(userauth_callback_t);
 
 void recv_whohandler_354(struct ClientSocket *client, char **argv, unsigned int argc);
index d77383d74f33e95424a506a968442fcb98449b49..a2fd98619736beff53c04c8495dbddaacf831bfb 100644 (file)
@@ -110,7 +110,7 @@ static const struct default_language_entry msgtab[] = {
     {"NS_KICKBAN_DONE", "KickBanned $b%d$b users from %s"}, /* {ARGS: 10, "#TestChan"} */
     {"NS_KICKBAN_FAIL", "$b%s$b could not kickban some of the nicks you provided."}, /* {ARGS: "NeonServ"} */
     {"NS_BAN_DONE", "$b%d$b masks added to the %s ban list. (matching %d users)"}, /* {ARGS: 5, "#TestChan", 15} */
-    {"NS_BAN_FAIL", "$b%s$b could not kickban some of the nicks you provided."}, /* {ARGS: "NeonServ"} */
+    {"NS_BAN_FAIL", "$b%s$b could not ban some of the nicks you provided."}, /* {ARGS: "NeonServ"} */
     {"NS_LAME_MASK", "$b%s$b is a little too general. Try making it more specific."}, /* {ARGS: "*!*@*"} */
     {"NS_SET_HEADER", "Channel Settings for %s:"}, /* {ARGS: "#TestChan"} */
     {"NS_SET_ON", "on"},
@@ -189,6 +189,12 @@ static const struct default_language_entry msgtab[] = {
     {"NS_USET_UNKNOWN_SETTING", "$b%s$b is an unknown uset setting."}, /* {ARGS: "TestSetting"} */
     {"NS_RELOADLANG_UNKNOWN", "$b%s$b is an unknown language tag."}, /* {ARGS: "de"} */
     {"NS_RELOADLANG_DONE", "$b%s$b (%s) reloaded."}, /* {ARGS: "Deutsch", "de"} */
+    {"NS_UNBAN_DONE", "$b%d$b masks removed from the %s ban list."}, /* {ARGS: 5, "#TestChan"} */
+    {"NS_UNBAN_FAIL", "$b%s$b could not unban some of the masks you provided."}, /* {ARGS: "NeonServ"} */
+    {"NS_UNBANALL_DONE", "all $b%d$b masks removed from the %s ban list."}, /* {ARGS: 5, "#TestChan"} */
+    {"NS_UNBANALL_FAIL", "$b%s$b could not find any bans in %s."}, /* {ARGS: "NeonServ", "#TestChan"} */
+    {"NS_UNBANME_DONE", "removed $b%d$b masks from the %s ban list."}, /* {ARGS: 5, "#TestChan"} */
+    {"NS_UNBANME_FAIL", "$b%s$b could not find any bans matching %s."}, /* {ARGS: "NeonServ", "TestUser!TestIdent@TestUser.user.WebGamesNet"} */
     {NULL, NULL}
 };
 
@@ -225,9 +231,9 @@ INCLUDE ALL CMD's HERE
 #include "cmd_neonserv_kick.c"
 #include "cmd_neonserv_kickban.c"
 #include "cmd_neonserv_ban.c"
-//#include "cmd_neonserv_unban.c"
-//#include "cmd_neonserv_unbanall.c"
-//#include "cmd_neonserv_unbanme.c"
+#include "cmd_neonserv_unban.c"
+#include "cmd_neonserv_unbanall.c"
+#include "cmd_neonserv_unbanme.c"
 #include "cmd_neonserv_suspend.c"
 #include "cmd_neonserv_unsuspend.c"
 #include "cmd_neonserv_wipeinfo.c"
@@ -424,6 +430,9 @@ void init_NeonServ() {
     register_command(BOTID, "peek",         neonserv_cmd_peek,      0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN,                                              NULL,                   0);
     //register_command(BOTID, "info",         neonserv_cmd_info,      0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN,                                              NULL,                   0);
     register_command(BOTID, "uset",         neonserv_cmd_uset,      0, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,                                                   NULL,                   0);
+    register_command(BOTID, "unban",        neonserv_cmd_unban,     1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,  "#channel_canban",      0);
+    register_command(BOTID, "unbanall",     neonserv_cmd_unbanall,  0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,  "#channel_canban",      0);
+    register_command(BOTID, "unbanme",      neonserv_cmd_unbanme,   0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,  "#channel_canban",      0);
     
     register_command(BOTID, "trace",        neonserv_cmd_trace,     1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH,                                                   NULL,                   400);
     register_command(BOTID, "register",     neonserv_cmd_register,  2, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_CHAN_PARAM | CMDFLAG_OPLOG,              NULL,                   100);
diff --git a/cmd_neonserv_unban.c b/cmd_neonserv_unban.c
new file mode 100644 (file)
index 0000000..d4f9dc6
--- /dev/null
@@ -0,0 +1,124 @@
+
+/*
+* argv[0-*]    nick[,*auth[,*!*@mask[...]]]
+*/
+struct neonserv_cmd_unban_cache {
+    struct ClientSocket *client, *textclient;
+    struct UserNode *user;
+    struct ChanNode *chan;
+    struct Event *event;
+    struct ModeBuffer *modeBuf;
+    int provided_masks, done_masks, pending_whos, unbanned_masks;
+};
+
+static USERAUTH_CALLBACK(neonserv_cmd_unban_userauth_lookup);
+static void neonserv_cmd_unban_nick(struct neonserv_cmd_unban_cache *cache, struct UserNode *user);
+static void neonserv_cmd_unban_mask(struct neonserv_cmd_unban_cache *cache, char *mask);
+static void neonserv_cmd_unban_finish(struct neonserv_cmd_unban_cache *cache);
+
+static CMD_BIND(neonserv_cmd_unban) {
+    char *mask, *nextmask;
+    struct ModeBuffer *modeBuf;
+    modeBuf = initModeBuffer(client, chan);
+    nextmask = merge_argv_char(argv, 0, argc, ',');
+    struct neonserv_cmd_unban_cache *cache = malloc(sizeof(*cache));
+    if (!cache) {
+        perror("malloc() failed");
+        return;
+    }
+    cache->client = client;
+    cache->textclient = getTextBot();
+    cache->user = user;
+    cache->chan = chan;
+    cache->event = event;
+    cache->modeBuf = modeBuf;
+    cache->done_masks = 0;
+    cache->provided_masks = 0;
+    cache->unbanned_masks = 0;
+    while((mask = nextmask)) {
+        nextmask = strstr(mask, ",");
+        if(nextmask) {
+            *nextmask = '\0';
+            nextmask++;
+        }
+        cache->provided_masks++;
+        if(is_valid_nick(mask)) {
+            struct UserNode *cuser = getUserByNick(mask);
+            if(!cuser) {
+                cuser = createTempUser(mask);
+                cuser->flags |= USERFLAG_ISTMPUSER;
+                get_userauth(cuser, neonserv_cmd_unban_userauth_lookup, cache);
+                cache->pending_whos++;
+            } else {
+                neonserv_cmd_unban_nick(cache, cuser);
+            }
+        } else {
+            neonserv_cmd_unban_mask(cache, mask);
+        }
+    }
+    if(!cache->pending_whos)
+        neonserv_cmd_unban_finish(cache);
+}
+
+static USERAUTH_CALLBACK(neonserv_cmd_unban_userauth_lookup) {
+    struct neonserv_cmd_unban_cache *cache = data;
+    cache->pending_whos--;
+    if(user)
+        neonserv_cmd_unban_nick(cache, user);
+    else
+        neonserv_cmd_unban_mask(cache, user_nick);
+    if(!cache->pending_whos)
+        neonserv_cmd_unban_finish(cache);
+}
+
+static void neonserv_cmd_unban_nick(struct neonserv_cmd_unban_cache *cache, struct UserNode *user) {
+    int matches = 0;
+    struct BanNode *ban;
+    char usermask[NICKLEN+USERLEN+HOSTLEN+3];
+    sprintf(usermask, "%s!%s@%s", user->nick, user->ident, user->host);
+    for(ban = cache->chan->bans; ban; ban = ban->next) {
+        if(!match(ban->mask, usermask)) {
+            modeBufferUnban(cache->modeBuf, ban->mask);
+            cache->unbanned_masks++;
+            matches++;
+        }
+    }
+    if(matches)
+        cache->done_masks++;
+}
+
+static void neonserv_cmd_unban_mask(struct neonserv_cmd_unban_cache *cache, char *mask) {
+    char banmask[NICKLEN+USERLEN+HOSTLEN+3];
+    int matches = 0;
+    struct BanNode *ban;
+    mask = make_banmask(mask, banmask);
+    for(ban = cache->chan->bans; ban; ban = ban->next) {
+        if(!match(mask, ban->mask)) {
+            modeBufferUnban(cache->modeBuf, ban->mask);
+            cache->unbanned_masks++;
+            matches++;
+        }
+    }
+    if(matches)
+        cache->done_masks++;
+    else {
+        for(ban = cache->chan->bans; ban; ban = ban->next) {
+            if(!match(ban->mask, mask)) {
+                reply(cache->textclient, cache->user, "NS_DELBAN_BANNED_BY", mask, ban->mask);
+                break;
+            }
+        }
+    }
+}
+
+static void neonserv_cmd_unban_finish(struct neonserv_cmd_unban_cache *cache) {
+    freeModeBuffer(cache->modeBuf);
+    if(cache->done_masks == cache->provided_masks)
+        reply(cache->textclient, cache->user, "NS_UNBAN_DONE", cache->unbanned_masks, cache->chan->name);
+    else
+        reply(cache->textclient, cache->user, "NS_UNBAN_FAIL", cache->client->user->nick);
+    if(cache->done_masks)
+        logEvent(cache->event);
+    free(cache);
+}
+
diff --git a/cmd_neonserv_unbanall.c b/cmd_neonserv_unbanall.c
new file mode 100644 (file)
index 0000000..c59576d
--- /dev/null
@@ -0,0 +1,21 @@
+
+/*
+* argv[0-*]    nothing
+*/
+
+static CMD_BIND(neonserv_cmd_unbanall) {
+    struct ModeBuffer *modeBuf;
+    int bans = 0;
+    struct BanNode *ban;
+    modeBuf = initModeBuffer(client, chan);
+    for(ban = chan->bans; ban; ban = ban->next) {
+        modeBufferUnban(modeBuf, ban->mask);
+        bans++;
+    }
+    freeModeBuffer(modeBuf);
+    if(bans) {
+        reply(getTextBot(), user, "NS_UNBANALL_DONE", bans, chan->name);
+        logEvent(event);
+    } else
+        reply(getTextBot(), user, "NS_UNBANALL_FAIL", client->user->nick, chan->name);
+}
diff --git a/cmd_neonserv_unbanme.c b/cmd_neonserv_unbanme.c
new file mode 100644 (file)
index 0000000..0ad6304
--- /dev/null
@@ -0,0 +1,25 @@
+
+/*
+* argv[0-*]    nothing
+*/
+
+static CMD_BIND(neonserv_cmd_unbanme) {
+    struct ModeBuffer *modeBuf;
+    int bans = 0;
+    struct BanNode *ban;
+    modeBuf = initModeBuffer(client, chan);
+    char usermask[NICKLEN+USERLEN+HOSTLEN+3];
+    sprintf(usermask, "%s!%s@%s", user->nick, user->ident, user->host);
+    for(ban = chan->bans; ban; ban = ban->next) {
+        if(!match(ban->mask, usermask)) {
+            modeBufferUnban(modeBuf, ban->mask);
+            bans++;
+        }
+    }
+    freeModeBuffer(modeBuf);
+    if(bans) {
+        reply(getTextBot(), user, "NS_UNBANME_DONE", bans, chan->name);
+        logEvent(event);
+    } else
+        reply(getTextBot(), user, "NS_UNBANME_FAIL", client->user->nick, usermask);
+}
diff --git a/tools.h b/tools.h
index e8080e27e9d802930dbffa91620b3a1b123b1357..54a0cfa9e7ec8489732350b022f785f1e15e0fc9 100644 (file)
--- a/tools.h
+++ b/tools.h
@@ -55,6 +55,7 @@ struct ModeBuffer* initModeBuffer(struct ClientSocket *client, struct ChanNode *
 #define modeBufferVoice(MODEBUF,USER) modeBufferSet(MODEBUF, 1, 'v', USER)
 #define modeBufferDevoice(MODEBUF,USER) modeBufferSet(MODEBUF, 0, 'v', USER) 
 #define modeBufferBan(MODEBUF,MASK) modeBufferSet(MODEBUF, 1, 'b', MASK) 
+#define modeBufferUnban(MODEBUF,MASK) modeBufferSet(MODEBUF, 0, 'b', MASK) 
 void modeBufferSet(struct ModeBuffer *modeBuf, int add, char mode, char *param);
 void flushModeBuffer(struct ModeBuffer *modeBuf);
 void freeModeBuffer(struct ModeBuffer *modeBuf);