]> PatchyGit - patchyircd.git/commitdiff
make it possible to use channel_mode without client
authorEgor <egor@patchysicp.xyz>
Fri, 26 Jan 2024 12:00:10 +0000 (14:00 +0200)
committerEgor <egor@patchysicp.xyz>
Fri, 26 Jan 2024 12:00:10 +0000 (14:00 +0200)
src/irc.c

index 584a7b4..94a1152 100644 (file)
--- a/src/irc.c
+++ b/src/irc.c
@@ -1561,103 +1561,91 @@ void channel_kill(struct channel *chan)
        free(chan);
 }
 void channel_mode(struct client_data *client, struct channel *chan, char *args[]) {
+       const char *n = client ? client->nick : "cia";
+       const char *u = client ? client->username : "cia";
+       const char *h = client ? client->hostname : "cia.gov";
        int is_plus;
-       char *p = args[0];
+       char *p = *args++;
        switch (*p++) {
                case '+': is_plus = 1; break;
                case '-': is_plus = 0; break;
                default:
-                       err_unknowncommand(client, "MODE"), sendbuf(client);
+                       if (client)
+                               err_unknowncommand(client, "MODE"), sendbuf(client);
                        return;
        }
        map_t *list;
-       char **argp = &args[1];
        while (*p) {
                switch (*p) {
                case '+': is_plus = 1; break;
                case '-': is_plus = 0; break;
 #define MSG_CHANDMODE(m) \
                copy_strf(&databuf, ":%s!%s@%s MODE %s %s"m"\r\n", \
-                               client->nick, client->username, client->hostname, \
-                               chan->name, is_plus?"+":"-")
+                               n, u, h, chan->name, is_plus?"+":"-")
                case 'P':
-                       if (!(client->umode & UMODE_OPER))
+                       if (client && !(client->umode & UMODE_OPER))
                                break;
-                       SETBIT(chan->dmode, DMODE_PERSIST, is_plus);
-                       MSG_CHANDMODE("P");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_PERSIST,    is_plus), MSG_CHANDMODE("P"), chanlog(), sendbuf_chan(chan);
                        break;
                case 'i':
-                       SETBIT(chan->dmode, DMODE_INVITEONLY, is_plus);
-                       MSG_CHANDMODE("i");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_INVITEONLY, is_plus), MSG_CHANDMODE("i"), chanlog(), sendbuf_chan(chan);
                        break;
                case 'm':
-                       SETBIT(chan->dmode, DMODE_MODERATED, is_plus);
-                       MSG_CHANDMODE("m");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_MODERATED,  is_plus), MSG_CHANDMODE("m"), chanlog(), sendbuf_chan(chan);
                        break;
                case 'n':
-                       SETBIT(chan->dmode, DMODE_NOEXTERNAL, is_plus);
-                       MSG_CHANDMODE("n");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_NOEXTERNAL, is_plus), MSG_CHANDMODE("n"), chanlog(), sendbuf_chan(chan);
                        break;
                case 's':
-                       SETBIT(chan->dmode, DMODE_SECRET, is_plus);
-                       MSG_CHANDMODE("s");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_SECRET,     is_plus), MSG_CHANDMODE("s"), chanlog(), sendbuf_chan(chan);
                        break;
                case 't':
-                       SETBIT(chan->dmode, DMODE_TOPICPROT, is_plus);
-                       MSG_CHANDMODE("t");
-                       chanlog(), sendbuf_chan(chan);
+                       SETBIT(chan->dmode, DMODE_TOPICPROT,  is_plus), MSG_CHANDMODE("t"), chanlog(), sendbuf_chan(chan);
                        break;
                case 'l':
                        if (is_plus) {
                                int x = 0;
-                               if (!*argp) {
+                               if (!*args) {
                                        // FIXME: not enough args error
-                               } else if (sscanf(*argp, "%u", &x) != 1 || x < 0) {
+                               } else if (sscanf(*args, "%u", &x) != 1 || x < 0) {
                                        // FIXME: bad arg error
-                                       argp++;
+                                       args++;
                                } else {
                                        chan->member_limit = x;
                                        copy_strf(&databuf, ":%s!%s@%s MODE %s +l %u\r\n",
-                                                       client->nick, client->username, client->hostname,
-                                                       chan->name, x);
+                                                       n, u, h, chan->name, x);
                                        chanlog(), sendbuf_chan(chan);
-                                       argp++;
+                                       args++;
                                }
                        } else {
                                chan->member_limit = -1;
-                               MSG_CHANDMODE("l");
-                               chanlog(), sendbuf_chan(chan);
+                               MSG_CHANDMODE("l"), chanlog(), sendbuf_chan(chan);
                        }
                        break;
                case 'k':
                        if (is_plus) {
-                               if (!*argp) {
+                               if (!*args) {
                                        // FIXME: not enough args error
                                        break;
-                               } else if (strchr(*argp, ',') || strchr(*argp, ' ')) {
-                                       err_invalidkey(client, chan), sendbuf(client);
-                                       argp++;
+                               } else if (strchr(*args, ',') || strchr(*args, ' ')) {
+                                       if (client)
+                                               err_invalidkey(client, chan), sendbuf(client);
+                                       args++;
                                        break;
                                }
                                if (chan->chankey)
                                        free(chan->chankey);
-                               chan->chankey = mystrdup(*argp);
+                               chan->chankey = mystrdup(*args);
                                if (!chan->chankey)
                                        abort();
                        } else {
                                free(chan->chankey);
                                chan->chankey = NULL;
-                               if (*argp) // unused argument
-                                       argp++;
+                               if (*args) // unused argument
+                                       args++;
                        }
                        copy_strf(&databuf, ":%s!%s@%s MODE %s %sk %s\r\n",
-                                       client->nick, client->username, client->hostname,
-                                       chan->name, is_plus?"+":"-", is_plus?*argp:"*");
+                                       n, u, h, chan->name, is_plus?"+":"-", is_plus?*args:"*");
                        chanlog(), sendbuf_chan(chan);
                        break;
                case 'b':
@@ -1673,22 +1661,22 @@ void channel_mode(struct client_data *client, struct channel *chan, char *args[]
                        list = &chan->listq;
                        goto set_list;
                case 'w':
-                       if (!*argp) // TODO: error msg
+                       if (!*args) // TODO: error msg
                                break;
-                       if (argp[0][0] == 'o')
+                       if (args[0][0] == 'o')
                                list = &chan->listwo;
-                       else if (argp[0][0] == 'v')
+                       else if (args[0][0] == 'v')
                                list = &chan->listwv;
                        else
                                break; // TODO: error msg
-                       if (argp[0][1] != ':')
+                       if (args[0][1] != ':')
                                break; // TODO: error msg
-                       argp[0] += 2;
+                       args[0] += 2;
                        goto set_list;
                set_list: {
-                       if(!*argp) // TODO: error msg
+                       if(!*args) // TODO: error msg
                                break;
-                       char *mask = *argp++;
+                       char *mask = *args++;
                        if (strchr(mask, ' '))
                                break; // TODO: error msg
                        stringlower(mask);
@@ -1696,38 +1684,38 @@ void channel_mode(struct client_data *client, struct channel *chan, char *args[]
                                abort();
                        char which[2] = {*p, 0};
                        copy_strf(&databuf, ":%s!%s@%s MODE %s %s%s %s\r\n",
-                                       client->nick, client->username, client->hostname,
-                                       chan->name, is_plus?"+":"-", which, mask);
+                                       n, u, h, chan->name, is_plus?"+":"-", which, mask);
                        // TODO: limit to ops
                        chanlog(), sendbuf_chan(chan);
                        break;
                }
                case 'v':
                case 'o': {
-                       if(!*argp)
+                       if(!*args)
                                break;
-                       const char *nick = *argp++;
+                       const char *nick = *args++;
                        char which[2] = {*p, 0};
                        struct client_data *cl = findClient(nick);
                        if (!cl) {
-                               err_nosuchnick(client, nick), sendbuf(client);
+                               if (client)
+                                       err_nosuchnick(client, nick), sendbuf(client);
                                break;
                        }
                        if (!map_get(&chan->members, cl->key)) {
-                               err_usernotinchannel(client, cl->nick, chan), sendbuf(client);
+                               if (client)
+                                       err_usernotinchannel(client, cl->nick, chan), sendbuf(client);
                                break;
                        }
                        if (map_set(*p == 'o' ? &chan->o : &chan->v, cl->key, is_plus ? cl : NULL, NULL) == -1)
                                abort();
                        copy_strf(&databuf, ":%s!%s@%s MODE %s %s%s %s\r\n",
-                                       client->nick, client->username, client->hostname,
-                                       chan->name, is_plus?"+":"-", which, cl->nick);
+                                       n, u, h, chan->name, is_plus?"+":"-", which, cl->nick);
                        sendbuf_chan(chan);
                        break;
                }
                default:
-                       err_unknownmode(client, *p);
-                       sendbuf(client);
+                       if (client)
+                               err_unknownmode(client, *p), sendbuf(client);
                        break;
                }
                p++;