From: pk910 Date: Mon, 22 Aug 2011 07:48:05 +0000 (+0200) Subject: added cmd_myaccess X-Git-Tag: v5.3~497 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=bba410ac1b19b6c55475f3cc61449e4f0500ee63 added cmd_myaccess --- diff --git a/bot_NeonServ.c b/bot_NeonServ.c index fe07501..647b3e7 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -60,6 +60,14 @@ static const struct default_language_entry msgtab[] = { {"NS_SUSPEND_RESTORED", "\002%s\002's access to \002%s\002 has been restored." }, {"NS_DELME_KEY", "To really remove yourself, you must use 'deleteme %s'."}, {"NS_DELME_DONE", "Your \002%d\002 access has been deleted from \002%s\002."}, + {"NS_MYACCESS_HEADER", "Showing all channel entries for account \002%s\002:"}, + {"NS_MYACCESS_HEADER_MATCH", "Showing all channel entries for account \002%s\002 matching %s:"}, + {"NS_MYACCESS_HEADER_NAME", "Name"}, + {"NS_MYACCESS_HEADER_ACCESS", "Access"}, + {"NS_MYACCESS_HEADER_FLAGS", "Flags"}, + {"NS_MYACCESS_HEADER_INFO", "Info"}, + {"NS_MYACCESS_COUNT", "%s has access in \002%d\002 channel(s) and is owner of \002%d\002 channel(s)."}, + {"NS_MYACCESS_COUNT_MATCH", "%s has access in \002%d\002 channel(s) and is owner of \002%d\002 channel(s) (\002%d\002 channels matching your request)."}, {NULL, NULL} }; @@ -68,7 +76,7 @@ INCLUDE ALL CMD's HERE */ //USER CMD's #include "cmd_neonserv_a.c" -//#include "cmd_neonserv_myaccess.c" +#include "cmd_neonserv_myaccess.c" #include "cmd_neonserv_adduser.c" #include "cmd_neonserv_clvl.c" #include "cmd_neonserv_deluser.c" @@ -217,6 +225,7 @@ void init_NeonServ() { 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, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); register_command(BOTID, "delme", neonserv_cmd_delme, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); + register_command(BOTID, "myaccess", neonserv_cmd_myaccess, 0, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH); start_bots(); bind_bot_ready(neonserv_bot_ready); diff --git a/cmd_neonserv_myaccess.c b/cmd_neonserv_myaccess.c new file mode 100644 index 0000000..ccda707 --- /dev/null +++ b/cmd_neonserv_myaccess.c @@ -0,0 +1,155 @@ + +/* +* argv[0] - nick / *auth +*/ +static USERAUTH_CALLBACK(neonserv_cmd_myaccess_nick_lookup); +static void neonserv_cmd_myaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, char *chanmatch); + +struct neonserv_cmd_myaccess_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct ChanNode *chan; + char *nick; + char *chanmatch; +}; + +static CMD_BIND(neonserv_cmd_myaccess) { + char *chanmatch = NULL; + if(argc == 0 || argv[0][0] == '#') { + if(argc != 0) { + chanmatch = argv[0]; + } + if(!(user->flags & USERFLAG_ISAUTHED)) { + struct neonserv_cmd_myaccess_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]); + cache->chanmatch = (chanmatch ? strdup(chanmatch) : NULL); + get_userauth(user, neonserv_cmd_myaccess_nick_lookup, cache); + } else + neonserv_cmd_myaccess_async1(client, getTextBot(), user, chan, user->nick, user->auth, chanmatch); + } + else if(argv[0][0] == '*') { + //we've got an auth + if(argc > 1 && argv[1][0] == '#') { + chanmatch = argv[1]; + } + argv[0]++; + neonserv_cmd_myaccess_async1(client, getTextBot(), user, chan, NULL, argv[0], chanmatch); + } else { + if(argc > 1 && argv[1][0] == '#') { + chanmatch = argv[1]; + } + struct UserNode *cuser = getUserByNick(argv[0]); + if(!cuser) { + cuser = createTempUser(argv[0]); + cuser->flags |= USERFLAG_ISTMPUSER; + } + if(cuser->flags & USERFLAG_ISAUTHED) { + neonserv_cmd_myaccess_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, chanmatch); + } else { + struct neonserv_cmd_myaccess_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]); + cache->chanmatch = (chanmatch ? strdup(chanmatch) : NULL); + get_userauth(cuser, neonserv_cmd_myaccess_nick_lookup, cache); + } + } +} + +static USERAUTH_CALLBACK(neonserv_cmd_myaccess_nick_lookup) { + struct neonserv_cmd_myaccess_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 + if(!strcmp(cache->nick, cache->user->nick)) + reply(cache->textclient, cache->user, "NS_YOU_NEED_AUTH"); + else + reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick); + } + else + neonserv_cmd_myaccess_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->chanmatch); + if(cache->chanmatch) + free(cache->chanmatch); + free(cache->nick); + free(cache); +} + +static void neonserv_cmd_myaccess_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, char *chanmatch) { + //we've got a valid auth now... + MYSQL_RES *res; + MYSQL_ROW user_row, chanuser_row; + char flagBuf[5]; + int userid, cflags, caccess, flagPos; + int total_count, match_count = 0, owner_count = 0; + struct Table *table; + printf_mysql_query("SELECT `user_id`, `user_access`, `user_god` FROM `users` WHERE `user_user` = '%s'", escape_string(auth)); + res = mysql_use(); + total_count = mysql_num_rows(res); + table = table_init(4, total_count + 1, 0); + char *content[4]; + content[0] = get_language_string(user, "NS_MYACCESS_HEADER_NAME"); + content[1] = get_language_string(user, "NS_MYACCESS_HEADER_ACCESS"); + content[2] = get_language_string(user, "NS_MYACCESS_HEADER_FLAGS"); + content[3] = get_language_string(user, "NS_MYACCESS_HEADER_INFO"); + table_add(table, content); + if(chanmatch) + reply(textbot, user, "NS_MYACCESS_HEADER_MATCH", auth, chanmatch); + else + reply(textbot, user, "NS_MYACCESS_HEADER", auth); + if ((user_row = mysql_fetch_row(res)) != NULL) { + userid = atoi(user_row[0]); + //check if the user is already added + printf_mysql_query("SELECT `chanuser_access`, `chanuser_flags`, `chanuser_infoline`, `channel_name`, `channel_getop`, `channel_getvoice` FROM `chanusers` LEFT JOIN `channels` ON `chanuser_cid` = `channel_id` WHERE `chanuser_uid` = '%d' ORDER BY `chanuser_access` DESC, `channel_name` ASC", userid); + res = mysql_use(); + while ((chanuser_row = mysql_fetch_row(res)) != NULL) { + if(!strcmp(row[0], "500")) owner_count++; + if(chanmatch && match(chanmatch, row[0])) continue; + match_count++; + flagPos = 0; + content[0] = row[3]; + content[1] = row[0]; + cflags = atoi(row[1]); + caccess = atoi(row[0]); + if((cflags & DB_CHANUSER_SUSPENDED)) + flagPos += sprintf(flagBuf + flagPos, "s"); + if(caccess >= atoi(row[4])) + flagPos += sprintf(flagBuf + flagPos, "o"); + if(caccess >= atoi(row[5])) + flagPos += sprintf(flagBuf + flagPos, "v"); + if((cflags & DB_CHANUSER_AUTOINVITE)) + flagPos += sprintf(flagBuf + flagPos, "i"); + content[2] = flagBuf; + content[3] = row[2]; + table_add(table, content); + } + } + //send the table + char **table_lines = table_end(table); + for(i = 0; i < table->entrys; i++) { + reply(textclient, user, table_lines[i]); + } + if(!content_count) + reply(textclient, user, "NS_TABLE_NONE"); + if(chanmatch) { + reply(textbot, user, "NS_MYACCESS_COUNT_MATCH", auth, total_count, owner_count, match_count, chanmatch); + } else { + reply(textbot, user, "NS_MYACCESS_COUNT", auth, total_count, owner_count); + } +} diff --git a/cmd_neonserv_users.c b/cmd_neonserv_users.c index 5b6e065..f9a7173 100644 --- a/cmd_neonserv_users.c +++ b/cmd_neonserv_users.c @@ -53,7 +53,7 @@ static void neonserv_cmd_users_async1(struct ClientSocket *client, struct Client char seenstr[MAXLEN]; struct Table *table; struct ChanUser *chanuser; - printf_mysql_query("SELECT `chanuser_access`, `user_user`, `chanuser_seen`, `chanuser_flags` FROM `chanusers` LEFT JOIN `users` ON `chanuser_uid` = `user_id` WHERE `chanuser_cid` = '%d'", chan->channel_id); + printf_mysql_query("SELECT `chanuser_access`, `user_user`, `chanuser_seen`, `chanuser_flags` FROM `chanusers` LEFT JOIN `users` ON `chanuser_uid` = `user_id` WHERE `chanuser_cid` = '%d' ORDER BY `chanuser_access` DESC, `user_user` ASC", chan->channel_id); res = mysql_use(); table = table_init(4, mysql_num_rows(res) + 1, 0); if(usermask)