From: Egor Date: Fri, 26 Jan 2024 12:00:10 +0000 (+0200) Subject: make it possible to use channel_mode without client X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=df766a2f5ef071cc350d62ee814e3ff216de5e8c;p=patchyircd.git make it possible to use channel_mode without client --- diff --git a/src/irc.c b/src/irc.c index 584a7b4..94a1152 100644 --- 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++;