From f5884caf1f5276c3b469cb0a489b3fb1fb3a76b9 Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Fri, 11 Dec 2015 15:33:48 +0100 Subject: [PATCH] fix player.kick (just use player._client.end), add serv.quit(reason), wait for login messages in mineflayer test --- package.json | 6 ++-- src/lib/plugins/login.js | 2 +- src/lib/plugins/logout.js | 14 ++++++++ src/lib/plugins/moderation.js | 10 ++---- test/mineflayer.js | 63 ++++++++++++++++++++++++++--------- 5 files changed, 68 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index b9b326a..0d1563a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "babel-runtime": "^5.4.4", "emit-then": "^1.0.2", "minecraft-data": "0.7.0", - "minecraft-protocol": "0.16.2", + "minecraft-protocol": "0.16.3", "mkdirp": "0.5.1", "moment": "^2.10.6", "node-dir": "~0.1.9", @@ -41,7 +41,8 @@ "request-promise": "^0.4.3", "requireindex": "~1.0.0", "spiralloop": "1.0.2", - "vec3": "0.1.3" + "vec3": "0.1.3", + "event-promise": "0.0.1" }, "license": "MIT", "repository": { @@ -55,7 +56,6 @@ "babel": "5.8.23", "chai": "~3.2.0", "doctoc": "^0.15.0", - "event-promise": "0.0.1", "gulp": "^3.8.11", "gulp-babel": "^5.1.0", "gulp-plumber": "^1.0.1", diff --git a/src/lib/plugins/login.js b/src/lib/plugins/login.js index 8253b9d..8b158eb 100644 --- a/src/lib/plugins/login.js +++ b/src/lib/plugins/login.js @@ -143,7 +143,7 @@ module.exports.player=function(player,serv) player.login = async () => { if (serv.uuidToPlayer[player._client.uuid]) { - player._client.end("You are already connected"); + player.kick("You are already connected"); return; } if (serv.bannedPlayers[player._client.uuid]) { diff --git a/src/lib/plugins/logout.js b/src/lib/plugins/logout.js index 526c8e1..c4b67a9 100644 --- a/src/lib/plugins/logout.js +++ b/src/lib/plugins/logout.js @@ -1,3 +1,17 @@ +var once = require('event-promise'); + +module.exports.server=function(serv) +{ + serv.quit=async(reason="Going down") => { + await Promise.all(serv.players.map((player) => { + player.kick(reason); + return once(player,'disconnected'); + })); + serv._server.close(); + await once(serv._server,"close"); + }; +}; + module.exports.player=function(player,serv) { player.despawnEntities = entities => player._client.write('entity_destroy', { diff --git a/src/lib/plugins/moderation.js b/src/lib/plugins/moderation.js index 91a9ef2..f8117c6 100644 --- a/src/lib/plugins/moderation.js +++ b/src/lib/plugins/moderation.js @@ -65,12 +65,8 @@ module.exports.server=function(serv) module.exports.player=function(player,serv) { - player.kick = reason => - { - player._client.write('kick_disconnect', { - reason: reason ? JSON.stringify(reason) : '"You were kicked!"' - }); - }; + player.kick = (reason="You were kicked!") => + player._client.end(reason); player.ban = reason => { reason = reason || "You were banned!"; @@ -82,7 +78,7 @@ module.exports.player=function(player,serv) reason = reason || "You were IP banned!" player.kick(reason) serv.banIP(player._client.socket.remoteAddress) - } + }; player.pardon = () => serv.pardon(player._client.uuid); diff --git a/test/mineflayer.js b/test/mineflayer.js index 6249ea7..cff4b85 100644 --- a/test/mineflayer.js +++ b/test/mineflayer.js @@ -19,14 +19,45 @@ describe("Server with mineflayer connection", function() { async function onGround(bot) { await new Promise((cb) => { - var l=() => { - if(bot.entity.onGround) { - bot.removeListener("move",l); - cb(); - } - }; - bot.on("move",l); - }); + var l=() => { + if(bot.entity.onGround) { + bot.removeListener("move",l); + cb(); + } + }; + bot.on("move",l); + }); + } + + async function waitMessage(bot,message) { + let msg1=await once(bot,'message'); + assert.equal(msg1.text,message); + } + + async function waitMessages(bot,messages) { + var toReceive=messages.reduce((acc,message) => { + acc[message]=1; + return acc; + },{}); + var received={}; + return new Promise(cb => { + var listener=msg => { + var message=msg.text; + if(!toReceive[message]) throw new Error("Received "+message+" , expected to receive one of "+messages); + if(received[message]) throw new Error("Received "+message+" two times"); + received[message]=1; + if(Object.keys(received).length==messages.length) + { + bot.removeListener('message',listener); + cb(); + } + }; + bot.on('message',listener); + }); + } + + async function waitLoginMessage(bot) { + return Promise.all([waitMessages(bot,['bot joined the game.','bot2 joined the game.'])]); } beforeEach(async function () { @@ -50,12 +81,11 @@ describe("Server with mineflayer connection", function() { username: "bot2" }); - return Promise.all([once(bot,'login'),once(bot2,'login')]); + await Promise.all([once(bot,'login'),once(bot2,'login')]); }); - afterEach(() => { - serv._server.close(); - return once(serv._server,"close"); + afterEach(async () => { + await serv.quit(); }); @@ -94,7 +124,9 @@ describe("Server with mineflayer connection", function() { }); describe("commands",() => { + it("has an help command", async () => { + await waitLoginMessage(bot); bot.chat("/help"); await once(bot,"message"); }); @@ -162,12 +194,11 @@ describe("Server with mineflayer connection", function() { }); }); it("can use /deop",async () => { + await waitLoginMessage(bot); bot.chat('/deop bot'); - let msg1=await once(bot,'message'); - assert.equal(msg1.text,'bot is deopped'); + await waitMessage(bot,'bot is deopped'); bot.chat('/op bot'); - let msg2=await once(bot,'message'); - assert.equal(msg2.text,'You do not have permission to use this command'); + await waitMessage(bot,'You do not have permission to use this command'); serv.getPlayer("bot").op=true; }); it("can use /setblock",async() => {