UNPKG

irc-framework

Version:
351 lines (345 loc) 13 kB
'use strict'; require("core-js/modules/es.symbol.js"); require("core-js/modules/es.symbol.description.js"); require("core-js/modules/es.symbol.iterator.js"); require("core-js/modules/es.symbol.to-primitive.js"); require("core-js/modules/es.array.filter.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.date.to-primitive.js"); require("core-js/modules/es.number.constructor.js"); require("core-js/modules/es.object.define-properties.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.object.get-own-property-descriptor.js"); require("core-js/modules/es.object.get-own-property-descriptors.js"); require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/web.dom-collections.iterator.js"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } require("core-js/modules/es.array.for-each.js"); require("core-js/modules/es.array.index-of.js"); require("core-js/modules/es.array.join.js"); require("core-js/modules/es.array.slice.js"); require("core-js/modules/es.array.splice.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.parse-int.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/web.dom-collections.for-each.js"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var _ = { each: require('lodash/each'), clone: require('lodash/clone'), map: require('lodash/map') }; var Helpers = require('../../helpers'); var handlers = { RPL_LISTSTART: function RPL_LISTSTART(command, handler) { var cache = getChanListCache(handler); cache.channels = []; handler.emit('channel list start'); }, RPL_LISTEND: function RPL_LISTEND(command, handler) { var cache = getChanListCache(handler); if (cache.channels.length) { handler.emit('channel list', cache.channels); cache.channels = []; } cache.destroy(); handler.emit('channel list end'); }, RPL_LIST: function RPL_LIST(command, handler) { var cache = getChanListCache(handler); cache.channels.push({ channel: command.params[1], num_users: parseInt(command.params[2], 10), topic: command.params[3] || '', tags: command.tags }); if (cache.channels.length >= 50) { handler.emit('channel list', cache.channels); cache.channels = []; } }, RPL_MOTD: function RPL_MOTD(command, handler) { var cache = handler.cache('motd'); cache.motd += command.params[command.params.length - 1] + '\n'; }, RPL_MOTDSTART: function RPL_MOTDSTART(command, handler) { var cache = handler.cache('motd'); cache.motd = ''; }, RPL_ENDOFMOTD: function RPL_ENDOFMOTD(command, handler) { var cache = handler.cache('motd'); handler.emit('motd', { motd: cache.motd, tags: command.tags }); cache.destroy(); }, ERR_NOMOTD: function ERR_NOMOTD(command, handler) { var params = _.clone(command.params); params.shift(); handler.emit('motd', { error: command.params[command.params.length - 1], tags: command.tags }); }, RPL_OMOTD: function RPL_OMOTD(command, handler) { var cache = handler.cache('oper motd'); cache.motd += command.params[command.params.length - 1] + '\n'; }, RPL_OMOTDSTART: function RPL_OMOTDSTART(command, handler) { var cache = handler.cache('oper motd'); cache.motd = ''; }, RPL_ENDOFOMOTD: function RPL_ENDOFOMOTD(command, handler) { var cache = handler.cache('oper motd'); handler.emit('motd', { motd: cache.motd, tags: command.tags }); cache.destroy(); }, ERR_NOOPERMOTD: function ERR_NOOPERMOTD(command, handler) { var params = _.clone(command.params); params.shift(); handler.emit('motd', { error: command.params[command.params.length - 1], tags: command.tags }); }, RPL_WHOREPLY: function RPL_WHOREPLY(command, handler) { var cache = handler.cache('who'); if (!cache.members) { cache.members = []; } var params = command.params; var _Helpers$parseWhoFlag = Helpers.parseWhoFlags(params[6], handler.network.options), parsedFlags = _Helpers$parseWhoFlag.parsedFlags, unparsedFlags = _Helpers$parseWhoFlag.unparsedFlags; var hops_away = 0; var realname = params[7]; // The realname should be in the format of "<num hops> <real name>" var space_idx = realname.indexOf(' '); if (space_idx > -1) { hops_away = parseInt(realname.substr(0, space_idx), 10); realname = realname.substr(space_idx + 1); } cache.members.push(_objectSpread({ nick: params[5], ident: params[2], hostname: params[3], server: params[4], real_name: realname, num_hops_away: hops_away, channel: params[1], tags: command.tags, unparsed_flags: unparsedFlags }, parsedFlags)); }, RPL_WHOSPCRPL: function RPL_WHOSPCRPL(command, handler) { var cache = handler.cache('who'); if (!cache.members) { cache.members = []; cache.type = 'whox'; } var client = handler.client; var params = command.params; if (cache.token === 0) { // Token validation has already been attempted but failed, // ignore this event as it will not be emitted return; } if (!cache.token) { var token = parseInt(params[1], 10) || 0; if (token && params.length === 12 && client.whox_token.validate(token)) { // Token is valid, store it in the cache cache.token = token; } else { // This event does not have a valid token so did not come from irc-fw, // ignore it as the response order may differ cache.token = 0; return; } } var _Helpers$parseWhoFlag2 = Helpers.parseWhoFlags(params[7], handler.network.options), parsedFlags = _Helpers$parseWhoFlag2.parsedFlags, unparsedFlags = _Helpers$parseWhoFlag2.unparsedFlags; // Some ircd's use n/a for no level, use undefined to represent no level var op_level = /^[0-9]+$/.test(params[10]) ? parseInt(params[10], 10) : undefined; cache.members.push(_objectSpread({ nick: params[6], ident: params[3], hostname: params[4], server: params[5], op_level: op_level, real_name: params[11], account: params[9] === '0' ? '' : params[9], num_hops_away: parseInt(params[8], 10), channel: params[2], tags: command.tags, unparsed_flags: unparsedFlags }, parsedFlags)); }, RPL_ENDOFWHO: function RPL_ENDOFWHO(command, handler) { var cache = handler.cache('who'); if (cache.type === 'whox' && !cache.token) { // Dont emit wholist for whox requests without a token // they did not come from irc-fw cache.destroy(); return; } handler.emit('wholist', { target: command.params[1], users: cache.members || [], tags: command.tags }); cache.destroy(); }, PING: function PING(command, handler) { handler.connection.write('PONG ' + command.params[command.params.length - 1]); var time = command.getServerTime(); handler.emit('ping', { message: command.params[1], time: time, tags: command.tags }); }, PONG: function PONG(command, handler) { var time = command.getServerTime(); if (time) { handler.network.addServerTimeOffset(time); } handler.emit('pong', { message: command.params[1], time: time, tags: command.tags }); }, MODE: function MODE(command, handler) { // Check if we have a server-time var time = command.getServerTime(); // Get a JSON representation of the modes var raw_modes = command.params[1]; var raw_params = command.params.slice(2); var modes = handler.parseModeList(raw_modes, raw_params); handler.emit('mode', { target: command.params[0], nick: command.nick || command.prefix || '', modes: modes, time: time, raw_modes: raw_modes, raw_params: raw_params, tags: command.tags, batch: command.batch }); }, RPL_LINKS: function RPL_LINKS(command, handler) { var cache = handler.cache('links'); cache.links = cache.links || []; cache.links.push({ address: command.params[1], access_via: command.params[2], hops: parseInt(command.params[3].split(' ')[0]), description: command.params[3].split(' ').splice(1).join(' '), tags: command.tags }); }, RPL_ENDOFLINKS: function RPL_ENDOFLINKS(command, handler) { var cache = handler.cache('links'); handler.emit('server links', { links: cache.links }); cache.destroy(); }, RPL_INFO: function RPL_INFO(command, handler) { var cache = handler.cache('info'); if (!cache.info) { cache.info = ''; } cache.info += command.params[command.params.length - 1] + '\n'; }, RPL_ENDOFINFO: function RPL_ENDOFINFO(command, handler) { var cache = handler.cache('info'); handler.emit('info', { info: cache.info, tags: command.tags }); cache.destroy(); }, RPL_HELPSTART: function RPL_HELPSTART(command, handler) { var cache = handler.cache('help'); cache.help = command.params[command.params.length - 1] + '\n'; }, RPL_HELPTXT: function RPL_HELPTXT(command, handler) { var cache = handler.cache('help'); cache.help += command.params[command.params.length - 1] + '\n'; }, RPL_ENDOFHELP: function RPL_ENDOFHELP(command, handler) { var cache = handler.cache('help'); handler.emit('help', { help: cache.help, tags: command.tags }); cache.destroy(); }, BATCH: function BATCH(command, handler) { var batch_start = command.params[0].substr(0, 1) === '+'; var batch_id = command.params[0].substr(1); var cache_key = 'batch.' + batch_id; if (!batch_id) { return; } if (batch_start) { var _cache = handler.cache(cache_key); _cache.commands = []; _cache.type = command.params[1]; _cache.params = command.params.slice(2); return; } if (!handler.hasCache(cache_key)) { // If we don't have this batch ID in cache, it either means that the // server hasn't sent the starting batch command or that the server // has already sent the end batch command. return; } var cache = handler.cache(cache_key); var emit_obj = { id: batch_id, type: cache.type, params: cache.params, commands: cache.commands }; // Destroy the cache object before executing each command. If one // errors out then we don't have the cache object stuck in memory. cache.destroy(); handler.emit('batch start', emit_obj); handler.emit('batch start ' + emit_obj.type, emit_obj); emit_obj.commands.forEach(function (c) { c.batch = { id: batch_id, type: cache.type, params: cache.params }; handler.executeCommand(c); }); handler.emit('batch end', emit_obj); handler.emit('batch end ' + emit_obj.type, emit_obj); } }; module.exports = function AddCommandHandlers(command_controller) { _.each(handlers, function (handler, handler_command) { command_controller.addHandler(handler_command, handler); }); }; function getChanListCache(handler) { var cache = handler.cache('chanlist'); // fix some IRC networks if (!cache.channels) { cache.channels = []; } return cache; }