From 5e1959c87d0bebe0c93b6bb42d6fddd2f45a569e Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 21 Aug 2011 08:36:49 +0200 Subject: [PATCH] added cmd_suspend and cmd_unsuspend --- bot_NeonServ.c | 19 ++++++--- cmd_neonserv_suspend.c | 92 ++++++++++++++++++++++++++++++++++++++++ cmd_neonserv_unsuspend.c | 92 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 cmd_neonserv_suspend.c create mode 100644 cmd_neonserv_unsuspend.c diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 4cc7bde..060a3f1 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -53,7 +53,10 @@ static const struct default_language_entry msgtab[] = { {"NS_USERS_SEEN_NEVER", "Never"}, {"NS_USERS_STATE_SUSPENDED", "Suspended"}, {"NS_USERS_STATE_NORMAL", "Normal"}, - + {"NS_SUSPEND_ALREADY", "$b%s$b is already suspended." }, + {"NS_SUSPEND_NOT", "$b%s$b is not suspended." }, + {"NS_SUSPEND_DONE", "$b%s$b's access to $b%s$b has been suspended." }, + {"NS_SUSPEND_RESTORED", "$b%s$b's access to $b%s$b has been restored." }, {NULL, NULL} }; @@ -66,6 +69,8 @@ INCLUDE ALL CMD's HERE #include "cmd_neonserv_deluser.c" #include "cmd_neonserv_clvl.c" #include "cmd_neonserv_a.c" +#include "cmd_neonserv_suspend.c" +#include "cmd_neonserv_unsuspend.c" static void neonserv_bot_ready(struct ClientSocket *client) { MYSQL_RES *res; @@ -130,11 +135,13 @@ void init_NeonServ() { register_command(BOTID, "modes", neonserv_cmd_modes, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - register_command(BOTID, "adduser", neonserv_cmd_adduser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - register_command(BOTID, "deluser", neonserv_cmd_deluser, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - register_command(BOTID, "clvl", neonserv_cmd_clvl, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); - register_command(BOTID, "a", neonserv_cmd_a, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); - register_command(BOTID, "users", neonserv_cmd_users, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); + register_command(BOTID, "adduser", neonserv_cmd_adduser, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "deluser", neonserv_cmd_deluser, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "clvl", neonserv_cmd_clvl, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "a", neonserv_cmd_a, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); + register_command(BOTID, "users", neonserv_cmd_users, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN); + register_command(BOTID, "suspend", neonserv_cmd_suspend, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "unsuspend", neonserv_cmd_unsuspend, 2, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_suspend.c b/cmd_neonserv_suspend.c new file mode 100644 index 0000000..37d205e --- /dev/null +++ b/cmd_neonserv_suspend.c @@ -0,0 +1,92 @@ + +/* +* argv[0] - nick / *auth +*/ +static USERAUTH_CALLBACK(neonserv_cmd_suspend_nick_lookup); +static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth); + +struct neonserv_cmd_suspend_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_suspend) { + check_mysql(); + checkChannelAccess(user, chan, "channel_cansuspend", 1, 0); + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, argv[0], argv[0]); + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_suspend_async1(client, getTextBot(), user, chan, argv[0], cuser->auth); + } else { + struct neonserv_cmd_suspend_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_suspend_nick_lookup, cache); + } + } +} + +static USERAUTH_CALLBACK(neonserv_cmd_suspend_nick_lookup) { + struct neonserv_cmd_suspend_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_suspend_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_suspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row; + int userid, cflags; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + //check if the user is added + printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) { + reply(textclient, user, "NS_USER_OUTRANKED", nick); + return; + } + //suspend + cflags = atoi(row[2]); + if(cflags & DB_CHANUSER_SUSPENDED) { + reply(textclient, user, "NS_SUSPEND_ALREADY", nick); + return; + } + cflags |= DB_CHANUSER_SUSPENDED; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", cflags, row[1]); + reply(textclient, user, "NS_SUSPEND_DONE", nick, chan->name); + return; + } + } + reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); +} diff --git a/cmd_neonserv_unsuspend.c b/cmd_neonserv_unsuspend.c new file mode 100644 index 0000000..4b8ace2 --- /dev/null +++ b/cmd_neonserv_unsuspend.c @@ -0,0 +1,92 @@ + +/* +* argv[0] - nick / *auth +*/ +static USERAUTH_CALLBACK(neonserv_cmd_unsuspend_nick_lookup); +static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth); + +struct neonserv_cmd_unsuspend_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_unsuspend) { + check_mysql(); + checkChannelAccess(user, chan, "channel_canunsuspend", 1, 0); + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, argv[0], argv[0]); + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_unsuspend_async1(client, getTextBot(), user, chan, argv[0], cuser->auth); + } else { + struct neonserv_cmd_unsuspend_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->chan = chan; + cache->nick = strdup(argv[0]); + get_userauth(cuser, neonserv_cmd_unsuspend_nick_lookup, cache); + } + } +} + +static USERAUTH_CALLBACK(neonserv_cmd_unsuspend_nick_lookup) { + struct neonserv_cmd_unsuspend_cache *cache = data; + if(!user) { + //USER_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick); + } + else if(!(user->flags & USERFLAG_ISAUTHED)) { + //USER_NOT_AUTHED + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_unsuspend_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_unsuspend_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW row; + int userid, cflags; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + userid = atoi(row[0]); + //check if the user is added + printf_mysql_query("SELECT `chanuser_access`, `chanuser_id`, `chanuser_flags` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + if(atoi(row[0]) >= getChannelAccess(user, chan, 1)) { + reply(textclient, user, "NS_USER_OUTRANKED", nick); + return; + } + //unsuspend + cflags = atoi(row[2]); + if(!(cflags & DB_CHANUSER_SUSPENDED)) { + reply(textclient, user, "NS_SUSPEND_NOT", nick); + return; + } + cflags &= ~DB_CHANUSER_SUSPENDED; + printf_mysql_query("UPDATE `chanusers` SET `chanuser_flags` = '%d' WHERE `chanuser_id` = '%s'", cflags, row[1]); + reply(textclient, user, "NS_SUSPEND_RESTORED", nick, chan->name); + return; + } + } + reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); +} -- 2.20.1