X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=cmd_neonserv_voice.c;h=45a78a921f501940b82dc85143534b7dafef49ac;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=a69deb850751f31a50e233bd9840608f18930e25;hpb=fb1dee61840455a6669c868f30701e963cdfa629;p=NeonServV5.git diff --git a/cmd_neonserv_voice.c b/cmd_neonserv_voice.c index a69deb8..45a78a9 100644 --- a/cmd_neonserv_voice.c +++ b/cmd_neonserv_voice.c @@ -1,31 +1,77 @@ +#include "cmd_neonserv.h" + /* * 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, struct Event *event, char *nicks); + +struct neonserv_cmd_voice_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + char *nicks; +}; + +CMD_BIND(neonserv_cmd_voice) { + 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->event = event; + cache->nicks = strdup(merge_argv(argv, 0, argc)); + get_userlist_with_invisible(chan, neonserv_cmd_voice_userlist_lookup, cache); +} -static CMD_BIND(neonserv_cmd_voice) { - int i, done_users = 0; +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->event, 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, struct Event *event, char *nicks) { + int total_users = 0, done_users = 0; struct UserNode *cuser; struct ChanUser *chanuser; struct ModeBuffer *modeBuf; - check_mysql(); - if(!checkChannelAccess(user, chan, "channel_canvoice", 1, 0)) { - reply(getTextBot(), user, "NS_ACCESS_DENIED"); - return; - } 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); + if(done_users) + logEvent(event); }