UNPKG

@thaunknown/web-irc

Version:

A TypeScript port of irc-framework's WebIRC client, without the bloat of unnceessary packages.

280 lines 9.93 kB
import Helpers from '../../helpers'; import { each } from '../../util'; const handlers = { RPL_CHANNELMODEIS: function (command, handler) { const channel = command.params[1]; const raw_modes = command.params[2]; const raw_params = command.params.slice(3); const modes = handler.parseModeList(raw_modes, raw_params); handler.emit('channel info', { channel, modes, raw_modes, raw_params, tags: command.tags }); }, RPL_CREATIONTIME: function (command, handler) { const channel = command.params[1]; handler.emit('channel info', { channel, created_at: parseInt(command.params[2], 10), tags: command.tags }); }, RPL_CHANNEL_URL: function (command, handler) { const channel = command.params[1]; handler.emit('channel info', { channel, url: command.params[command.params.length - 1], tags: command.tags }); }, RPL_NAMEREPLY: function (command, handler) { const members = command.params[command.params.length - 1].split(' '); const normalized_channel = handler.client.caseLower(command.params[2]); const cache = handler.cache('names.' + normalized_channel); if (!cache.members) { cache.members = []; } each(members, function (member) { if (!member) { return; } let j = 0; const modes = []; let user = null; // If we have prefixes, strip them from the nick and keep them separate if (handler.network.options.PREFIX) { for (j = 0; j < handler.network.options.PREFIX.length; j++) { if (member[0] === handler.network.options.PREFIX[j].symbol) { modes.push(handler.network.options.PREFIX[j].mode); member = member.substring(1); } } } // We may have a full user mask if the userhost-in-names CAP is enabled user = Helpers.parseMask(member); cache.members.push({ nick: user.nick, ident: user.user, hostname: user.host, modes, tags: command.tags }); }); }, RPL_ENDOFNAMES: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('names.' + normalized_channel); handler.emit('userlist', { channel: command.params[1], users: cache.members || [], tags: command.tags }); cache.destroy(); }, RPL_INVITELIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('inviteList.' + normalized_channel); if (!cache.invites) { cache.invites = []; } cache.invites.push({ channel: command.params[1], invited: command.params[2], invited_by: command.params[3], invited_at: command.params[4], tags: command.tags }); }, RPL_ENDOFINVITELIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('inviteList.' + normalized_channel); handler.emit('inviteList', { channel: command.params[1], invites: cache.invites || [], tags: command.tags }); cache.destroy(); }, RPL_BANLIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('banlist.' + normalized_channel); if (!cache.bans) { cache.bans = []; } cache.bans.push({ channel: command.params[1], banned: command.params[2], banned_by: command.params[3], banned_at: command.params[4], tags: command.tags }); }, RPL_ENDOFBANLIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('banlist.' + normalized_channel); handler.emit('banlist', { channel: command.params[1], bans: cache.bans || [], tags: command.tags }); cache.destroy(); }, RPL_EXCEPTLIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('exceptlist.' + normalized_channel); if (!cache.excepts) { cache.excepts = []; } cache.excepts.push({ channel: command.params[1], except: command.params[2], except_by: command.params[3], except_at: command.params[4], tags: command.tags }); }, RPL_ENDOFEXCEPTLIST: function (command, handler) { const normalized_channel = handler.client.caseLower(command.params[1]); const cache = handler.cache('exceptlist.' + normalized_channel); handler.emit('exceptlist', { channel: command.params[1], excepts: cache.excepts || [], tags: command.tags }); cache.destroy(); }, RPL_TOPIC: function (command, handler) { handler.emit('topic', { channel: command.params[1], topic: command.params[command.params.length - 1], tags: command.tags, batch: command.batch }); }, RPL_NOTOPIC: function (command, handler) { handler.emit('topic', { channel: command.params[1], topic: '', tags: command.tags, batch: command.batch }); }, RPL_TOPICWHOTIME: function (command, handler) { const parsed = Helpers.parseMask(command.params[2]); handler.emit('topicsetby', { nick: parsed.nick, ident: parsed.user, hostname: parsed.host, channel: command.params[1], when: command.params[3], tags: command.tags }); }, JOIN: function (command, handler) { let channel; let gecos_idx = 1; const data = {}; if (typeof command.params[0] === 'string' && command.params[0] !== '') { channel = command.params[0]; } if (handler.network.cap.isEnabled('extended-join')) { data.account = command.params[1] === '*' ? false : command.params[1]; gecos_idx = 2; } data.nick = command.nick; data.ident = command.ident; data.hostname = command.hostname; data.gecos = command.params[gecos_idx] || ''; data.channel = channel; data.time = command.getServerTime(); data.tags = command.tags; data.batch = command.batch; handler.emit('join', data); }, PART: function (command, handler) { const time = command.getServerTime(); handler.emit('part', { nick: command.nick, ident: command.ident, hostname: command.hostname, channel: command.params[0], message: command.params[command.params.length - 1] || '', time, tags: command.tags, batch: command.batch }); }, KICK: function (command, handler) { const time = command.getServerTime(); handler.emit('kick', { kicked: command.params[1], nick: command.nick, ident: command.ident, hostname: command.hostname, channel: command.params[0], message: command.params[command.params.length - 1] || '', time, tags: command.tags, batch: command.batch }); }, QUIT: function (command, handler) { const time = command.getServerTime(); handler.emit('quit', { nick: command.nick, ident: command.ident, hostname: command.hostname, message: command.params[command.params.length - 1] || '', time, tags: command.tags, batch: command.batch }); }, TOPIC: function (command, handler) { // If we don't have an associated channel, no need to continue if (!command.params[0]) { return; } // Check if we have a server-time const time = command.getServerTime(); const channel = command.params[0]; const topic = command.params[command.params.length - 1] || ''; handler.emit('topic', { nick: command.nick, channel, topic, time, tags: command.tags }); }, INVITE: function (command, handler) { const time = command.getServerTime(); handler.emit('invite', { nick: command.nick, ident: command.ident, hostname: command.hostname, invited: command.params[0], channel: command.params[1], time, tags: command.tags }); }, RPL_INVITING: function (command, handler) { const time = command.getServerTime(); handler.emit('invited', { nick: command.params[1], channel: command.params[2], time, tags: command.tags }); } }; export default function AddCommandHandlers(command_controller) { each(handlers, function (handler, handler_command) { command_controller.addHandler(handler_command, handler); }); } //# sourceMappingURL=channel.js.map