fix player.kick (just use player._client.end), add serv.quit(reason), wait for login messages in mineflayer test

This commit is contained in:
Romain Beaumont 2015-12-11 15:33:48 +01:00
parent 72c91c50e0
commit f5884caf1f
5 changed files with 68 additions and 27 deletions

View file

@ -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",

View file

@ -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]) {

View file

@ -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', {

View file

@ -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);

View file

@ -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() => {