X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=server%2Fclient.js;h=d41dc52e3db96568ccc86567c3fa6f87727bab82;hb=a2e4c7ea01cae98486fa32ff483695c93c6b467c;hp=a288c88a3aa48eac9648523b112a74075d2e834b;hpb=3ec786bce5dd945e983afd7e7440f5eac7294042;p=KiwiIRC.git diff --git a/server/client.js b/server/client.js index a288c88..d41dc52 100755 --- a/server/client.js +++ b/server/client.js @@ -2,19 +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, - 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') @@ -22,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); @@ -58,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')) { @@ -96,30 +106,43 @@ 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; + 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), - (global.config.restrict_server_ssl || command.ssl), + (typeof global.config.restrict_server_ssl !== 'undefined' ? + global.config.restrict_server_ssl : + command.ssl), command.nick, - {hostname: this.websocket.handshake.revdns, address: this.websocket.handshake.real_address}, - (global.config.restrict_server_password || command.password), + {hostname: this.websocket.meta.revdns, address: this.websocket.meta.real_address}, + options, callback); } else { return callback('Hostname, port and nickname must be specified'); @@ -134,7 +157,7 @@ function kiwiCommand(command, callback) { // Websocket has disconnected, so quit all the IRC connections function websocketDisconnect() { this.emit('disconnect'); - + this.dispose(); }