test passing: clients can log in and chat

This commit is contained in:
Andrew Kelley 2013-01-04 22:47:54 -05:00
parent 5e0ae2713a
commit 2e75851fd6
5 changed files with 74 additions and 11 deletions

View File

@ -57,7 +57,7 @@ var server = mc.createServer({
}); });
server.on('login', function(client) { server.on('login', function(client) {
client.write(0x01, { client.write(0x01, {
entityId: 0, entityId: client.id,
levelType: 'default', levelType: 'default',
gameMode: 0, gameMode: 0,
dimension: 0, dimension: 0,

View File

@ -12,12 +12,12 @@ var options = {
var server = mc.createServer(options); var server = mc.createServer(options);
server.on('login', function(client) { 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; var addr = client.socket.remoteAddress + ':' + client.socket.remotePort;
console.log(player.username+' connected', '('+addr+')'); console.log(client.username+' connected', '('+addr+')');
client.on('end', function() { 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+')'); console.log(client.username+' disconnected', '('+addr+')');
}); });

View File

@ -115,6 +115,8 @@ function createClient(options) {
assert.ok(options.username, "username is required"); assert.ok(options.username, "username is required");
var haveCredentials = options.email && options.password; var haveCredentials = options.email && options.password;
var keepAlive = options.keepAlive == null ? true : options.keepAlive; var keepAlive = options.keepAlive == null ? true : options.keepAlive;
var email = options.email;
var password = options.password;
var client = new Client({ var client = new Client({
isServer: false isServer: false
@ -123,7 +125,7 @@ function createClient(options) {
client.on('connect', function() { client.on('connect', function() {
client.write(0x02, { client.write(0x02, {
protocolVersion: protocol.version, protocolVersion: protocol.version,
username: options.username, username: client.username,
serverHost: host, serverHost: host,
serverPort: port, serverPort: port,
}); });
@ -147,7 +149,7 @@ function createClient(options) {
if (haveCredentials) { if (haveCredentials) {
hash = crypto.createHash('sha1'); hash = crypto.createHash('sha1');
hash.update(packet.serverId); 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.push(function(cb) { crypto.randomBytes(16, cb); });
batch.end(function (err, results) { batch.end(function (err, results) {

View File

@ -53,9 +53,7 @@ Client.prototype.setSocket = function(socket) {
Client.prototype.connect = function(port, host) { Client.prototype.connect = function(port, host) {
var self = this; var self = this;
self.setSocket(net.connect(port, host, function() { self.setSocket(net.connect(port, host));
self.emit('connect');
}));
}; };
Client.prototype.end = function(reason) { Client.prototype.end = function(reason) {

View File

@ -322,10 +322,73 @@ describe("mc-server", function() {
playerCount: 0, playerCount: 0,
maxPlayers: 120 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, '<player2> hi');
player2.once(0x03, function(packet) {
assert.strictEqual(packet.message, '<player1> 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"); it("gives correct reason for kicking clients when shutting down");
}); });