diff --git a/.gitignore b/.gitignore index 3c3629e..d26c746 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ node_modules +dist/ \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/app.js b/app.js index f7f3f75..c251796 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,6 @@ #!/usr/bin/env node -var mcServer=require("./index"); +var mcServer=require("./"); var settings = require('./config/settings'); var commands = require('./config/commands'); diff --git a/examples/basic.js b/examples/basic.js index 0d105e6..bd45d26 100644 --- a/examples/basic.js +++ b/examples/basic.js @@ -1,4 +1,4 @@ -var mcServer=require(".."); +var mcServer=require("../"); mcServer.createMCServer({ motd: "Basic flying-squid server", diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..6053692 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,32 @@ +var gulp = require('gulp'); + +var plumber = require('gulp-plumber'); +var babel = require('gulp-babel'); +var options = { + stage: 0, // Dat ES7 goodness + optional: ["runtime"] +}; + +var sourcemaps = require('gulp-sourcemaps'); + +gulp.task('compile', function() { + return gulp + .src('src/**/*.js') + .pipe(plumber({ + errorHandler: function(err) { + console.error(err.stack); + this.emit('end'); + } + })) + .pipe(sourcemaps.init()) + .pipe(babel(options)) + .pipe(plumber.stop()) + .pipe(sourcemaps.write('maps/')) + .pipe(gulp.dest('dist/')); +}); + +gulp.task('watch', function() { + return gulp.watch('src/**/*.js', ['compile']); +}); + +gulp.task('default', ['compile']); diff --git a/index.js b/index.js index c7bd2b0..08a522a 100644 --- a/index.js +++ b/index.js @@ -1,47 +1 @@ -var mc = require('minecraft-protocol'); -var EventEmitter = require('events').EventEmitter; -var util = require('util'); -var path = require('path'); -var requireIndex = require('requireindex'); -var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins')); -if (process.env.NODE_ENV === 'dev'){ - require('longjohn'); -} - -module.exports = { - createMCServer:createMCServer -}; - -function createMCServer(options) { - options = options || {}; - var mcServer = new MCServer(); - mcServer.connect(options); - return mcServer; -} - -function MCServer() { - EventEmitter.call(this); - this._server = null; -} -util.inherits(MCServer, EventEmitter); - -MCServer.prototype.connect = function(options) { - var self = this; - self._server = mc.createServer(options); - - for(var pluginName in serverPlugins) { - serverPlugins[pluginName](self, options); - } - - if(options.logging == true) { - self.createLog(); - } - - self._server.on('error', function(error) { - self.emit('error',error); - }); - - self._server.on('listening', function() { - self.emit('listening',self._server.socketServer.address().port); - }); -}; +module.exports = require('./dist/index.js'); \ No newline at end of file diff --git a/lib/serverPlugins/moderation.js b/lib/serverPlugins/moderation.js deleted file mode 100644 index 77814af..0000000 --- a/lib/serverPlugins/moderation.js +++ /dev/null @@ -1,75 +0,0 @@ -var moment=require("moment"); -var request=require("request"); -var nodeUuid=require('node-uuid'); - -module.exports = inject; - -function inject(serv) -{ - - function ban(uuid, reason) { - serv.bannedPlayers[uuid] = { - time: +moment(), - reason: reason || "You are banned!" - }; - } - - function uuidInParts(plainUUID) - { - return nodeUuid.unparse(nodeUuid.parse(plainUUID)); - } - - function getUUIDFromUsername(username, cb) { - request('https://api.mojang.com/users/profiles/minecraft/' + username, function(err, res, body) { - if(!body || err) - { - cb(new Error("username not found")); - return; - } - cb(null,uuidInParts(JSON.parse(body).id)); - }); - } - - function banUsername(username, reason, cb) { - serv.getUUIDFromUsername(username, function(err,uuid) { - if(err) - { - cb(err); - return; - } - serv.ban(uuid, reason); - cb(); - }); - } - - function pardonUsername(username, cb) { - serv.getUUIDFromUsername(username, function(err,uuid) { - if(err) - { - cb(err); - return; - } - var result=pardon(uuid); - if(!result) - { - cb(new Error("Player wasn't banned.")); - return; - } - cb(); - }); - } - - function pardon(uuid) { - if (serv.bannedPlayers[uuid]) { - delete serv.bannedPlayers[uuid]; - return true; - } - return false; - } - - serv.bannedPlayers = {}; - serv.ban = ban; - serv.banUsername = banUsername; - serv.pardonUsername = pardonUsername; - serv.getUUIDFromUsername = getUUIDFromUsername; -} \ No newline at end of file diff --git a/package.json b/package.json index f80925e..2326cd5 100644 --- a/package.json +++ b/package.json @@ -14,14 +14,15 @@ "flying-squid": "./app.js" }, "scripts": { - "test": "mocha --reporter spec", - "postinstall": "node_modules/.bin/babel -d node_modules/prismarine-world/dist/ node_modules/prismarine-world/src/ && node_modules/.bin/babel -d node_modules/prismarine-chunk/dist/ node_modules/prismarine-chunk/src/ " + "prepublish": "gulp", + "test": "mocha --reporter spec" }, "keywords": [], "licenses": { "type": "MIT" }, "dependencies": { + "babel-runtime": "^5.4.4", "buffers": "0.1.1", "chai": "~3.2.0", "minecraft-data": "0.7.0", @@ -31,10 +32,10 @@ "moment": "^2.10.6", "node-uuid": "^1.4.3", "prismarine-block": "0.1.0", - "prismarine-chunk": "git://github.com/rom1504/prismarine-chunk.git#use-prismarine-block", + "prismarine-chunk": "0.2.1", "prismarine-entity": "0.1.0", - "prismarine-world": "git://github.com/rom1504/prismarine-world.git#implementation", - "request": "^2.61.0", + "prismarine-world": "0.1.0", + "request-promise": "^0.4.3", "requireindex": "~1.0.0", "vec3": "0.1.3" }, @@ -48,6 +49,10 @@ "devDependencies": { "doctoc": "^0.15.0", "longjohn": "~0.2.8", - "babel": "5.8.23" + "babel": "5.8.23", + "gulp": "^3.8.11", + "gulp-babel": "^5.1.0", + "gulp-plumber": "^1.0.1", + "gulp-sourcemaps": "^1.3.0" } } diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..c7bd2b0 --- /dev/null +++ b/src/index.js @@ -0,0 +1,47 @@ +var mc = require('minecraft-protocol'); +var EventEmitter = require('events').EventEmitter; +var util = require('util'); +var path = require('path'); +var requireIndex = require('requireindex'); +var serverPlugins = requireIndex(path.join(__dirname, 'lib', 'serverPlugins')); +if (process.env.NODE_ENV === 'dev'){ + require('longjohn'); +} + +module.exports = { + createMCServer:createMCServer +}; + +function createMCServer(options) { + options = options || {}; + var mcServer = new MCServer(); + mcServer.connect(options); + return mcServer; +} + +function MCServer() { + EventEmitter.call(this); + this._server = null; +} +util.inherits(MCServer, EventEmitter); + +MCServer.prototype.connect = function(options) { + var self = this; + self._server = mc.createServer(options); + + for(var pluginName in serverPlugins) { + serverPlugins[pluginName](self, options); + } + + if(options.logging == true) { + self.createLog(); + } + + self._server.on('error', function(error) { + self.emit('error',error); + }); + + self._server.on('listening', function() { + self.emit('listening',self._server.socketServer.address().port); + }); +}; diff --git a/lib/player.js b/src/lib/player.js similarity index 100% rename from lib/player.js rename to src/lib/player.js diff --git a/lib/playerPlugins/animations.js b/src/lib/playerPlugins/animations.js similarity index 100% rename from lib/playerPlugins/animations.js rename to src/lib/playerPlugins/animations.js diff --git a/lib/playerPlugins/blocks.js b/src/lib/playerPlugins/blocks.js similarity index 89% rename from lib/playerPlugins/blocks.js rename to src/lib/playerPlugins/blocks.js index 1013bbf..bc763cc 100644 --- a/lib/playerPlugins/blocks.js +++ b/src/lib/playerPlugins/blocks.js @@ -7,7 +7,7 @@ function inject(serv,player) player.getOthers().forEach(function(player) { player.sendBlock(position, blockType); }); - serv.world.setBlockType(position,blockType); + return serv.world.setBlockType(position,blockType); } function sendBlock(position, blockType) { // Call from serv.setBlock unless you want "local" fake blocks diff --git a/lib/playerPlugins/chat.js b/src/lib/playerPlugins/chat.js similarity index 100% rename from lib/playerPlugins/chat.js rename to src/lib/playerPlugins/chat.js diff --git a/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js similarity index 84% rename from lib/playerPlugins/commands.js rename to src/lib/playerPlugins/commands.js index f5c879c..fbdfd68 100644 --- a/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -59,15 +59,12 @@ function inject(serv, player, options) { serv.emit("banned",player,username,reason); } else { - serv.banUsername(username, reason, function (err) { - if(err) { - player.chat(results[1] + " is not a valid player!"); - } - else { + serv.banUsername(username, reason) + .then(()=>{ serv.emit("banned",player,username,reason); player.chat(results[1] + " was banned"); - } - }); + }) + .catch(err => player.chat(results[1] + " is not a valid player!")); } } } @@ -77,14 +74,9 @@ function inject(serv, player, options) { player.chat("Usage: /pardon "); } else { - serv.pardonUsername(results[1], function (err) { - if(err) { - player.chat(results[1] + " is not banned"); - } - else { - player.chat(results[1] + " is unbanned"); - } - }); + serv.pardonUsername(results[1]) + .then(()=> player.chat(results[1] + " is unbanned")) + .catch(err => player.chat(results[1] + " is not banned")); } } else diff --git a/lib/playerPlugins/communication.js b/src/lib/playerPlugins/communication.js similarity index 100% rename from lib/playerPlugins/communication.js rename to src/lib/playerPlugins/communication.js diff --git a/lib/playerPlugins/digging.js b/src/lib/playerPlugins/digging.js similarity index 79% rename from lib/playerPlugins/digging.js rename to src/lib/playerPlugins/digging.js index ff8c63e..e16f91b 100644 --- a/lib/playerPlugins/digging.js +++ b/src/lib/playerPlugins/digging.js @@ -6,16 +6,19 @@ function inject(serv,player) { player._client.on("block_dig",function(packet){ var pos=new Vec3(packet.location); - currentlyDugBlock=serv.world.getBlock(pos); - if(currentlyDugBlock.type==0) return; - if(packet.status==0 && player.gameMode!=1) - startDigging(pos); - else if(packet.status==2) - completeDigging(pos); - else if(packet.status==1) - cancelDigging(pos); - else if(packet.status==0 && player.gameMode==1) - creativeDigging(pos); + serv.world.getBlock(pos) + .then(block => { + currentlyDugBlock=block; + if(currentlyDugBlock.type==0) return; + if(packet.status==0 && player.gameMode!=1) + startDigging(pos); + else if(packet.status==2) + completeDigging(pos); + else if(packet.status==1) + cancelDigging(pos); + else if(packet.status==0 && player.gameMode==1) + creativeDigging(pos); + }); }); function diggingTime(location) @@ -84,7 +87,7 @@ function inject(serv,player) function creativeDigging(location) { - player.changeBlock(location,0); + return player.changeBlock(location,0); } } \ No newline at end of file diff --git a/lib/playerPlugins/log.js b/src/lib/playerPlugins/log.js similarity index 100% rename from lib/playerPlugins/log.js rename to src/lib/playerPlugins/log.js diff --git a/lib/playerPlugins/login.js b/src/lib/playerPlugins/login.js similarity index 100% rename from lib/playerPlugins/login.js rename to src/lib/playerPlugins/login.js diff --git a/lib/playerPlugins/logout.js b/src/lib/playerPlugins/logout.js similarity index 100% rename from lib/playerPlugins/logout.js rename to src/lib/playerPlugins/logout.js diff --git a/lib/playerPlugins/moderation.js b/src/lib/playerPlugins/moderation.js similarity index 100% rename from lib/playerPlugins/moderation.js rename to src/lib/playerPlugins/moderation.js diff --git a/lib/playerPlugins/placeBlock.js b/src/lib/playerPlugins/placeBlock.js similarity index 100% rename from lib/playerPlugins/placeBlock.js rename to src/lib/playerPlugins/placeBlock.js diff --git a/lib/playerPlugins/pvp.js b/src/lib/playerPlugins/pvp.js similarity index 100% rename from lib/playerPlugins/pvp.js rename to src/lib/playerPlugins/pvp.js diff --git a/lib/playerPlugins/respawn.js b/src/lib/playerPlugins/respawn.js similarity index 100% rename from lib/playerPlugins/respawn.js rename to src/lib/playerPlugins/respawn.js diff --git a/lib/playerPlugins/settings.js b/src/lib/playerPlugins/settings.js similarity index 100% rename from lib/playerPlugins/settings.js rename to src/lib/playerPlugins/settings.js diff --git a/lib/playerPlugins/updatePositions.js b/src/lib/playerPlugins/updatePositions.js similarity index 100% rename from lib/playerPlugins/updatePositions.js rename to src/lib/playerPlugins/updatePositions.js diff --git a/lib/serverPlugins/blocks.js b/src/lib/serverPlugins/blocks.js similarity index 80% rename from lib/serverPlugins/blocks.js rename to src/lib/serverPlugins/blocks.js index 16133ae..e7ea9e3 100644 --- a/lib/serverPlugins/blocks.js +++ b/src/lib/serverPlugins/blocks.js @@ -7,7 +7,7 @@ function inject(serv) serv.players.forEach(function(player){ player.sendBlock(position, blockType); }); - serv.world.setBlockType(position,blockType); + return serv.world.setBlockType(position,blockType); } serv.setBlock = setBlock; diff --git a/lib/serverPlugins/chat.js b/src/lib/serverPlugins/chat.js similarity index 100% rename from lib/serverPlugins/chat.js rename to src/lib/serverPlugins/chat.js diff --git a/lib/serverPlugins/log.js b/src/lib/serverPlugins/log.js similarity index 100% rename from lib/serverPlugins/log.js rename to src/lib/serverPlugins/log.js diff --git a/lib/serverPlugins/login.js b/src/lib/serverPlugins/login.js similarity index 100% rename from lib/serverPlugins/login.js rename to src/lib/serverPlugins/login.js diff --git a/src/lib/serverPlugins/moderation.js b/src/lib/serverPlugins/moderation.js new file mode 100644 index 0000000..57add3c --- /dev/null +++ b/src/lib/serverPlugins/moderation.js @@ -0,0 +1,54 @@ +var moment=require("moment"); +var rp=require("request-promise"); +var nodeUuid=require('node-uuid'); + +module.exports = inject; + +function inject(serv) +{ + + function ban(uuid, reason) { + serv.bannedPlayers[uuid] = { + time: +moment(), + reason: reason || "You are banned!" + }; + } + + function uuidInParts(plainUUID) + { + return nodeUuid.unparse(nodeUuid.parse(plainUUID)); + } + + function getUUIDFromUsername(username) { + return rp('https://api.mojang.com/users/profiles/minecraft/' + username) + .then((body) => { + if(!body) throw new Error("username not found"); + return uuidInParts(JSON.parse(body).id) + }) + .catch(err => {throw new Error("username not found");}); + } + + function banUsername(username, reason, cb) { + return serv.getUUIDFromUsername(username) + .then(uuid => serv.ban(uuid, reason)); + } + + function pardonUsername(username, cb) { + return serv.getUUIDFromUsername(username) + .then(pardon); + } + + function pardon(uuid) { + if (serv.bannedPlayers[uuid]) { + delete serv.bannedPlayers[uuid]; + return true; + } + return false; + } + + serv.bannedPlayers = {}; + serv.ban = ban; + serv.banUsername = banUsername; + serv.pardonUsername = pardonUsername; + serv.getUUIDFromUsername = getUUIDFromUsername; +} \ No newline at end of file diff --git a/lib/serverPlugins/players.js b/src/lib/serverPlugins/players.js similarity index 100% rename from lib/serverPlugins/players.js rename to src/lib/serverPlugins/players.js diff --git a/lib/serverPlugins/settings.js b/src/lib/serverPlugins/settings.js similarity index 100% rename from lib/serverPlugins/settings.js rename to src/lib/serverPlugins/settings.js diff --git a/lib/serverPlugins/world.js b/src/lib/serverPlugins/world.js similarity index 100% rename from lib/serverPlugins/world.js rename to src/lib/serverPlugins/world.js diff --git a/lib/version.js b/src/lib/version.js similarity index 100% rename from lib/version.js rename to src/lib/version.js