made cmd_voiceall voicing invisible users
[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, char *nickmask);
7
8 struct neonserv_cmd_voiceall_cache {
9     struct ClientSocket *client, *textclient;
10     struct UserNode *user;
11     char *nickmask;
12 };
13
14 static CMD_BIND(neonserv_cmd_voiceall) {
15     struct neonserv_cmd_voiceall_cache *cache = malloc(sizeof(*cache));
16     if (!cache) {
17         perror("malloc() failed");
18         return;
19     }
20     cache->client = client;
21     cache->textclient = getTextBot();
22     cache->user = user;
23     if(argc > 0) {
24         cache->nickmask = strdup(argv[0]);
25     } else
26         cache->nickmask = NULL;
27     get_userlist_with_invisible(chan, neonserv_cmd_voiceall_userlist_lookup, cache);
28 }
29
30 static USERLIST_CALLBACK(neonserv_cmd_voiceall_userlist_lookup) {
31     struct neonserv_cmd_voiceall_cache *cache = data;
32     neonserv_cmd_voiceall_async1(cache->client, cache->textclient, cache->user, chan, cache->nickmask);
33     if(cache->nickmask)
34         free(cache->nickmask);
35     free(cache);
36 }
37
38 static void neonserv_cmd_voiceall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nickmask) {
39     int done_users = 0;
40     struct ChanUser *chanuser;
41     struct ModeBuffer *modeBuf;
42     modeBuf = initModeBuffer(client, chan);
43     for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
44         if(nickmask && match(nickmask, chanuser->user->nick)) continue;
45         if(chanuser->flags & CHANUSERFLAG_VOICED) continue;
46         modeBufferVoice(modeBuf, chanuser->user->nick);
47         done_users++;
48     }
49     freeModeBuffer(modeBuf);
50     reply(textclient, user, "NS_VOICEALL_DONE", done_users, chan->name);
51 }