Merge branch 'development'
[KiwiIRC.git] / server / irc / commands / channel.js
diff --git a/server/irc/commands/channel.js b/server/irc/commands/channel.js
new file mode 100644 (file)
index 0000000..2709b3d
--- /dev/null
@@ -0,0 +1,224 @@
+var _ = require('lodash');
+
+module.exports = function AddCommandHandlers(command_controller) {
+    _.each(handlers, function(handler, handler_command) {
+        command_controller.addHandler(handler_command, handler);
+    });
+};
+
+
+var handlers = {
+    RPL_CHANNELMODEIS: function (command) {
+        var channel = command.params[1],
+            modes = this.parseModeList.call(this, command.params[2], command.params.slice(3));
+
+        this.emit('channel ' + channel + ' info', {
+            channel: channel,
+            modes: modes
+        });
+    },
+
+
+    RPL_CREATIONTIME: function (command) {
+        var channel = command.params[1];
+
+        this.emit('channel ' + channel + ' info', {
+            channel: channel,
+            created_at: parseInt(command.params[2], 10)
+        });
+    },
+
+
+    RPL_CHANNEL_URL: function (command) {
+        var channel = command.params[1];
+
+        this.emit('channel ' + channel + ' info', {
+            channel: channel,
+            url: command.params[command.params.length - 1]
+        });
+    },
+
+
+    RPL_NAMEREPLY: function (command) {
+        var members = command.params[command.params.length - 1].split(' ');
+        var member_list = [];
+        var that = this;
+        _.each(members, function (member) {
+            var i = 0,
+                j = 0,
+                modes = [];
+
+            // Make sure we have some prefixes already
+            if (that.irc_connection.options.PREFIX) {
+                for (j = 0; j < that.irc_connection.options.PREFIX.length; j++) {
+                    if (member.charAt(i) === that.irc_connection.options.PREFIX[j].symbol) {
+                        modes.push(that.irc_connection.options.PREFIX[j].mode);
+                        i++;
+                    }
+                }
+            }
+
+            member_list.push({nick: member, modes: modes});
+        });
+
+        this.emit('channel ' + command.params[2] + ' userlist', {
+            users: member_list,
+            channel: command.params[2]
+        });
+    },
+
+
+    RPL_ENDOFNAMES: function (command) {
+        this.emit('channel ' + command.params[1] + ' userlist_end', {
+            channel: command.params[1]
+        });
+    },
+
+
+    RPL_BANLIST: function (command) {
+        this.emit('channel ' + command.params[1] + ' banlist', {
+            channel: command.params[1],
+            banned: command.params[2],
+            banned_by: command.params[3],
+            banned_at: command.params[4]
+        });
+    },
+
+
+    RPL_ENDOFBANLIST: function (command) {
+        this.emit('channel ' + command.params[1] + ' banlist_end', {
+            channel: command.params[1]
+        });
+    },
+
+
+    RPL_TOPIC: function (command) {
+        this.emit('channel ' + command.params[1] + ' topic', {
+            channel: command.params[1],
+            topic: command.params[command.params.length - 1]
+        });
+    },
+
+
+    RPL_NOTOPIC: function (command) {
+        this.emit('channel ' + command.params[1] + ' topic', {
+            channel: command.params[1],
+            topic: ''
+        });
+    },
+
+
+    RPL_TOPICWHOTIME: function (command) {
+        this.emit('channel ' + command.params[1] + ' topicsetby', {
+            nick: command.params[2],
+            channel: command.params[1],
+            when: command.params[3]
+        });
+    },
+
+
+    JOIN: function (command) {
+        var channel, time;
+        if (typeof command.params[0] === 'string' && command.params[0] !== '') {
+            channel = command.params[0];
+        }
+
+        // Check if we have a server-time
+        time = command.getServerTime();
+
+        this.emit('channel ' + channel + ' join', {
+            nick: command.nick,
+            ident: command.ident,
+            hostname: command.hostname,
+            channel: channel,
+            time: time
+        });
+    },
+
+
+    PART: function (command) {
+        var time, channel, message;
+
+        // Check if we have a server-time
+        time = command.getServerTime();
+
+        channel = command.params[0];
+        if (command.params.length > 1) {
+            message = command.params[command.params.length - 1];
+        }
+
+        this.emit('channel ' + channel + ' part', {
+            nick: command.nick,
+            ident: command.ident,
+            hostname: command.hostname,
+            channel: channel,
+            message: message,
+            time: time
+        });
+    },
+
+
+    KICK: function (command) {
+        var time;
+
+        // Check if we have a server-time
+        time = command.getServerTime();
+
+        this.emit('channel ' + command.params[0] + ' 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: time
+        });
+    },
+
+
+    QUIT: function (command) {
+        var time;
+
+        // Check if we have a server-time
+        time = command.getServerTime();
+
+        this.emit('user ' + command.nick + ' quit', {
+            nick: command.nick,
+            ident: command.ident,
+            hostname: command.hostname,
+            message: command.params[command.params.length - 1],
+            time: time
+        });
+    },
+
+
+    TOPIC: function (command) {
+        var time;
+
+        // If we don't have an associated channel, no need to continue
+        if (!command.params[0]) {
+            return;
+        }
+
+        // Check if we have a server-time
+        time = command.getServerTime();
+
+        var channel = command.params[0],
+            topic = command.params[command.params.length - 1] || '';
+
+        this.emit('channel ' + channel + ' topic', {
+            nick: command.nick,
+            channel: channel,
+            topic: topic,
+            time: time
+        });
+    },
+
+
+    RPL_INVITING: function (command) {
+        this.emit('channel ' + command.params[1] + ' invited', {
+            nick: command.params[0],
+            channel: command.params[1]
+        });
+    },
+};
\ No newline at end of file