d97feffc400805e38da441138237a4d5858a7d30
[NeonServV5.git] / src / cmd_neonserv_opall.c
1
2 #include "cmd_neonserv.h"
3
4 /*
5 * argv[0]    "force"
6 * argv[1]    (optional) nick mask
7 */
8 static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup);
9 static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask);
10
11 struct neonserv_cmd_opall_cache {
12     struct ClientSocket *client, *textclient;
13     struct UserNode *user;
14     struct Event *event;
15     char *nickmask;
16 };
17
18 CMD_BIND(neonserv_cmd_opall) {
19     if(!argc || strcmp(argv[0], "FORCE")) {
20         reply(getTextBot(), user, "NS_OPALL_SECURITY", chan->name);
21         return;
22     }
23     struct neonserv_cmd_opall_cache *cache = malloc(sizeof(*cache));
24     if (!cache) {
25         perror("malloc() failed");
26         return;
27     }
28     cache->client = client;
29     cache->textclient = getTextBot();
30     cache->user = user;
31     cache->event = event;
32     if(argc > 1) {
33         cache->nickmask = strdup(argv[1]);
34     } else
35         cache->nickmask = NULL;
36     get_userlist_with_invisible(chan, neonserv_cmd_opall_userlist_lookup, cache);
37 }
38
39 static USERLIST_CALLBACK(neonserv_cmd_opall_userlist_lookup) {
40     struct neonserv_cmd_opall_cache *cache = data;
41     neonserv_cmd_opall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nickmask);
42     if(cache->nickmask)
43         free(cache->nickmask);
44     free(cache);
45 }
46
47 static void neonserv_cmd_opall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nickmask) {
48     int done_users = 0;
49     struct ChanUser *chanuser;
50     struct ModeBuffer *modeBuf;
51     modeBuf = initModeBuffer(client, chan);
52     for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
53         if(nickmask && match(nickmask, chanuser->user->nick)) continue;
54         if(chanuser->flags & CHANUSERFLAG_OPPED) continue;
55         modeBufferOp(modeBuf, chanuser->user->nick);
56         done_users++;
57     }
58     freeModeBuffer(modeBuf);
59     reply(textclient, user, "NS_OPALL_DONE", done_users, chan->name);
60     if(done_users)
61         logEvent(event);
62 }