From: pk910 Date: Tue, 20 Sep 2011 19:41:32 +0000 (+0200) Subject: added cmd_unban, cmd_unbanall, cmd_unbanme X-Git-Tag: v5.3~395 X-Git-Url: http://git.pk910.de/?a=commitdiff_plain;h=c35fe8f204befa76c98c4c5d78ddda69233fef96;p=NeonServV5.git added cmd_unban, cmd_unbanall, cmd_unbanme --- diff --git a/WHOHandler.c b/WHOHandler.c index 4f96756..f924e46 100644 --- a/WHOHandler.c +++ b/WHOHandler.c @@ -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); diff --git a/WHOHandler.h b/WHOHandler.h index 0ce05ef..31485f8 100644 --- a/WHOHandler.h +++ b/WHOHandler.h @@ -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); diff --git a/bot_NeonServ.c b/bot_NeonServ.c index d77383d..a2fd986 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -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 index 0000000..d4f9dc6 --- /dev/null +++ b/cmd_neonserv_unban.c @@ -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 index 0000000..c59576d --- /dev/null +++ b/cmd_neonserv_unbanall.c @@ -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 index 0000000..0ad6304 --- /dev/null +++ b/cmd_neonserv_unbanme.c @@ -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 e8080e2..54a0cfa 100644 --- 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);