tried to reorder the program structure and build process
[NeonServV5.git] / src / cmd_neonserv_voiceall.c
1
2 #include "cmd_neonserv.h"
3
4 /*
5 * argv[0]    (optional) nick mask
6 */
7 static USERLIST_CALLBACK(neonserv_cmd_voiceall_userlist_lookup);
8 static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask);
9
10 struct neonserv_cmd_voiceall_cache {
11     struct ClientSocket *client, *textclient;
12     struct UserNode *user;
13     struct Event *event;
14     char *nickmask;
15 };
16
17 CMD_BIND(neonserv_cmd_voiceall) {
18     struct neonserv_cmd_voiceall_cache *cache = malloc(sizeof(*cache));
19     if (!cache) {
20         perror("malloc() failed");
21         return;
22     }
23     cache->client = client;
24     cache->textclient = getTextBot();
25     cache->user = user;
26     cache->event = event;
27     if(argc > 0) {
28         cache->nickmask = strdup(argv[0]);
29     } else
30         cache->nickmask = NULL;
31     get_userlist_with_invisible(chan, neonserv_cmd_voiceall_userlist_lookup, cache);
32 }
33
34 static USERLIST_CALLBACK(neonserv_cmd_voiceall_userlist_lookup) {
35     struct neonserv_cmd_voiceall_cache *cache = data;
36     neonserv_cmd_voiceall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask);
37     if(cache->nickmask)
38         free(cache->nickmask);
39     free(cache);
40 }
41
42 static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask) {
43     int done_users = 0;
44     struct ChanUser *chanuser;
45     struct ModeBuffer *modeBuf;
46     modeBuf = initModeBuffer(client, chan);
47     for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
48         if(nickmask && match(nickmask, chanuser->user->nick)) continue;
49         if(chanuser->flags & CHANUSERFLAG_VOICED) continue;
50         modeBufferVoice(modeBuf, chanuser->user->nick);
51         done_users++;
52     }
53     freeModeBuffer(modeBuf);
54     reply(textclient, user, "NS_VOICEALL_DONE", done_users, chan->name);
55     if(done_users)
56         logEvent(event);
57 }