X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=cmd_neonserv_opall.c;h=d97feffc400805e38da441138237a4d5858a7d30;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=b187abc95e2d20e5bd7bba59174144f631db2160;hpb=92458cdb1c936fbf64163178d6ea9c080c77c6da;p=NeonServV5.git diff --git a/cmd_neonserv_opall.c b/cmd_neonserv_opall.c index b187abc..d97feff 100644 --- a/cmd_neonserv_opall.c +++ b/cmd_neonserv_opall.c @@ -1,20 +1,53 @@ +#include "cmd_neonserv.h" + /* * argv[0] "force" * argv[1] (optional) nick mask */ +static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup); +static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask); -static CMD_BIND(neonserv_cmd_opall) { - int done_users = 0; - char *nickmask = NULL; - struct ChanUser *chanuser; - struct ModeBuffer *modeBuf; +struct neonserv_cmd_opall_cache { + struct ClientSocket *client, *textclient; + struct UserNode *user; + struct Event *event; + char *nickmask; +}; + +CMD_BIND(neonserv_cmd_opall) { if(!argc || strcmp(argv[0], "FORCE")) { reply(getTextBot(), user, "NS_OPALL_SECURITY", chan->name); return; } - if(argc > 1) - nickmask = argv[1]; + struct neonserv_cmd_opall_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + if(argc > 1) { + cache->nickmask = strdup(argv[1]); + } else + cache->nickmask = NULL; + get_userlist_with_invisible(chan, neonserv_cmd_opall_userlist_lookup, cache); +} + +static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup) { + struct neonserv_cmd_opall_cache *cache = data; + neonserv_cmd_opall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask); + if(cache->nickmask) + free(cache->nickmask); + free(cache); +} + +static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask) { + int done_users = 0; + struct ChanUser *chanuser; + struct ModeBuffer *modeBuf; modeBuf = initModeBuffer(client, chan); for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { if(nickmask && match(nickmask, chanuser->user->nick)) continue; @@ -23,5 +56,7 @@ static CMD_BIND(neonserv_cmd_opall) { done_users++; } freeModeBuffer(modeBuf); - reply(getTextBot(), user, "NS_OPALL_DONE", done_users, chan->name); + reply(textclient, user, "NS_OPALL_DONE", done_users, chan->name); + if(done_users) + logEvent(event); }