2 #include "cmd_neonserv.h"
5 * argv[0] (optional) nick mask
7 static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup);
8 static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc);
10 struct neonserv_cmd_deopall_cache {
11 struct ClientSocket *client, *textclient;
12 struct UserNode *user;
18 CMD_BIND(neonserv_cmd_deopall) {
19 struct neonserv_cmd_deopall_cache *cache = malloc(sizeof(*cache));
21 perror("malloc() failed");
24 cache->client = client;
25 cache->textclient = getTextBot();
28 cache->argv = calloc(argc, sizeof(char*));
30 for(i = 0; i < argc; i++) {
31 cache->argv[i] = strdup(argv[i]);
34 get_userlist(chan, neonserv_cmd_deopall_userlist_lookup, cache);
37 static USERLIST_CALLBACK(neonserv_cmd_deopall_userlist_lookup) {
38 struct neonserv_cmd_deopall_cache *cache = data;
39 neonserv_cmd_deopall_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->argv, cache->argc);
41 for(i = 0; i < cache->argc; i++) {
47 static void neonserv_cmd_deopall_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char **argv, int argc) {
48 int issuer_access, victim_access, done_users = 0;
49 char *nickmask = NULL;
50 struct ChanUser *chanuser;
51 struct ModeBuffer *modeBuf;
54 modeBuf = initModeBuffer(client, chan);
55 issuer_access = getChannelAccess(user, chan, 0);
56 for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
57 if(nickmask && match(nickmask, chanuser->user->nick)) continue;
58 victim_access = getChannelAccess(user, chan, 0);
59 if(victim_access >= issuer_access) continue;
60 if(!(chanuser->flags & CHANUSERFLAG_OPPED)) continue;
61 modeBufferDeop(modeBuf, chanuser->user->nick);
64 freeModeBuffer(modeBuf);
65 reply(getTextBot(), user, "NS_DEOPALL_DONE", done_users, chan->name);