]> PatchyGit - patchyircd.git/commitdiff
JOIN/PART multiple channels
authorEgor <egor@patchysicp.xyz>
Sun, 8 May 2022 10:52:08 +0000 (13:52 +0300)
committerEgor <egor@patchysicp.xyz>
Sun, 8 May 2022 10:52:08 +0000 (13:52 +0300)
irc.c

diff --git a/irc.c b/irc.c
index f3be84b..e4768b8 100644 (file)
--- 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);