- websocket.sendClientEvent('join', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: channel});
- if (msg.nick === ircSocket.IRC.nick) {
- websocket.sendServerLine('NAMES ' + msg.trailing);
- }
- break;
- case 'PART':
- websocket.sendClientEvent('part', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), message: msg.trailing});
- break;
- case 'KICK':
- params = msg.params.split(" ");
- websocket.sendClientEvent('kick', {kicked: params[1], nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: params[0].trim(), message: msg.trailing});
- break;
- case 'QUIT':
- websocket.sendClientEvent('quit', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, message: msg.trailing});
- break;
- case 'NOTICE':
- if ((msg.trailing.charAt(0) === String.fromCharCode(1)) && (msg.trailing.charAt(msg.trailing.length - 1) === String.fromCharCode(1))) {
- // It's a CTCP response
- websocket.sendClientEvent('ctcp_response', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), msg: msg.trailing.substr(1, msg.trailing.length - 2)});
- } else {
- websocket.sendClientEvent('notice', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), msg: msg.trailing});
- }
- break;
- case 'NICK':
- websocket.sendClientEvent('nick', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, newnick: msg.trailing});
- break;
- case 'TOPIC':
- obj = {nick: msg.nick, channel: msg.params, topic: msg.trailing};
- websocket.sendClientEvent('topic', obj);
- break;
- case ircNumerics.RPL_TOPIC:
- obj = {nick: '', channel: msg.params.split(" ")[1], topic: msg.trailing};
- websocket.sendClientEvent('topic', obj);
- break;
- case ircNumerics.RPL_NOTOPIC:
- obj = {nick: '', channel: msg.params.split(" ")[1], topic: ''};
- websocket.sendClientEvent('topic', obj);
- break;
- case 'MODE':
- opts = msg.params.split(" ");
- params = {nick: msg.nick};
- switch (opts.length) {
- case 1:
- params.effected_nick = opts[0];
- params.mode = msg.trailing;
- break;
- case 2:
- params.channel = opts[0];
- params.mode = opts[1];
- break;
- default:
- params.channel = opts[0];
- params.mode = opts[1];
- params.effected_nick = opts[2];
- break;
- }
- websocket.sendClientEvent('mode', params);
- break;
- case 'PRIVMSG':
- if ((msg.trailing.charAt(0) === String.fromCharCode(1)) && (msg.trailing.charAt(msg.trailing.length - 1) === String.fromCharCode(1))) {
- // It's a CTCP request
- if (msg.trailing.substr(1, 6) === 'ACTION') {
- websocket.sendClientEvent('action', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), msg: msg.trailing.substr(7, msg.trailing.length - 2)});
- } else if (msg.trailing.substr(1, 7) === 'VERSION') {
- ircSocket.write('NOTICE ' + msg.nick + ' :' + String.fromCharCode(1) + 'VERSION KiwiIRC' + String.fromCharCode(1) + '\r\n');
- } else {
- websocket.sendClientEvent('ctcp_request', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), msg: msg.trailing.substr(1, msg.trailing.length - 2)});
- }
- } else {
- obj = {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), msg: msg.trailing};
- websocket.sendClientEvent('msg', obj);
- }
- break;
- case 'CAP':
- caps = config.cap_options;
- options = msg.trailing.split(" ");
- switch (_.last(msg.params.split(" "))) {
- case 'LS':
- opts = '';
- _.each(_.intersect(caps, options), function (cap) {
- if (opts !== '') {
- opts += " ";
- }
- opts += cap;
- ircSocket.IRC.CAP.requested.push(cap);
- });
- if (opts.length > 0) {
- websocket.sendServerLine('CAP REQ :' + opts);
- } else {
- websocket.sendServerLine('CAP END');
- }
- // TLS is special
- /*if (_.include(options, 'tls')) {
- websocket.sendServerLine('STARTTLS');
- ircSocket.IRC.CAP.requested.push('tls');
- }*/
- break;
- case 'ACK':
- _.each(options, function (cap) {
- ircSocket.IRC.CAP.enabled.push(cap);
- });
- if (_.last(msg.params.split(" ")) !== '*') {
- ircSocket.IRC.CAP.requested = [];
- ircSocket.IRC.CAP.negotiating = false;
- websocket.sendServerLine('CAP END');
- }
- break;
- case 'NAK':
- ircSocket.IRC.CAP.requested = [];
- ircSocket.IRC.CAP.negotiating = false;
- websocket.sendServerLine('CAP END');
- break;
- }
- break;
- /*case ircNumerics.RPL_STARTTLS:
- try {
- IRC = ircSocket.IRC;
- listeners = ircSocket.listeners('data');
- ircSocket.removeAllListeners('data');
- ssl_socket = starttls(ircSocket, {}, function () {
- ssl_socket.on("data", function (data) {
- ircSocketDataHandler(data, websocket, ssl_socket);
- });
- ircSocket = ssl_socket;
- ircSocket.IRC = IRC;
- _.each(listeners, function (listener) {
- ircSocket.addListener('data', listener);
- });
- });
- //console.log(ircSocket);
- } catch (e) {
- console.log(e);
- }
- break;*/
- case ircNumerics.ERR_CANNOTSENDTOCHAN:
- websocket.sendClientEvent('irc_error', {error: 'cannot_send_to_chan', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_TOOMANYCHANNELS:
- websocket.sendClientEvent('irc_error', {error: 'too_many_channels', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_USERNOTINCHANNEL:
- params = msg.params.split(" ");
- websocket.sendClientEvent('irc_error', {error: 'user_not_in_channel', nick: params[0], channel: params[1], reason: msg.trainling});
- break;
- case ircNumerics.ERR_NOTONCHANNEL:
- websocket.sendClientEvent('irc_error', {error: 'not_on_channel', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_CHANNELISFULL:
- websocket.sendClientEvent('irc_error', {error: 'channel_is_full', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_INVITEONLYCHAN:
- websocket.sendClientEvent('irc_error', {error: 'invite_only_channel', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_BANNEDFROMCHAN:
- websocket.sendClientEvent('irc_error', {error: 'banned_from_channel', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_BADCHANNELKEY:
- websocket.sendClientEvent('irc_error', {error: 'bad_channel_key', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_CHANOPRIVSNEEDED:
- websocket.sendClientEvent('irc_error', {error: 'chanop_privs_needed', channel: msg.params.split(" ")[1], reason: msg.trailing});
- break;
- case ircNumerics.ERR_NICKNAMEINUSE:
- websocket.sendClientEvent('irc_error', {error: 'nickname_in_use', nick: _.last(msg.params.split(" ")), reason: msg.trailing});
- break;
- case 'ERROR':
- ircSocket.end();
- websocket.sendClientEvent('irc_error', {error: 'error', reason: msg.trailing});
- websocket.disconnect();
- break;
- default:
- console.log("Unknown command (" + String(msg.command).toUpperCase() + ")");
- }
- } else {
- console.log("Malformed IRC line");
- }
-};