From d791479f6effdca54c5c1c2751dcdaebdada9570 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 8 May 2022 13:52:08 +0300 Subject: [PATCH] JOIN/PART multiple channels --- irc.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/irc.c b/irc.c index f3be84b..e4768b8 100644 --- a/irc.c +++ b/irc.c @@ -267,22 +267,32 @@ int processPacket(struct client_data *client, char *source, char *command, int a free(f); return 0; } - char *p = strchr(args[0], ','); // TODO: multiple channels - if (p) - *p = '\0'; - channel_join(client, args[0], NULL); + char *p = args[0]; + char *q = args[1]; + do { + char *channel = p; + if ((p = strchr(channel, ','))) + *p++ = '\0'; + char *key = q; + if (key && (q = strchr(key, ','))) + *q++ = '\0'; + channel_join(client, channel, key); + } while (p); } else if(strcmp(command, "PART") == 0) { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!args[0]) // FIXME: error message return 0; - char *p = strchr(args[0], ','); // TODO: multiple channels - if (p) - *p = '\0'; - struct channel *chan = findChannel(args[0]); - if (!chan) // TODO: error message - return 0; - channel_part(client, chan, args[1] ? args[1] : ""); + char *p = args[0]; + do { + char *channel = p; + if ((p = strchr(channel, ','))) + *p++ = '\0'; + struct channel *chan = findChannel(channel); + if (!chan) // TODO: error message + return 0; + channel_part(client, chan, args[1] ? args[1] : ""); + } while (p); } else if(strcmp(command, "TOPIC") == 0) { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; @@ -617,12 +627,11 @@ int processPacket(struct client_data *client, char *source, char *command, int a return err_notregistered(client), sendbuf(client), 0; if (argc == 0) // FIXME: error message return 0; - char *p = args[0]-1; + char *p = args[0]; do { - char *channel = p+1; - p = strchr(channel, ','); - if (p) - *p = '\0'; + char *channel = p; + if ((p = strchr(channel, ','))) + *p++ = '\0'; struct channel *chan = findChannel(channel); if (chan && (!(chan->dmode & DMODE_SECRET) || trie_get(&chan->members, client->key))) { channel_sendnames(client, chan); -- 2.56.0