client: Use numeric names instead of numbers where possible

This commit is contained in:
Daniel Oaks 2016-02-11 21:53:11 +10:00
parent 8d6a5affe5
commit 3761a842c5
3 changed files with 313 additions and 4 deletions

@ -10,6 +10,7 @@ import (
"fmt"
"net"
"os"
"strconv"
"strings"
"time"
@ -120,15 +121,26 @@ func (sc *ServerConnection) ReceiveLoop() {
// dispatch events
message, err := ircmsg.ParseLine(line)
// convert numerics to names
cmd := message.Command
num, err := strconv.Atoi(cmd)
if err == nil {
name, exists := Numerics[num]
if exists {
cmd = name
}
}
info := eventmgr.NewInfoMap()
info["server"] = sc
info["tags"] = message.Tags
info["prefix"] = message.Prefix
info["command"] = message.Command
info["command"] = cmd
info["params"] = message.Params
// IRC commands are case-insensitive
sc.dispatchIn(strings.ToUpper(message.Command), info)
sc.dispatchIn(strings.ToUpper(cmd), info)
}
sc.connection.Close()

297
client/events.go Normal file

@ -0,0 +1,297 @@
// written by Daniel Oaks <daniel@danieloaks.net>
// released under the ISC license
package gircclient
// Numerics is a map of IRC numerics to names.
// Taken from http://defs.ircdocs.horse/defs/ircnumerics.html
var Numerics = map[int]string{
1: "RPL_WELCOME",
2: "RPL_YOURHOST",
3: "RPL_CREATED",
4: "RPL_MYINFO",
5: "RPL_ISUPPORT",
8: "RPL_SNOMASK",
9: "RPL_STATMEMTOT",
10: "RPL_BOUNCE",
14: "RPL_YOURCOOKIE",
42: "RPL_YOURID",
43: "RPL_SAVENICK",
50: "RPL_ATTEMPTINGJUNC",
51: "RPL_ATTEMPTINGREROUTE",
105: "RPL_REMOTEISUPPORT",
200: "RPL_TRACELINK",
201: "RPL_TRACECONNECTING",
202: "RPL_TRACEHANDSHAKE",
203: "RPL_TRACEUNKNOWN",
204: "RPL_TRACEOPERATOR",
205: "RPL_TRACEUSER",
206: "RPL_TRACESERVER",
207: "RPL_TRACESERVICE",
208: "RPL_TRACENEWTYPE",
209: "RPL_TRACECLASS",
210: "RPL_STATS",
211: "RPL_STATSLINKINFO",
212: "RPL_STATSCOMMANDS",
213: "RPL_STATSCLINE",
215: "RPL_STATSILINE",
216: "RPL_STATSKLINE",
218: "RPL_STATSYLINE",
219: "RPL_ENDOFSTATS",
221: "RPL_UMODEIS",
234: "RPL_SERVLIST",
235: "RPL_SERVLISTEND",
236: "RPL_STATSVERBOSE",
237: "RPL_STATSENGINE",
239: "RPL_STATSIAUTH",
241: "RPL_STATSLLINE",
242: "RPL_STATSUPTIME",
243: "RPL_STATSOLINE",
244: "RPL_STATSHLINE",
245: "RPL_STATSSLINE",
250: "RPL_STATSCONN",
251: "RPL_LUSERCLIENT",
252: "RPL_LUSEROP",
253: "RPL_LUSERUNKNOWN",
254: "RPL_LUSERCHANNELS",
255: "RPL_LUSERME",
256: "RPL_ADMINME",
257: "RPL_ADMINLOC1",
258: "RPL_ADMINLOC2",
259: "RPL_ADMINEMAIL",
261: "RPL_TRACELOG",
263: "RPL_TRYAGAIN",
265: "RPL_LOCALUSERS",
266: "RPL_GLOBALUSERS",
267: "RPL_START_NETSTAT",
268: "RPL_NETSTAT",
269: "RPL_END_NETSTAT",
271: "RPL_SILELIST",
272: "RPL_ENDOFSILELIST",
273: "RPL_NOTIFY",
276: "RPL_VCHANEXIST",
277: "RPL_VCHANLIST",
278: "RPL_VCHANHELP",
280: "RPL_GLIST",
296: "RPL_CHANINFO_KICKS",
299: "RPL_END_CHANINFO",
300: "RPL_NONE",
301: "RPL_AWAY",
302: "RPL_USERHOST",
303: "RPL_ISON",
305: "RPL_UNAWAY",
306: "RPL_NOWAWAY",
311: "RPL_WHOISUSER",
312: "RPL_WHOISSERVER",
313: "RPL_WHOISOPERATOR",
314: "RPL_WHOWASUSER",
315: "RPL_ENDOFWHO",
317: "RPL_WHOISIDLE",
318: "RPL_ENDOFWHOIS",
319: "RPL_WHOISCHANNELS",
322: "RPL_LIST",
323: "RPL_LISTEND",
324: "RPL_CHANNELMODEIS",
326: "RPL_NOCHANPASS",
327: "RPL_CHPASSUNKNOWN",
328: "RPL_CHANNEL_URL",
329: "RPL_CREATIONTIME",
331: "RPL_NOTOPIC",
332: "RPL_TOPIC",
333: "RPL_TOPICWHOTIME",
336: "RPL_INVITELIST",
337: "RPL_ENDOFINVITELIST",
339: "RPL_BADCHANPASS",
340: "RPL_USERIP",
341: "RPL_INVITING",
345: "RPL_INVITED",
346: "RPL_INVITELIST",
347: "RPL_ENDOFINVITELIST",
348: "RPL_EXCEPTLIST",
349: "RPL_ENDOFEXCEPTLIST",
351: "RPL_VERSION",
352: "RPL_WHOREPLY",
353: "RPL_NAMREPLY",
354: "RPL_WHOSPCRPL",
355: "RPL_NAMREPLY_",
364: "RPL_LINKS",
365: "RPL_ENDOFLINKS",
366: "RPL_ENDOFNAMES",
367: "RPL_BANLIST",
368: "RPL_ENDOFBANLIST",
369: "RPL_ENDOFWHOWAS",
371: "RPL_INFO",
372: "RPL_MOTD",
374: "RPL_ENDOFINFO",
375: "RPL_MOTDSTART",
376: "RPL_ENDOFMOTD",
381: "RPL_YOUREOPER",
382: "RPL_REHASHING",
383: "RPL_YOURESERVICE",
385: "RPL_NOTOPERANYMORE",
388: "RPL_ALIST",
389: "RPL_ENDOFALIST",
391: "RPL_TIME",
392: "RPL_USERSSTART",
393: "RPL_USERS",
394: "RPL_ENDOFUSERS",
395: "RPL_NOUSERS",
400: "ERR_UNKNOWNERROR",
401: "ERR_NOSUCHNICK",
402: "ERR_NOSUCHSERVER",
403: "ERR_NOSUCHCHANNEL",
404: "ERR_CANNOTSENDTOCHAN",
405: "ERR_TOOMANYCHANNELS",
406: "ERR_WASNOSUCHNICK",
407: "ERR_TOOMANYTARGETS",
408: "ERR_NOSUCHSERVICE",
409: "ERR_NOORIGIN",
410: "ERR_INVALIDCAPCMD",
411: "ERR_NORECIPIENT",
412: "ERR_NOTEXTTOSEND",
413: "ERR_NOTOPLEVEL",
414: "ERR_WILDTOPLEVEL",
415: "ERR_BADMASK",
416: "ERR_TOOMANYMATCHES",
419: "ERR_LENGTHTRUNCATED",
421: "ERR_UNKNOWNCOMMAND",
422: "ERR_NOMOTD",
423: "ERR_NOADMININFO",
424: "ERR_FILEERROR",
425: "ERR_NOOPERMOTD",
429: "ERR_TOOMANYAWAY",
430: "ERR_EVENTNICKCHANGE",
431: "ERR_NONICKNAMEGIVEN",
432: "ERR_ERRONEUSNICKNAME",
433: "ERR_NICKNAMEINUSE",
436: "ERR_NICKCOLLISION",
439: "ERR_TARGETTOOFAST",
440: "ERR_SERVICESDOWN",
441: "ERR_USERNOTINCHANNEL",
442: "ERR_NOTONCHANNEL",
443: "ERR_USERONCHANNEL",
444: "ERR_NOLOGIN",
445: "ERR_SUMMONDISABLED",
446: "ERR_USERSDISABLED",
447: "ERR_NONICKCHANGE",
449: "ERR_NOTIMPLEMENTED",
451: "ERR_NOTREGISTERED",
452: "ERR_IDCOLLISION",
453: "ERR_NICKLOST",
455: "ERR_HOSTILENAME",
456: "ERR_ACCEPTFULL",
457: "ERR_ACCEPTEXIST",
458: "ERR_ACCEPTNOT",
459: "ERR_NOHIDING",
460: "ERR_NOTFORHALFOPS",
461: "ERR_NEEDMOREPARAMS",
462: "ERR_ALREADYREGISTERED",
463: "ERR_NOPERMFORHOST",
464: "ERR_PASSWDMISMATCH",
465: "ERR_YOUREBANNEDCREEP",
467: "ERR_KEYSET",
469: "ERR_LINKSET",
471: "ERR_CHANNELISFULL",
472: "ERR_UNKNOWNMODE",
473: "ERR_INVITEONLYCHAN",
474: "ERR_BANNEDFROMCHAN",
475: "ERR_BADCHANNELKEY",
476: "ERR_BADCHANMASK",
478: "ERR_BANLISTFULL",
481: "ERR_NOPRIVILEGES",
482: "ERR_CHANOPRIVSNEEDED",
483: "ERR_CANTKILLSERVER",
485: "ERR_UNIQOPRIVSNEEDED",
491: "ERR_NOOPERHOST",
492: "ERR_NOCTCP",
493: "ERR_NOFEATURE",
494: "ERR_BADFEATURE",
496: "ERR_BADLOGSYS",
497: "ERR_BADLOGVALUE",
498: "ERR_ISOPERLCHAN",
499: "ERR_CHANOWNPRIVNEEDED",
500: "ERR_TOOMANYJOINS",
501: "ERR_UMODEUNKNOWNFLAG",
502: "ERR_USERSDONTMATCH",
504: "ERR_USERNOTONSERV",
511: "ERR_SILELISTFULL",
512: "ERR_TOOMANYWATCH",
513: "ERR_BADPING",
515: "ERR_BADEXPIRE",
516: "ERR_DONTCHEAT",
517: "ERR_DISABLED",
522: "ERR_WHOSYNTAX",
523: "ERR_WHOLIMEXCEED",
525: "ERR_REMOTEPFX",
526: "ERR_PFXUNROUTABLE",
531: "ERR_CANTSENDTOUSER",
550: "ERR_BADHOSTMASK",
551: "ERR_HOSTUNAVAIL",
552: "ERR_USINGSLINE",
600: "RPL_LOGON",
601: "RPL_LOGOFF",
602: "RPL_WATCHOFF",
603: "RPL_WATCHSTAT",
604: "RPL_NOWON",
605: "RPL_NOWOFF",
606: "RPL_WATCHLIST",
607: "RPL_ENDOFWATCHLIST",
608: "RPL_WATCHCLEAR",
611: "RPL_ISLOCOP",
612: "RPL_ISNOTOPER",
613: "RPL_ENDOFISOPER",
618: "RPL_DCCLIST",
624: "RPL_OMOTDSTART",
625: "RPL_OMOTD",
626: "RPL_ENDOFO",
630: "RPL_SETTINGS",
631: "RPL_ENDOFSETTINGS",
672: "RPL_UNKNOWNMODES",
673: "RPL_CANNOTSETMODES",
704: "RPL_HELPSTART",
705: "RPL_HELPTXT",
706: "RPL_ENDOFHELP",
708: "RPL_ETRACEFULL",
709: "RPL_ETRACE",
710: "RPL_KNOCK",
711: "RPL_KNOCKDLVR",
712: "ERR_TOOMANYKNOCK",
713: "ERR_CHANOPEN",
714: "ERR_KNOCKONCHAN",
716: "RPL_TARGUMODEG",
717: "RPL_TARGNOTIFY",
718: "RPL_UMODEGMSG",
720: "RPL_OMOTDSTART",
721: "RPL_OMOTD",
722: "RPL_ENDOFOMOTD",
723: "ERR_NOPRIVS",
724: "RPL_TESTMARK",
725: "RPL_TESTLINE",
726: "RPL_NOTESTLINE",
730: "RPL_MONONLINE",
731: "RPL_MONOFFLINE",
732: "RPL_MONLIST",
733: "RPL_ENDOFMONLIST",
734: "ERR_MONLISTFULL",
760: "RPL_WHOISKEYVALUE",
761: "RPL_KEYVALUE",
762: "RPL_METADATAEND",
764: "ERR_METADATALIMIT",
765: "ERR_TARGETINVALID",
766: "ERR_NOMATCHINGKEY",
767: "ERR_KEYINVALID",
768: "ERR_KEYNOTSET",
769: "ERR_KEYNOPERMISSION",
771: "RPL_XINFO",
773: "RPL_XINFOSTART",
774: "RPL_XINFOEND",
900: "RPL_LOGGEDIN",
901: "RPL_LOGGEDOUT",
902: "ERR_NICKLOCKED",
903: "RPL_SASLSUCCESS",
904: "ERR_SASLFAIL",
905: "ERR_SASLTOOLONG",
906: "ERR_SASLABORTED",
908: "RPL_SASLMECHS",
999: "ERR_NUMERIC_ERR",
}

@ -29,8 +29,8 @@ func NewReactor() Reactor {
// add the default handlers
newReactor.RegisterEvent("in", "CAP", capHandler, -10)
newReactor.RegisterEvent("in", "001", welcomeHandler, -10)
newReactor.RegisterEvent("in", "005", featuresHandler, -10)
newReactor.RegisterEvent("in", "RPL_WELCOME", welcomeHandler, -10)
newReactor.RegisterEvent("in", "RPL_ISUPPORT", featuresHandler, -10)
return newReactor
}