From: pk910 Date: Fri, 19 Aug 2011 03:01:50 +0000 (+0200) Subject: cmd_neonserv_deluser added X-Git-Tag: v5.3~517 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=95b8a45a27830cd378e415c675e3838eb88d769b cmd_neonserv_deluser added --- diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 8621d92..5d4d977 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -21,7 +21,8 @@ static const struct default_language_entry msgtab[] = { {"NS_INVALID_ACCESS", "\002%d\002 is an invalid access level."}, {"NS_ADDUSER_ALREADY_ADDED", "%s is already on the \002%s\002 user list (with access %d)."}, {"NS_ADDUSER_DONE", "Added %s to the %s user list with access %d."}, - + {"NS_NOT_ON_USERLIST", "%s lacks access to \002%s\002."}, + {"NS_DELUSER_DONE", "Deleted %s (with access %d) from the %s user list."}, {NULL, NULL} }; @@ -31,6 +32,7 @@ INCLUDE ALL CMD's HERE #include "cmd_neonserv_users.c" #include "cmd_neonserv_modes.c" #include "cmd_neonserv_adduser.c" +#include "cmd_neonserv_deluser.c" static void neonserv_bot_ready(struct ClientSocket *client) { MYSQL_RES *res; @@ -97,6 +99,7 @@ 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); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_deluser.c b/cmd_neonserv_deluser.c new file mode 100644 index 0000000..b98e7f3 --- /dev/null +++ b/cmd_neonserv_deluser.c @@ -0,0 +1,114 @@ + +/* +* argv[0] - nick / *auth +*/ +static AUTHLOOKUP_CALLBACK(neonserv_cmd_deluser_auth_lookup); +static USERAUTH_CALLBACK(neonserv_cmd_deluser_nick_lookup); +static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth); + +struct neonserv_cmd_deluser_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + char *nick; +}; + +static CMD_BIND(neonserv_cmd_deluser) { + int caccess; + MYSQL_RES *res; + MYSQL_ROW row; + check_mysql(); + if(argv[0][0] == '*') { + //we've got an auth + argv[0]++; + printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0])); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], row[0]); + } else { + //we need to create a new user... + //but first lookup the auth to check if it really exists + struct neonserv_cmd_deluser_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]); + lookup_authname(argv[0], neonserv_cmd_deluser_auth_lookup, cache); + } + } else { + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth); + } else { + struct neonserv_cmd_deluser_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_deluser_nick_lookup, cache); + } + } +} + +static AUTHLOOKUP_CALLBACK(neonserv_cmd_deluser_auth_lookup) { + struct neonserv_cmd_deluser_cache *cache = data; + if(!exists) { + //AUTH_DOES_NOT_EXIST + reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick); + } else + neonserv_cmd_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth); + free(cache->nick); + free(cache); +} + +static USERAUTH_CALLBACK(neonserv_cmd_deluser_nick_lookup) { + struct neonserv_cmd_deluser_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_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_deluser_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; + 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 already added + printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) { + //delete + printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_id` = '%s'", row[1]); + reply(textclient, user, "NS_DELUSER_DONE", nick, atoi(row[0]), chan->name); + return; + } + } + reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name); +}