From 9848d79344030c4b6870e5e824bd3818d7259a7a Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 9 Sep 2011 01:31:40 +0200 Subject: [PATCH] finished cmd_addban --- DBHelper.c | 16 ++++++++++++++-- DBHelper.h | 2 ++ bot_NeonServ.c | 1 + cmd_neonserv_addban.c | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/DBHelper.c b/DBHelper.c index c8efb6b..5e9005d 100644 --- a/DBHelper.c +++ b/DBHelper.c @@ -5,7 +5,7 @@ #include "ChanUser.h" #include "mysqlConn.h" #include "lang.h" - +#include "tools.h" void _loadUserSettings(struct UserNode *user) { check_mysql(); @@ -154,4 +154,16 @@ int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserN return 0; } - +char *getBanAffectingMask(struct ChanNode *chan, char *mask) { + loadChannelSettings(chan); + if(!(chan->flags & CHANFLAG_CHAN_REGISTERED)) return 0; + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `ban_mask` FROM `bans` WHERE `ban_channel` = '%d'", chan->channel_id); + res = mysql_use(); + while ((row = mysql_fetch_row(res)) != NULL) { + if(!match(row[0], mask)) + return row[0]; + } + return NULL; +} diff --git a/DBHelper.h b/DBHelper.h index 5c0c16d..af4cc32 100644 --- a/DBHelper.h +++ b/DBHelper.h @@ -19,4 +19,6 @@ void _loadChannelSettings(struct ChanNode *chan); #define loadChannelSettings(CHAN) if(!(CHAN->flags & CHANFLAG_REQUESTED_CHANINFO)) _loadChannelSettings(CHAN) int isUserProtected(struct ChanNode *chan, struct UserNode *victim, struct UserNode *issuer); +char *getBanAffectingMask(struct ChanNode *chan, char *mask); //returns bans that match a given mask eg. *!*@ab* if you pass *!*@abcdefg.* + #endif \ No newline at end of file diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 7a0a772..5920dc2 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -37,6 +37,7 @@ static const struct default_language_entry msgtab[] = { {"NS_USER_PROTECTED", "Sorry, \002%s\002 is protected."}, {"NS_SERVICE_IMMUNE", "\002%s\002 may not be kicked, killed, banned, or deopped."}, {"NS_TABLE_NONE", " None"}, + {"NS_BAN_ALREADY_ADDED", "\002%s\002 is already banned in %s."}, {"NS_INVALID_ACCESS_RANGE", "Invalid access range; minimum (%d) must be lower than maximum (%d)."}, {"NS_CLVL_DONE", "%s now has access \002%d\002 in %s."}, {"NS_A_LACKS_ACCESS_BUT_GOD_NICK", "%s lacks access to %s but has \002security override\002 enabled."}, diff --git a/cmd_neonserv_addban.c b/cmd_neonserv_addban.c index 245190b..1e476ef 100644 --- a/cmd_neonserv_addban.c +++ b/cmd_neonserv_addban.c @@ -68,6 +68,21 @@ static void neonserv_cmd_addban_async1(struct ClientSocket *client, struct Clien } MYSQL_RES *res; MYSQL_ROW row; + //check if the provided mask is already banned by another ban + char *ban = getBanAffectingMask(chan, mask); + if(ban != NULL) { + reply(textclient, user, "NS_BAN_ALREADY_ADDED", ban, chan->name); + return; + } + //check if the provided mask affects any existing bans + printf_mysql_query("SELECT `ban_mask`, `ban_id` FROM `bans` WHERE `ban_channel` = '%d'", chan->channel_id); + res = mysql_use(); + while ((row = mysql_fetch_row(res)) != NULL) { + if(!match(mask, row[0])) { + //remove the ban + printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", row[1]); + } + } printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth)); int userid; res = mysql_use(); -- 2.20.1