X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=server%2Fclient.js;h=d41dc52e3db96568ccc86567c3fa6f87727bab82;hb=a2e4c7ea01cae98486fa32ff483695c93c6b467c;hp=36edf0c0254088b4a797f7c90b48cd172a24bb31;hpb=64dae534bf6e67818b8666ac85b71af0762af1e0;p=KiwiIRC.git diff --git a/server/client.js b/server/client.js index 36edf0c..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'), 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') @@ -22,30 +24,34 @@ var Client = function (websocket) { .update('' + Date.now()) .update(Math.floor(Math.random() * 100000).toString()) .digest('hex'); - - this.irc_connections = []; - this.next_connection = 0; - + + 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,31 +65,34 @@ 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.emit('destroy'); + 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')) { return (typeof callback === 'function') ? callback('server not specified') : undefined; - } else if (!this.irc_connections[msg.server]) { + } else if (!this.state.irc_connections[msg.server]) { return (typeof callback === 'function') ? callback('not connected to server') : undefined; } // The server this command is directed to - server = this.irc_connections[msg.server]; + server = this.state.irc_connections[msg.server]; if (typeof callback !== 'function') { callback = null; @@ -97,62 +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) { - con = new IrcConnection( - 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); - - } else { - con = new IrcConnection( - command.hostname, - command.port, - command.ssl, - command.nick, - {hostname: this.websocket.handshake.revdns, address: this.websocket.handshake.real_address}, - command.password); - } - - var con_num = this.next_connection++; - this.irc_connections[con_num] = con; - - var irc_commands = new IrcCommands(con, con_num, this); - irc_commands.bindEvents(); - - con.on('connected', function () { - return callback(null, con_num); - }); - - con.on('error', function (err) { - console.log('irc_connection error (' + command.hostname + '):', err); - // TODO: Once multiple servers implemented, specify which server failed - //that.sendKiwiCommand('error', {server: con_num, error: err}); - return callback(err.code, null); - }); - - con.on('close', function () { - that.irc_connections[con_num] = null; - }); + 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'); } @@ -165,14 +156,8 @@ function kiwiCommand(command, callback) { // Websocket has disconnected, so quit all the IRC connections function websocketDisconnect() { - _.each(this.irc_connections, function (irc_connection, i, cons) { - if (irc_connection) { - irc_connection.end('QUIT :' + (global.config.quit_message || '')); - irc_connection.dispose(); - cons[i] = null; - } - }); - + this.emit('disconnect'); + this.dispose(); } @@ -180,4 +165,4 @@ function websocketDisconnect() { // TODO: Should this close all the websocket connections too? function websocketError() { this.dispose(); -} \ No newline at end of file +}