lib/plugins/numeric.js
/*jslint node: true*/
"use strict";
var _ = require('lodash');
var utils = require('../utils');
module.exports = function () {
return function (irc) {
/**
* Catch all numerics registered in the IRC RFCs.
* We are aware RFC recommendation is that 005 is RPL_BOUNCE
* however multiple networks run the RFC draft on RPL_ISUPPORT
* and as such, we're going to use this since it's a long
* standing, critical part of supporting different IRC software
*/
irc.numerics = {
'001': 'RPL_WELCOME',
'002': 'RPL_YOURHOST',
'003': 'RPL_CREATED',
'004': 'RPL_MYINFO',
'005': 'RPL_ISUPPORT',
'200': 'RPL_TRACELINK',
'201': 'RPL_TRACECONNECTING',
'202': 'RPL_TRACEHANDSHAKE',
'203': 'RPL_TRACEUNKNOWN',
'204': 'RPL_TRACEOPERATOR',
'205': 'RPL_TRACEUSER',
'206': 'RPL_TRACESERVER',
'208': 'RPL_TRACENEWTYPE',
'211': 'RPL_STATSLINKINFO',
'212': 'RPL_STATSCOMMANDS',
'213': 'RPL_STATSCLINE',
'214': 'RPL_STATSNLINE',
'215': 'RPL_STATSILINE',
'216': 'RPL_STATSKLINE',
'218': 'RPL_STATSYLINE',
'219': 'RPL_ENDOFSTATS',
'221': 'RPL_UMODEIS',
'241': 'RPL_STATSLLINE',
'242': 'RPL_STATSUPTIME',
'243': 'RPL_STATSOLINE',
'244': 'RPL_STATSHLINE',
'251': 'RPL_LUSERCLIENT',
'252': 'RPL_LUSEROP',
'253': 'RPL_LUSERUNKNOWN',
'254': 'RPL_LUSTERCHANNELS',
'255': 'RPL_LUSERME',
'256': 'RPL_ADMINME',
'257': 'RPL_ADMINLOC1',
'258': 'RPL_ADMINLOC2',
'259': 'RPL_ADMINEMAIL',
'261': 'RPL_TRACELOG',
'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',
'321': 'RPL_LISTSTART',
'322': 'RPL_LIST',
'323': 'RPL_LISTEND',
'324': 'RPL_CHANNELMODEIS',
'331': 'RPL_NOTOPIC',
'332': 'RPL_TOPIC',
'341': 'RPL_INVITING',
'342': 'RPL_SUMMONING',
'351': 'RPL_VERSION',
'352': 'RPL_WHOREPLY',
'353': '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',
'376': 'RPL_ENDOFMOTD',
'381': 'RPL_YOUREOPER',
'382': 'RPL_REHASHING',
'391': 'RPL_TIME',
'392': 'RPL_USERSSTART',
'393': 'RPL_USERS',
'394': 'RPL_ENDOFUSERS',
'395': 'RPL_NOUSERS',
'401': 'ERR_NOSUCHNICK',
'402': 'ERR_NOSUCHSERVER',
'403': 'ERR_NOSUCHCHANNEL',
'404': 'ERR_CANNOTSENDTOCHAN',
'405': 'ERR_TOOMANYCHANNELS',
'406': 'ERR_WASNOSUCKNICK',
'407': 'ERR_TOOMANYTARGETS',
'409': 'ERR_NOORIGIN',
'411': 'ERR_NORECIPIENT',
'412': 'ERR_NOTEXTTOSEND',
'413': 'ERR_NOTOPEVEL',
'414': 'ERR_WILDTOPLEVEL',
'421': 'ERR_UNKNOWNCOMMAND',
'422': 'ERR_NOMOTD',
'423': 'ERR_ADMININFO',
'424': 'ERR_FILEERROR',
'431': 'ERR_NONICKNAMEGIVEN',
'432': 'ERR_ERRONEUSNICKNAME',
'433': 'ERR_NICKNAMEINUSE',
'436': 'ERR_NICKCOLLISION',
'441': 'ERR_USERNOTINCHANNEL',
'442': 'ERR_NOTONCHANNEL',
'443': 'ERR_USERONCHANNEL',
'444': 'ERR_NOLOGIN',
'445': 'ERR_SUMMONDISABLED',
'446': 'ERR_USERSDISABLED',
'451': 'ERR_NOTREGISTERED',
'461': 'ERR_NEEDMOREPARAMS',
'462': 'ERR_ALREADYREGISTERED',
'463': 'ERR_NOPERMFORHOST',
'464': 'ERR_PASSWDMISMATCH',
'465': 'ERR_YOUREBANNEDCREEP',
'467': 'ERR_KEYSET',
'471': 'ERR_CHANNELISFULL',
'472': 'ERR_UNKNOWNMODE',
'473': 'ERR_INVITEONLYCHAN',
'474': 'ERR_BANNEDFROMCHAN',
'475': 'ERR_BADCHANNELKEY',
'481': 'ERR_NOPRIVILEGES',
'482': 'ERR_CHANOPRIVSNEEDED',
'483': 'ERR_CANTKILLSERVER',
'491': 'ERR_NOOPERHOST',
'501': 'ERR_UMODEUNKNOWNFLAG',
'502': 'ERR_USERSDONTMATCH'
};
irc.on('data', function (err, msg) {
if (msg.command.match(/^(RPL|ERR)_/)) {
if (isNaN(msg.command)) {
msg.numeric = irc.getNumericByCommand(msg.command);
} else {
msg.numeric = msg.command
msg.command = irc.getCommandByNumeric(msg.numeric);
}
utils.emit(irc, msg.network, msg.numeric, msg);
utils.emit(irc, msg.network, 'numeric', msg);
}
});
irc.getNumericByCommand = function (command) {
return (_.invert(irc.numerics))[command];
};
irc.getCommandByNumeric = function (numeric) {
return irc.numerics[numeric];
}
};
};