Merge pull request #480 from M2Ys4U/config_commandline
[KiwiIRC.git] / server / client.js
index 4bfeb1bf44beddcff72cef6c10b36c0e909a9bb9..d41dc52e3db96568ccc86567c3fa6f87727bab82 100755 (executable)
@@ -2,20 +2,21 @@ var util             = require('util'),
     events           = require('events'),
     crypto           = require('crypto'),
     _                = require('lodash'),
-    State            = require('./irc/state.js');
+    State            = require('./irc/state.js'),
     IrcConnection    = require('./irc/connection.js').IrcConnection,
-    IrcCommands      = require('./irc/commands.js'),
-    ClientCommands   = require('./clientcommands.js');
+    ClientCommands   = require('./clientcommands.js'),
+    WebsocketRpc     = require('./websocketrpc.js');
 
 
 var Client = function (websocket) {
     var that = this;
-    
+
     events.EventEmitter.call(this);
     this.websocket = websocket;
+    this.rpc = new WebsocketRpc(this.websocket);
 
     // Clients address
-    this.real_address = this.websocket.handshake.real_address;
+    this.real_address = this.websocket.meta.real_address;
 
     // A hash to identify this client instance
     this.hash = crypto.createHash('sha256')
@@ -23,29 +24,34 @@ var Client = function (websocket) {
         .update('' + Date.now())
         .update(Math.floor(Math.random() * 100000).toString())
         .digest('hex');
-    
+
     this.state = new State(this);
-    
+
     this.buffer = {
         list: [],
         motd: ''
     };
-    
+
     // Handler for any commands sent from the client
     this.client_commands = new ClientCommands(this);
 
-    websocket.on('irc', function () {
-        handleClientMessage.apply(that, arguments);
+    this.rpc.on('irc', function (response, data) {
+        handleClientMessage.call(that, data, response);
     });
-    websocket.on('kiwi', function () {
-        kiwiCommand.apply(that, arguments);
+    this.rpc.on('kiwi', function (response, data) {
+        kiwiCommand.call(that, data, response);
     });
-    websocket.on('disconnect', function () {
+    websocket.on('close', function () {
         websocketDisconnect.apply(that, arguments);
     });
     websocket.on('error', function () {
         websocketError.apply(that, arguments);
     });
+
+    this.disposed = false;
+
+    // Let the client know it's finished connecting
+    this.sendKiwiCommand('connected');
 };
 util.inherits(Client, events.EventEmitter);
 
@@ -59,21 +65,24 @@ module.exports.Client = Client;
 
 Client.prototype.sendIrcCommand = function (command, data, callback) {
     var c = {command: command, data: data};
-    this.websocket.emit('irc', c, callback);
+    this.rpc.call('irc', c, callback);
 };
 
 Client.prototype.sendKiwiCommand = function (command, data, callback) {
     var c = {command: command, data: data};
-    this.websocket.emit('kiwi', c, callback);
+    this.rpc.call('kiwi', c, callback);
 };
 
 Client.prototype.dispose = function () {
+    this.disposed = true;
+    this.rpc.dispose();
     this.emit('dispose');
     this.removeAllListeners();
 };
 
 function handleClientMessage(msg, callback) {
-    var server, args, obj, channels, keys;
+    var that = this,
+        server;
 
     // Make sure we have a server number specified
     if ((msg.server === null) || (typeof msg.server !== 'number')) {
@@ -97,43 +106,44 @@ function handleClientMessage(msg, callback) {
     }
 
     // Run the client command
-    this.client_commands.run(msg.data.method, msg.data.args, server, callback);
+    global.modules.emit('client command', {
+        command: msg.data,
+        server: server
+    })
+    .done(function() {
+        that.client_commands.run(msg.data.method, msg.data.args, server, callback);
+    });
 }
 
 
 
 
 function kiwiCommand(command, callback) {
-    var that = this;
-    
     if (typeof callback !== 'function') {
         callback = function () {};
     }
+
     switch (command.command) {
         case 'connect':
             if (command.hostname && command.port && command.nick) {
-                var con;
-
-                if (global.config.restrict_server) {
-                    this.state.connect(
-                        global.config.restrict_server,
-                        global.config.restrict_server_port,
-                        global.config.restrict_server_ssl,
-                        command.nick,
-                        {hostname: this.websocket.handshake.revdns, address: this.websocket.handshake.real_address},
-                        global.config.restrict_server_password,
-                        callback);
-
-                } else {
-                    this.state.connect(
-                        command.hostname,
-                        command.port,
-                        command.ssl,
-                        command.nick,
-                        {hostname: this.websocket.handshake.revdns, address: this.websocket.handshake.real_address},
-                        command.password,
-                        callback);
-                }
+                var options = {};
+
+                // Get any optional parameters that may have been passed
+                if (command.encoding)
+                    options.encoding = command.encoding;
+
+                options.password = global.config.restrict_server_password || command.password;
+
+                this.state.connect(
+                    (global.config.restrict_server || command.hostname),
+                    (global.config.restrict_server_port || command.port),
+                    (typeof global.config.restrict_server_ssl !== 'undefined' ?
+                        global.config.restrict_server_ssl :
+                        command.ssl),
+                    command.nick,
+                    {hostname: this.websocket.meta.revdns, address: this.websocket.meta.real_address},
+                    options,
+                    callback);
             } else {
                 return callback('Hostname, port and nickname must be specified');
             }
@@ -147,7 +157,7 @@ function kiwiCommand(command, callback) {
 // Websocket has disconnected, so quit all the IRC connections
 function websocketDisconnect() {
     this.emit('disconnect');
-    
+
     this.dispose();
 }
 
@@ -155,4 +165,4 @@ function websocketDisconnect() {
 // TODO: Should this close all the websocket connections too?
 function websocketError() {
     this.dispose();
-}
\ No newline at end of file
+}