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);
}
}
} 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);
#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);
{"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"},
{"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}
};
#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"
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);
--- /dev/null
+
+/*
+* 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);
+}
+
--- /dev/null
+
+/*
+* 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);
+}
--- /dev/null
+
+/*
+* 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);
+}
#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);