_ = require('lodash'),
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')
.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 () {
});
this.disposed = false;
+
+ // Let the client know it's finished connecting
+ this.sendKiwiCommand('connected');
};
util.inherits(Client, events.EventEmitter);
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;
+ var that = this,
+ server;
// Make sure we have a server number specified
if ((msg.server === null) || (typeof msg.server !== 'number')) {
}
// 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);
+ });
}
global.config.restrict_server_ssl :
command.ssl),
command.nick,
- {hostname: this.websocket.handshake.revdns, address: this.websocket.handshake.real_address},
+ {hostname: this.websocket.meta.revdns, address: this.websocket.meta.real_address},
options,
callback);
} else {
// Websocket has disconnected, so quit all the IRC connections
function websocketDisconnect() {
this.emit('disconnect');
-
+
this.dispose();
}