]> PatchyGit - patchyircd.git/commitdiff
irc: use a macro for command matching
authorEgor <egor@patchysicp.xyz>
Sun, 15 Jun 2025 07:57:48 +0000 (10:57 +0300)
committerEgor <egor@patchysicp.xyz>
Sun, 15 Jun 2025 07:57:48 +0000 (10:57 +0300)
src/irc.cpp

index c32f144..24dfaad 100644 (file)
@@ -235,17 +235,18 @@ static void cont_pass(Client *client, int res) {
                newUser(client);
        }
 }
+#define MATCH_COMMAND(s) else if(strcmp(command, s) == 0)
 int irc_process_line(Client *client, char *source, char *command, int argc, char *args[]) {
        (void)source;
        databuf.clear();
-       if(strcmp(command, "") == 0) {
+       if (command[0] == '\0') {
                return 0;
-       } else if(strcmp(command, "PING") == 0) {
+       } MATCH_COMMAND("PING") {
                if (!args[0])
                        return err_needmoreparams(client, command), sendbuf(client), 0;
                msg_pong(args[0]);
                sendbuf(client);
-       } else if(strcmp(command, "CAP") == 0) {
+       } MATCH_COMMAND("CAP") {
                static const struct cap {
                        const char *name;
                        unsigned caps;
@@ -321,7 +322,7 @@ int irc_process_line(Client *client, char *source, char *command, int argc, char
                        // FIXME: error 410
                        goto unknown;
                }
-       } else if(strcmp(command, "AUTHENTICATE") == 0) {
+       } MATCH_COMMAND("AUTHENTICATE") {
                if (!args[0])
                        return err_needmoreparams(client, command), sendbuf(client), 0;
                if (client->username && client->username[0] != '~')
@@ -447,7 +448,7 @@ saslcleanup:
                                return 0;
                        }
                }
-       } else if(strcmp(command, "NICK") == 0) {
+       } MATCH_COMMAND("NICK") {
                // User now registered
                if (!args[0])
                        return err_needmoreparams(client, command), sendbuf(client), 0;
@@ -460,7 +461,7 @@ saslcleanup:
                                abortf("strdup fail (nick_reg)\n");
                        newUser(client);
                }
-       } else if(strcmp(command, "USER") == 0) {
+       } MATCH_COMMAND("USER") {
                if (argc < 4)
                        return err_needmoreparams(client, command), sendbuf(client), 0;
                if (is_registered(client))
@@ -477,7 +478,7 @@ saslcleanup:
                        abortf("strdup fail (realname)\n");
                // proceed with registration
                newUser(client);
-       } else if(strcmp(command, "PASS") == 0) {
+       } MATCH_COMMAND("PASS") {
                if (is_registered(client))
                        return err_alreadyregistered(client), sendbuf(client), 0;
                if (client->umode & UMODE_REGISTERED || client->passwait)
@@ -492,7 +493,7 @@ saslcleanup:
                memset(args[0], 0, strlen(args[0]));
                if (!client->pass_reg)
                        abortf("strdup fail (pass_reg)\n");
-       } else if(strcmp(command, "WEBIRC") == 0) {
+       } MATCH_COMMAND("WEBIRC") {
                if (is_registered(client))
                        return err_alreadyregistered(client), sendbuf(client), 0;
                if (argc < 4)
@@ -514,7 +515,7 @@ saslcleanup:
                        job_password_check(client, args[1], args[0], getdatafile("webirc.txt"), cont_webirc);
                        memset(args[0], 0, strlen(args[0]));
                }
-       } else if(strcmp(command, "OPER") == 0) {
+       } MATCH_COMMAND("OPER") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc < 2)
@@ -522,7 +523,7 @@ saslcleanup:
                stringlower(args[0]);
                job_password_check(client, args[0], args[1], getdatafile("ops.txt"), cont_oper);
                memset(args[1], 0, strlen(args[1]));
-       } else if(strcmp(command, "NEWACC") == 0) {
+       } MATCH_COMMAND("NEWACC") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc < 2)
@@ -540,7 +541,7 @@ saslcleanup:
                msg_notice_server(hostname, client->nick,
                                "Your information has been recorded. Contact IRCops for assistance with registration.");
                sendbuf(client);
-       } else if(strcmp(command, "GHOST") == 0) {
+       } MATCH_COMMAND("GHOST") {
                if (!(client->umode & UMODE_REGISTERED))
                        return 0; // FIXME: error message
                const char *desired_nick = client->username;
@@ -559,7 +560,7 @@ saslcleanup:
                if (client == cl)
                        return err_nicknameinuse(client, desired_nick), sendbuf(client), 0;
                killConnection(cl, 0);
-       } else if(strcmp(command, "WALLOPS") == 0) {
+       } MATCH_COMMAND("WALLOPS") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc < 1)
@@ -570,7 +571,7 @@ saslcleanup:
                for (auto cl : client_map)
                        if (cl->umode & UMODE_WALLOPS)
                                sendbuf(cl);
-       } else if(strcmp(command, "KILL") == 0) {
+       } MATCH_COMMAND("KILL") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!(client->umode & UMODE_OPER))
@@ -588,7 +589,7 @@ saslcleanup:
                                sendbuf(cl2);
                // FIXME: add appropraite QUIT message
                killConnection(cl, 0);
-       } else if(strcmp(command, "JEDGAR") == 0) {
+       } MATCH_COMMAND("JEDGAR") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!(client->umode & UMODE_OPER))
@@ -603,7 +604,7 @@ saslcleanup:
                chan->o.add(client);
                copy_strf(&databuf, ":cia!cia@cia.gov MODE %s +o %s\r\n", chan->name, client->nick);
                sendbuf_chan(chan);
-       } else if(strcmp(command, "JOIN") == 0) {
+       } MATCH_COMMAND("JOIN") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!args[0])
@@ -624,7 +625,7 @@ saslcleanup:
                                *q++ = '\0';
                        channel_join(client, channel, key);
                } while (p);
-       } else if(strcmp(command, "PART") == 0) {
+       } MATCH_COMMAND("PART") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!args[0])
@@ -639,7 +640,7 @@ saslcleanup:
                                return err_nosuchchannel(client, args[0]), sendbuf(client), 0;
                        channel_part(client, chan, args[1] ? args[1] : "", NULL);
                } while (p);
-       } else if(strcmp(command, "TOPIC") == 0) {
+       } MATCH_COMMAND("TOPIC") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!args[0])
@@ -656,7 +657,7 @@ saslcleanup:
                                return 0; // FIXME: error 482
                        channel_topic(client, chan, args[1], client->nick, get_time());
                }
-       } else if(strcmp(command, "INVITE") == 0) {
+       } MATCH_COMMAND("INVITE") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (!args[0]) {
@@ -689,7 +690,7 @@ saslcleanup:
                msg_invite(client, cl, chan);
                sendbuf(cl);
                sendbuf_chan_caps(chan, CAP_INVITENOTIFY, 0);
-       } else if(strcmp(command, "KICK") == 0) {
+       } MATCH_COMMAND("KICK") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc < 2)
@@ -712,7 +713,10 @@ saslcleanup:
                        else
                                channel_part(cl, chan, args[2], client);
                } while (p);
-       } else if(strcmp(command, "PRIVMSG") == 0 || strcmp(command, "NOTICE") == 0) {
+       } MATCH_COMMAND("PRIVMSG") {
+               goto privmsg_notice_common;
+       } MATCH_COMMAND("NOTICE") {
+privmsg_notice_common:
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc < 2)
@@ -784,22 +788,22 @@ saslcleanup:
                        if (cl->away)
                                rpl_away(client, cl), sendbuf(client);
                }
-       } else if(strcmp(command, "QUIT") == 0) {
+       } MATCH_COMMAND("QUIT") {
                msg_quit(client, "Quit: ", args[0] ? args[0] : "");
                sendbuf_visible(client);
                killConnection(client, 1);
                return 1;
-       } else if(strcmp(command, "PONG") == 0) {
+       } MATCH_COMMAND("PONG") {
                // Do nothing
        // Server Queries and Commands
-       } else if(strcmp(command, "MOTD") == 0) {
+       } MATCH_COMMAND("MOTD") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (args[0] && strcmp(args[0], hostname) != 0)
                        return err_nosuchserver(client, args[0]), sendbuf(client), 0;
                // Send welcome
                sendMOTD(client);
-       } else if(strcmp(command, "HELP") == 0) {
+       } MATCH_COMMAND("HELP") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                char line[512];
@@ -817,14 +821,14 @@ saslcleanup:
                } else {
                        err_helpnotfound(client), sendbuf(client);
                }
-       } else if(strcmp(command, "VERSION") == 0) {
+       } MATCH_COMMAND("VERSION") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (args[0] && strcmp(args[0], hostname) != 0)
                        return err_nosuchserver(client, args[0]), sendbuf(client), 0;
                rpl_version(client, PACKAGE_VERSION, PACKAGE_STRING), sendbuf(client);
                rpl_isupport(client), sendbuf(client);
-       } else if(strcmp(command, "ADMIN") == 0) {
+       } MATCH_COMMAND("ADMIN") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (args[0] && strcmp(args[0], hostname) != 0)
@@ -854,17 +858,17 @@ saslcleanup:
                } else {
                        goto unknown;
                }
-       } else if(strcmp(command, "LUSERS") == 0) {
+       } MATCH_COMMAND("LUSERS") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                sendLUSERS(client);
-       } else if(strcmp(command, "TIME") == 0) {
+       } MATCH_COMMAND("TIME") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (args[0] && strcmp(args[0], hostname) != 0)
                        return err_nosuchserver(client, args[0]), sendbuf(client), 0;
                rpl_time(client, get_time()), sendbuf(client);
-       } else if(strcmp(command, "MODE") == 0) {
+       } MATCH_COMMAND("MODE") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -982,7 +986,7 @@ saslcleanup:
                                channel_mode(client, chan, args+1);
                        }
                }
-       } else if(strcmp(command, "LIST") == 0) {
+       } MATCH_COMMAND("LIST") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                rpl_liststart(client), sendbuf(client);
@@ -990,7 +994,7 @@ saslcleanup:
                        if (client->umode & UMODE_OPER || !(chan->dmode & DMODE_SECRET) || chan->members.has(client))
                                rpl_list(client, chan), sendbuf(client);
                rpl_listend(client), sendbuf(client);
-       } else if(strcmp(command, "NAMES") == 0) {
+       } MATCH_COMMAND("NAMES") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1008,7 +1012,7 @@ saslcleanup:
                                sendbuf(client);
                        }
                } while (p);
-       } else if(strcmp(command, "USERHOST") == 0) {
+       } MATCH_COMMAND("USERHOST") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1024,7 +1028,7 @@ saslcleanup:
                rpl_userhost(client, cls, (int)(p - cls));
                sendbuf(client);
        // User-Based Queries
-       } else if(strcmp(command, "WHO") == 0) {
+       } MATCH_COMMAND("WHO") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1059,7 +1063,7 @@ saslcleanup:
                        }
                }
                rpl_endofwho(client, args[0]), sendbuf(client);
-       } else if(strcmp(command, "WHOIS") == 0) {
+       } MATCH_COMMAND("WHOIS") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1102,7 +1106,7 @@ saslcleanup:
                        err_nosuchnick(client, nick);
                        sendbuf(client);
                }
-       } else if(strcmp(command, "AWAY") == 0) {
+       } MATCH_COMMAND("AWAY") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (args[0]) {
@@ -1119,7 +1123,7 @@ saslcleanup:
                msg_away(client);
                int cookie = sendbuf_visible_caps(client, CAP_AWAYNOTIFY, 0);
                sendbuf_monitor(client->key, cookie, CAP_AWAYNOTIFY|CAP_EXTENDEDMONITOR, 0);
-       } else if(strcmp(command, "MONITOR") == 0) {
+       } MATCH_COMMAND("MONITOR") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1186,7 +1190,7 @@ saslcleanup:
                default:
                        return err_needmoreparams(client, command), sendbuf(client), 0; /* FIXME: wrong error */
                }
-       } else if(strcmp(command, "SETNAME") == 0) {
+       } MATCH_COMMAND("SETNAME") {
                if (!is_registered(client))
                        return err_notregistered(client), sendbuf(client), 0;
                if (argc == 0)
@@ -1199,7 +1203,7 @@ saslcleanup:
                if (client->cookie != cookie)
                        sendbuf(client);
 #ifdef HAVE_LUA
-       } else if(strcmp(command, "LUA") == 0) {
+       } MATCH_COMMAND("LUA") {
                if (argc < 1)
                        return err_needmoreparams(client, command), sendbuf(client), 0;
                return admin_command(client, source, args[0], argc-1, args+1);