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