+ bindCommand(ircNumerics.RPL_ENDOFNAMES, function (msg) {
+ websocket.sendClientEvent('userlist_end', {server: '', channel: msg.params.split(" ")[1]});
+ });
+
+ bindCommand(ircNumerics.ERR_LINKCHANNEL, function (msg) {
+ var params = msg.params.split(" ");
+ websocket.sendClientEvent('channel_redirect', {from: params[1], to: params[2]});
+ });
+
+ bindCommand(ircNumerics.ERR_NOSUCHNICK, function (msg) {
+ websocket.sendClientEvent('irc_error', {error: 'no_such_nick', nick: msg.params.split(" ")[1], reason: msg.trailing});
+ });
+
+ bindCommand(ircNumerics.RPL_BANLIST, function (msg) {
+ var params = msg.params.split(" ");
+ kiwi.log(params);
+ websocket.sendClientEvent('banlist', {server: '', channel: params[1], banned: params[2], banned_by: params[3], banned_at: params[4]});
+ });
+
+ bindCommand(ircNumerics.RPL_ENDOFBANLIST, function (msg) {
+ websocket.sendClientEvent('banlist_end', {server: '', channel: msg.params.split(" ")[1]});
+ });
+
+ bindCommand('JOIN', function (msg) {
+ var channel;
+
+ // Some BNC's send malformed JOIN causing the channel to be as a
+ // parameter instead of trailing.
+ if (typeof msg.trailing === 'string' && msg.trailing !== '') {
+ channel = msg.trailing;
+ } else if (typeof msg.params === 'string' && msg.params !== '') {
+ channel = msg.params;
+ }
+
+ websocket.sendClientEvent('join', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: channel});
+ if (msg.nick === irc_connection.IRC.nick) {
+ websocket.sendServerLine('NAMES ' + msg.trailing);
+ }
+ });
+
+ bindCommand('PART', function (msg) {
+ websocket.sendClientEvent('part', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, channel: msg.params.trim(), message: msg.trailing});
+ });
+
+ bindCommand('KICK', function (msg) {
+ var 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});
+ });
+
+ bindCommand('QUIT', function (msg) {
+ websocket.sendClientEvent('quit', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, message: msg.trailing});
+ });
+
+ bindCommand('NOTICE', function (msg) {
+ 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, target: msg.params.trim(), msg: msg.trailing});
+ }
+ });
+
+ bindCommand('NICK', function (msg) {
+ websocket.sendClientEvent('nick', {nick: msg.nick, ident: msg.ident, hostname: msg.hostname, newnick: msg.trailing});
+ });
+
+ bindCommand('TOPIC', function (msg) {
+ var obj = {nick: msg.nick, channel: msg.params, topic: msg.trailing};
+ websocket.sendClientEvent('topic', obj);
+ });
+
+ bindCommand(ircNumerics.RPL_TOPIC, function (msg) {
+ var obj = {nick: '', channel: msg.params.split(" ")[1], topic: msg.trailing};
+ websocket.sendClientEvent('topic', obj);
+ });
+
+ bindCommand(ircNumerics.RPL_NOTOPIC, function (msg) {
+ var obj = {nick: '', channel: msg.params.split(" ")[1], topic: ''};
+ websocket.sendClientEvent('topic', obj);
+ });
+
+ bindCommand(ircNumerics.RPL_TOPICWHOTIME, function (msg) {
+ var parts = msg.params.split(' '),
+ nick = parts[2],
+ channel = parts[1],
+ when = parts[3],
+ obj = {nick: nick, channel: channel, when: when};
+ websocket.sendClientEvent('topicsetby', obj);
+ });
+
+ bindCommand('MODE', function (msg) {
+ var opts = msg.params.split(" "),
+ params = {nick: msg.nick};
+
+ switch (opts.length) {
+ case 1:
+ params.effected_nick = opts[0];
+ params.mode = msg.trailing;