From 783992c8c47d0ef40d0cf127fa7626bc24b7b703 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 12 Sep 2011 00:16:55 +0200 Subject: [PATCH] made cmd_voice checking invisible users --- cmd_neonserv_voice.c | 67 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/cmd_neonserv_voice.c b/cmd_neonserv_voice.c index 850326c..d4e385d 100644 --- a/cmd_neonserv_voice.c +++ b/cmd_neonserv_voice.c @@ -2,25 +2,70 @@ /* * argv[0-*] nicks */ +static USERLIST_CALLBACK(neonserv_cmd_voice_userlist_lookup); +static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks); + +struct neonserv_cmd_voice_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + char *nicks; +}; static CMD_BIND(neonserv_cmd_voice) { - int i, done_users = 0; + struct neonserv_cmd_voice_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->nicks = strdup(merge_argv(argv, 0, argc)); + get_userlist_with_invisible(chan, neonserv_cmd_voice_userlist_lookup, cache); +} + +static USERLIST_CALLBACK(neonserv_cmd_voice_userlist_lookup) { + struct neonserv_cmd_voice_cache *cache = data; + neonserv_cmd_voice_async1(cache->client, cache->textclient, cache->user, chan, cache->nicks); + free(cache->nicks); + free(cache); +} + +static void neonserv_cmd_voice_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nicks) { + int total_users = 0, done_users = 0; struct UserNode *cuser; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; modeBuf = initModeBuffer(client, chan); - for(i = 0; i < argc; i++) { - cuser = searchUserByNick(argv[i]); - if(!cuser) continue; - chanuser = getChanUser(cuser, chan); - if(!chanuser) continue; + char *a, *b = nicks; + do { + a = strstr(b, " "); + if(a) *a = '\0'; + total_users++; + cuser = searchUserByNick(b); + if(!cuser) { + //check for an invisible user + for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { + if(!stricmp(chanuser->user->nick, b)) { + cuser = chanuser->user; + break; + } + } + if(!cuser) continue; + } else { + chanuser = getChanUser(cuser, chan); + if(!chanuser) continue; + } done_users++; if(chanuser->flags & CHANUSERFLAG_VOICED) continue; - modeBufferVoice(modeBuf, argv[i]); - } + modeBufferVoice(modeBuf, b); + if(a) { + b = a+1; + } + } while(a); freeModeBuffer(modeBuf); - if(done_users == argc) - reply(getTextBot(), user, "NS_VOICE_DONE", chan->name); + if(done_users == total_users) + reply(textclient, user, "NS_VOICE_DONE", chan->name); else - reply(getTextBot(), user, "NS_VOICE_FAIL", client->user->nick); + reply(textclient, user, "NS_VOICE_FAIL", client->user->nick); } -- 2.20.1