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