diff --git a/irc_commands.gperf b/irc_commands.gperf new file mode 100644 index 0000000..a2897d8 --- /dev/null +++ b/irc_commands.gperf @@ -0,0 +1,279 @@ +struct RecognizedCommand { + char const* text; + IrcCommand command; + std::size_t min_args; + std::size_t max_args; +}; +%% +001, IrcCommand::RPL_WELCOME, 2, 2 +002, IrcCommand::RPL_YOURHOST, 2, 2 +003, IrcCommand::RPL_CREATED, 2, 2 +004, IrcCommand::RPL_MYINFO, 5, 5 +005, IrcCommand::RPL_ISUPPORT, 2, 15 +008, IrcCommand::RPL_SNOMASK, 3, 3 +010, IrcCommand::RPL_REDIR, 4, 4 +015, IrcCommand::RPL_MAP, 2, 2 +017, IrcCommand::RPL_MAPEND, 2, 2 +043, IrcCommand::RPL_SAVENICK, 3, 3 +200, IrcCommand::RPL_TRACELINK, 5, 5 +201, IrcCommand::RPL_TRACECONNECTING, 4, 4 +202, IrcCommand::RPL_TRACEHANDSHAKE, 4, 4 +203, IrcCommand::RPL_TRACEUNKNOWN, 6, 6 +204, IrcCommand::RPL_TRACEOPERATOR +205, IrcCommand::RPL_TRACEUSER +206, IrcCommand::RPL_TRACESERVER +208, IrcCommand::RPL_TRACENEWTYPE +209, IrcCommand::RPL_TRACECLASS +211, IrcCommand::RPL_STATSLINKINFO +212, IrcCommand::RPL_STATSCOMMANDS +213, IrcCommand::RPL_STATSCLINE +214, IrcCommand::RPL_STATSNLINE +215, IrcCommand::RPL_STATSILINE +216, IrcCommand::RPL_STATSKLINE +217, IrcCommand::RPL_STATSQLINE +218, IrcCommand::RPL_STATSYLINE +219, IrcCommand::RPL_ENDOFSTATS +220, IrcCommand::RPL_STATSPLINE +221, IrcCommand::RPL_UMODEIS, 2, 2 +224, IrcCommand::RPL_STATSFLINE +225, IrcCommand::RPL_STATSDLINE +234, IrcCommand::RPL_SERVLIST +235, IrcCommand::RPL_SERVLISTEND +241, IrcCommand::RPL_STATSLLINE +242, IrcCommand::RPL_STATSUPTIME +243, IrcCommand::RPL_STATSOLINE +244, IrcCommand::RPL_STATSHLINE +245, IrcCommand::RPL_STATSSLINE +247, IrcCommand::RPL_STATSXLINE +248, IrcCommand::RPL_STATSULINE +249, IrcCommand::RPL_STATSDEBUG +250, IrcCommand::RPL_STATSCONN +251, IrcCommand::RPL_LUSERCLIENT +252, IrcCommand::RPL_LUSEROP +253, IrcCommand::RPL_LUSERUNKNOWN +254, IrcCommand::RPL_LUSERCHANNELS +255, IrcCommand::RPL_LUSERME +256, IrcCommand::RPL_ADMINME +257, IrcCommand::RPL_ADMINLOC1 +258, IrcCommand::RPL_ADMINLOC2 +259, IrcCommand::RPL_ADMINEMAIL +261, IrcCommand::RPL_TRACELOG +262, IrcCommand::RPL_ENDOFTRACE, 3, 3 +263, IrcCommand::RPL_LOAD2HI +265, IrcCommand::RPL_LOCALUSERS +266, IrcCommand::RPL_GLOBALUSERS +270, IrcCommand::RPL_PRIVS +276, IrcCommand::RPL_WHOISCERTFP +281, IrcCommand::RPL_ACCEPTLIST +282, IrcCommand::RPL_ENDOFACCEPT +300, IrcCommand::RPL_NONE +301, IrcCommand::RPL_AWAY +302, IrcCommand::RPL_USERHOST +303, IrcCommand::RPL_ISON +304, IrcCommand::RPL_TEXT +305, IrcCommand::RPL_UNAWAY +306, IrcCommand::RPL_NOWAWAY +310, IrcCommand::RPL_WHOISHELPOP +311, IrcCommand::RPL_WHOISUSER +312, IrcCommand::RPL_WHOISSERVER +313, IrcCommand::RPL_WHOISOPERATOR +314, IrcCommand::RPL_WHOWASUSER +369, IrcCommand::RPL_ENDOFWHOWAS +316, IrcCommand::RPL_WHOISCHANOP +317, IrcCommand::RPL_WHOISIDLE +318, IrcCommand::RPL_ENDOFWHOIS +319, IrcCommand::RPL_WHOISCHANNELS +320, IrcCommand::RPL_WHOISSPECIAL +321, IrcCommand::RPL_LISTSTART +322, IrcCommand::RPL_LIST +323, IrcCommand::RPL_LISTEND +324, IrcCommand::RPL_CHANNELMODEIS +325, IrcCommand::RPL_CHANNELMLOCK +328, IrcCommand::RPL_CHANNELURL +329, IrcCommand::RPL_CREATIONTIME +330, IrcCommand::RPL_WHOISLOGGEDIN +331, IrcCommand::RPL_NOTOPIC +332, IrcCommand::RPL_TOPIC, 3, 3 +333, IrcCommand::RPL_TOPICWHOTIME, 4, 4 +337, IrcCommand::RPL_WHOISTEXT +338, IrcCommand::RPL_WHOISACTUALLY +341, IrcCommand::RPL_INVITING +342, IrcCommand::RPL_SUMMONING +346, IrcCommand::RPL_INVITELIST +347, IrcCommand::RPL_ENDOFINVITELIST +348, IrcCommand::RPL_EXCEPTLIST +349, IrcCommand::RPL_ENDOFEXCEPTLIST +351, IrcCommand::RPL_VERSION +352, IrcCommand::RPL_WHOREPLY +354, IrcCommand::RPL_WHOSPCRPL +315, IrcCommand::RPL_ENDOFWHO +353, IrcCommand::RPL_NAMREPLY +360, IrcCommand::RPL_WHOWASREAL +366, IrcCommand::RPL_ENDOFNAMES +361, IrcCommand::RPL_KILLDONE +362, IrcCommand::RPL_CLOSING +363, IrcCommand::RPL_CLOSEEND +364, IrcCommand::RPL_LINKS +365, IrcCommand::RPL_ENDOFLINKS +367, IrcCommand::RPL_BANLIST +368, IrcCommand::RPL_ENDOFBANLIST +371, IrcCommand::RPL_INFO +372, IrcCommand::RPL_MOTD +373, IrcCommand::RPL_INFOSTART +374, IrcCommand::RPL_ENDOFINFO +375, IrcCommand::RPL_MOTDSTART +376, IrcCommand::RPL_ENDOFMOTD +378, IrcCommand::RPL_WHOISHOST +381, IrcCommand::RPL_YOUREOPER +382, IrcCommand::RPL_REHASHING +384, IrcCommand::RPL_MYPORTIS +385, IrcCommand::RPL_NOTOPERANYMORE +386, IrcCommand::RPL_RSACHALLENGE +391, IrcCommand::RPL_TIME +392, IrcCommand::RPL_USERSSTART +393, IrcCommand::RPL_USERS +394, IrcCommand::RPL_ENDOFUSERS +395, IrcCommand::RPL_NOUSERS +396, IrcCommand::RPL_HOSTHIDDEN +401, IrcCommand::ERR_NOSUCHNICK, 3, 3 +402, IrcCommand::ERR_NOSUCHSERVER +403, IrcCommand::ERR_NOSUCHCHANNEL +404, IrcCommand::ERR_CANNOTSENDTOCHAN +405, IrcCommand::ERR_TOOMANYCHANNELS +406, IrcCommand::ERR_WASNOSUCHNICK +407, IrcCommand::ERR_TOOMANYTARGETS +409, IrcCommand::ERR_NOORIGIN +410, IrcCommand::ERR_INVALIDCAPCMD +411, IrcCommand::ERR_NORECIPIENT +412, IrcCommand::ERR_NOTEXTTOSEND +413, IrcCommand::ERR_NOTOPLEVEL +414, IrcCommand::ERR_WILDTOPLEVEL +415, IrcCommand::ERR_MSGNEEDREGGEDNICK +416, IrcCommand::ERR_TOOMANYMATCHES +421, IrcCommand::ERR_UNKNOWNCOMMAND +422, IrcCommand::ERR_NOMOTD, 2, 2 +423, IrcCommand::ERR_NOADMININFO +424, IrcCommand::ERR_FILEERROR +431, IrcCommand::ERR_NONICKNAMEGIVEN +432, IrcCommand::ERR_ERRONEUSNICKNAME +433, IrcCommand::ERR_NICKNAMEINUSE +435, IrcCommand::ERR_BANNICKCHANGE +436, IrcCommand::ERR_NICKCOLLISION +437, IrcCommand::ERR_UNAVAILRESOURCE +438, IrcCommand::ERR_NICKTOOFAST +440, IrcCommand::ERR_SERVICESDOWN +441, IrcCommand::ERR_USERNOTINCHANNEL +442, IrcCommand::ERR_NOTONCHANNEL +443, IrcCommand::ERR_USERONCHANNEL +444, IrcCommand::ERR_NOLOGIN +445, IrcCommand::ERR_SUMMONDISABLED +446, IrcCommand::ERR_USERSDISABLED +451, IrcCommand::ERR_NOTREGISTERED +456, IrcCommand::ERR_ACCEPTFULL +457, IrcCommand::ERR_ACCEPTEXIST +458, IrcCommand::ERR_ACCEPTNOT +461, IrcCommand::ERR_NEEDMOREPARAMS +462, IrcCommand::ERR_ALREADYREGISTRED +463, IrcCommand::ERR_NOPERMFORHOST +464, IrcCommand::ERR_PASSWDMISMATCH +465, IrcCommand::ERR_YOUREBANNEDCREEP +466, IrcCommand::ERR_YOUWILLBEBANNED +467, IrcCommand::ERR_KEYSET +470, IrcCommand::ERR_LINKCHANNEL +471, IrcCommand::ERR_CHANNELISFULL +472, IrcCommand::ERR_UNKNOWNMODE +473, IrcCommand::ERR_INVITEONLYCHAN +474, IrcCommand::ERR_BANNEDFROMCHAN +475, IrcCommand::ERR_BADCHANNELKEY +476, IrcCommand::ERR_BADCHANMASK +477, IrcCommand::ERR_NEEDREGGEDNICK +478, IrcCommand::ERR_BANLISTFULL +479, IrcCommand::ERR_BADCHANNAME +480, IrcCommand::ERR_THROTTLE +481, IrcCommand::ERR_NOPRIVILEGES +482, IrcCommand::ERR_CHANOPRIVSNEEDED +483, IrcCommand::ERR_CANTKILLSERVER +484, IrcCommand::ERR_ISCHANSERVICE +485, IrcCommand::ERR_BANNEDNICK +486, IrcCommand::ERR_NONONREG +489, IrcCommand::ERR_VOICENEEDED +491, IrcCommand::ERR_NOOPERHOST +492, IrcCommand::ERR_CANNOTSENDTOUSER +494, IrcCommand::ERR_OWNMODE +501, IrcCommand::ERR_UMODEUNKNOWNFLAG +502, IrcCommand::ERR_USERSDONTMATCH +503, IrcCommand::ERR_GHOSTEDCLIENT +504, IrcCommand::ERR_USERNOTONSERV +513, IrcCommand::ERR_WRONGPONG +517, IrcCommand::ERR_DISABLED +524, IrcCommand::ERR_HELPNOTFOUND +670, IrcCommand::RPL_STARTTLS +671, IrcCommand::RPL_WHOISSECURE +691, IrcCommand::ERR_STARTTLS +702, IrcCommand::RPL_MODLIST +703, IrcCommand::RPL_ENDOFMODLIST +704, IrcCommand::RPL_HELPSTART +705, IrcCommand::RPL_HELPTXT +706, IrcCommand::RPL_ENDOFHELP +707, IrcCommand::ERR_TARGCHANGE +708, IrcCommand::RPL_ETRACEFULL, 10, 10 +709, IrcCommand::RPL_ETRACE +710, IrcCommand::RPL_KNOCK +711, IrcCommand::RPL_KNOCKDLVR +712, IrcCommand::ERR_TOOMANYKNOCK +713, IrcCommand::ERR_CHANOPEN +714, IrcCommand::ERR_KNOCKONCHAN +715, IrcCommand::ERR_KNOCKDISABLED +716, IrcCommand::ERR_TARGUMODEG +717, IrcCommand::RPL_TARGNOTIFY +718, IrcCommand::RPL_UMODEGMSG +720, IrcCommand::RPL_OMOTDSTART +721, IrcCommand::RPL_OMOTD +722, IrcCommand::RPL_ENDOFOMOTD +723, IrcCommand::ERR_NOPRIVS +724, IrcCommand::RPL_TESTMASK +725, IrcCommand::RPL_TESTLINE +726, IrcCommand::RPL_NOTESTLINE +727, IrcCommand::RPL_TESTMASKGECO +728, IrcCommand::RPL_QUIETLIST +729, IrcCommand::RPL_ENDOFQUIETLIS +730, IrcCommand::RPL_MONONLINE +731, IrcCommand::RPL_MONOFFLINE +732, IrcCommand::RPL_MONLIST +733, IrcCommand::RPL_ENDOFMONLIS +734, IrcCommand::ERR_MONLISTFULL +740, IrcCommand::RPL_RSACHALLENGE2 +741, IrcCommand::RPL_ENDOFRSACHALLENGE2 +742, IrcCommand::ERR_MLOCKRESTRICTE +743, IrcCommand::ERR_INVALIDBAN +744, IrcCommand::ERR_TOPICLOCK +750, IrcCommand::RPL_SCANMATCHED +751, IrcCommand::RPL_SCANUMODES +900, IrcCommand::RPL_LOGGEDIN +901, IrcCommand::RPL_LOGGEDOUT +902, IrcCommand::ERR_NICKLOCKED +903, IrcCommand::RPL_SASLSUCCESS +904, IrcCommand::ERR_SASLFAIL +905, IrcCommand::ERR_SASLTOOLONG +906, IrcCommand::ERR_SASLABORTED +907, IrcCommand::ERR_SASLALREADY +908, IrcCommand::RPL_SASLMECHS +ACCOUNT, IrcCommand::ACCOUNT, 1, 1 +AUTHENTICATE, IrcCommand::AUTHENTICATE, 1, 1 +AWAY, IrcCommand::AWAY, 0, 1 +BATCH, IrcCommand::BATCH +BOUNCER, IrcCommand::BOUNCER +CAP, IrcCommand::CAP, 1, 15 +CHGHOST, IrcCommand::CHGHOST, 2, 2 +ERROR, IrcCommand::ERROR, 1, 1 +JOIN, IrcCommand::JOIN, 1, 3 +KICK, IrcCommand::KICK, 3, 3 +MODE, IrcCommand::MODE, 2, 15 +NICK, IrcCommand::NICK, 1, 1 +NOTICE, IrcCommand::NOTICE, 2, 2 +PART, IrcCommand::PART, 2, 2 +PING, IrcCommand::PING, 1, 1 +PRIVMSG, IrcCommand::PRIVMSG, 2, 2 +QUIT, IrcCommand::QUIT, 1, 1 +SETNAME, IrcCommand::SETNAME, 1, 1 +TOPIC, IrcCommand::TOPIC, 2, 2 diff --git a/snote_thread.cpp b/snote_thread.cpp index a17e445..921054a 100644 --- a/snote_thread.cpp +++ b/snote_thread.cpp @@ -11,14 +11,13 @@ auto snote_thread(Connection * connection) -> void static char const* const prefix = "*** Notice -- "; connection->add_listener([connection](IrcMsgEvent& event) { - auto& irc = event.irc; - if ("NOTICE" == irc.command - && 2 == irc.args.size() - && "*" == irc.args[0] - && irc.args[1].starts_with(prefix)) + auto& args = event.irc.args; + if (IrcCommand::NOTICE == event.command + && "*" == args[0] + && args[1].starts_with(prefix)) { event.handled_ = true; - connection->make_event(irc.args[1].substr(strlen(prefix))); + connection->make_event(args[1].substr(strlen(prefix))); } }); }