From 2e75851fd6519dbe3adb684cbe20e8cf44666620 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 4 Jan 2013 22:47:54 -0500 Subject: [PATCH] test passing: clients can log in and chat --- README.md | 2 +- examples/server.js | 6 ++--- index.js | 6 +++-- lib/client.js | 4 +-- test/test.js | 67 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 74 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index be74889..aef4da7 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ var server = mc.createServer({ }); server.on('login', function(client) { client.write(0x01, { - entityId: 0, + entityId: client.id, levelType: 'default', gameMode: 0, dimension: 0, diff --git a/examples/server.js b/examples/server.js index f20fb42..3c8ba0d 100644 --- a/examples/server.js +++ b/examples/server.js @@ -12,12 +12,12 @@ var options = { var server = mc.createServer(options); server.on('login', function(client) { - broadcast(yellow + player.username+' joined the game.'); + broadcast(yellow + client.username+' joined the game.'); var addr = client.socket.remoteAddress + ':' + client.socket.remotePort; - console.log(player.username+' connected', '('+addr+')'); + console.log(client.username+' connected', '('+addr+')'); client.on('end', function() { - broadcast(yellow + player.username+' left the game.', client); + broadcast(yellow + client.username+' left the game.', client); console.log(client.username+' disconnected', '('+addr+')'); }); diff --git a/index.js b/index.js index cd6aebe..3e57bac 100644 --- a/index.js +++ b/index.js @@ -115,6 +115,8 @@ function createClient(options) { assert.ok(options.username, "username is required"); var haveCredentials = options.email && options.password; var keepAlive = options.keepAlive == null ? true : options.keepAlive; + var email = options.email; + var password = options.password; var client = new Client({ isServer: false @@ -123,7 +125,7 @@ function createClient(options) { client.on('connect', function() { client.write(0x02, { protocolVersion: protocol.version, - username: options.username, + username: client.username, serverHost: host, serverPort: port, }); @@ -147,7 +149,7 @@ function createClient(options) { if (haveCredentials) { hash = crypto.createHash('sha1'); hash.update(packet.serverId); - batch.push(function(cb) { getLoginSession(options.email, options.password, cb); }); + batch.push(function(cb) { getLoginSession(email, password, cb); }); } batch.push(function(cb) { crypto.randomBytes(16, cb); }); batch.end(function (err, results) { diff --git a/lib/client.js b/lib/client.js index b94dab6..cabe8a7 100644 --- a/lib/client.js +++ b/lib/client.js @@ -53,9 +53,7 @@ Client.prototype.setSocket = function(socket) { Client.prototype.connect = function(port, host) { var self = this; - self.setSocket(net.connect(port, host, function() { - self.emit('connect'); - })); + self.setSocket(net.connect(port, host)); }; Client.prototype.end = function(reason) { diff --git a/test/test.js b/test/test.js index 71ec94d..fa38912 100644 --- a/test/test.js +++ b/test/test.js @@ -322,10 +322,73 @@ describe("mc-server", function() { playerCount: 0, maxPlayers: 120 }); - done(); + server.close(); }); }); + server.on('close', done); + }); + it("clients can log in and chat", function(done) { + var server = mc.createServer({ 'online-mode': false, }); + var username = ['player1', 'player2']; + var index = 0; + server.on('login', function(client) { + assert.notEqual(client.id, null); + assert.strictEqual(client.username, username[index++]); + broadcast(client.username + ' joined the game.'); + client.on('end', function() { + broadcast(client.username + ' left the game.', client); + if (client.username === 'player2') server.close(); + }); + client.write(0x01, { + entityId: client.id, + levelType: 'default', + gameMode: 1, + dimension: 0, + difficulty: 2, + maxPlayers: server.maxPlayers + }); + client.on(0x03, function(packet) { + var message = '<' + client.username + '>' + ' ' + packet.message; + broadcast(message); + }); + }); + server.on('close', done); + server.on('listening', function() { + var player1 = mc.createClient({ username: 'player1' }); + player1.on(0x01, function(packet) { + assert.strictEqual(packet.gameMode, 1); + assert.strictEqual(packet.levelType, 'default'); + assert.strictEqual(packet.dimension, 0); + assert.strictEqual(packet.difficulty, 2); + var player2 = mc.createClient({ username: 'player2' }); + player2.on(0x01, function(packet) { + player1.once(0x03, function(packet) { + assert.strictEqual(packet.message, 'player2 joined the game.'); + player1.once(0x03, function(packet) { + assert.strictEqual(packet.message, ' hi'); + player2.once(0x03, function(packet) { + assert.strictEqual(packet.message, ' hello'); + player1.once(0x03, function(packet) { + assert.strictEqual(packet.message, 'player2 left the game.'); + player1.end(); + }); + player2.end(); + }); + player1.write(0x03, { message: "hello" } ); + }); + player2.write(0x03, { message: "hi" } ); + }); + }); + }); + }); + + function broadcast(message, exclude) { + var client; + for (var clientId in server.clients) { + client = server.clients[clientId]; + if (client !== exclude) client.write(0x03, { message: message }); + } + } }); - it("clients can log in and chat"); it("gives correct reason for kicking clients when shutting down"); });