From 0f5ce496109ee5cacaa40be4b7b955788aa1bba6 Mon Sep 17 00:00:00 2001 From: JWo1F Date: Sun, 11 Oct 2015 06:11:03 +0300 Subject: [PATCH 1/5] commands --- src/lib/playerPlugins/commands.js | 422 +++++++++++++++++++++++------- 1 file changed, 324 insertions(+), 98 deletions(-) diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index 707fba5..763be5d 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -1,104 +1,330 @@ var Vec3 = require('vec3'); - module.exports = inject; -function inject(serv, player, options) { - function handleCommand(command) { - var results; - if (options.commands[command]) - player.chat("" + options.commands[command]); - else if (results = command.match(/^gamemode ([0-3])$/)) { - var gameMode = parseInt(results[1]); - player.setGameMode(gameMode); - } - else if (results = command.match(/^setblock/)) { // Like old version which uses ids - results = command.match(/^setblock (~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3})/); - if (!results) { - player.chat("Usage: /setblock "); - } - else { - results = results.map(function (num, i) { // parseInt paramaters - if (num.indexOf('~') == 0) { - return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); - } - else - return parseInt(num); // return parseInt>>5 if position, not id - }); - serv.setBlock(new Vec3(results[1], results[2], results[3]), results[4]); - } - } - else if (results = command.match(/^kick/)) { - results = command.match(/^kick ([a-zA-Z0-9_]+)(?: (.*))?/); - if (!results) { - player.chat("Usage: /kick [reason]"); - } - else { - var username = results[1]; - var reason = results[2]; +var hash = {}; - var kickPlayer = serv.getPlayer(username); - if (!kickPlayer) - player.chat(results[1] + " is not on this server!"); - else { - kickPlayer.kick(reason); - kickPlayer.emit("kicked",player,reason); - } - } - } - else if (results = command.match(/^ban/)) { - results = command.match(/^ban ([a-zA-Z0-9_]+)(?: (.*))?/); - if (!results) { - player.chat("Usage: /ban [reason]"); - } - else { - username = results[1]; - reason = results[2]; - var banPlayer = serv.getPlayer(username); - if (banPlayer) { - banPlayer.ban(reason); - serv.emit("banned",player,username,reason); - } - 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!")); - } - } - } - else if (results = command.match(/^pardon/)) { - results = command.match(/^pardon ([a-zA-Z0-9_]+)/); - if (!results) { - player.chat("Usage: /pardon "); - } - else { - serv.pardonUsername(results[1]) - .then(()=> player.chat(results[1] + " is unbanned")) - .catch(err => player.chat(results[1] + " is not banned")); - } - } - else if(results = command.match(/^time (add|query|set)(?: ([0-9]+))?/)) { - var action=results[1]; - var value=results[2]!==undefined ? parseInt(results[2]) : null; - if(action=="query") - player.chat("It is "+serv.time); - else if(action=="set") { - player.chat("Time was changed from "+serv.time+" to "+value); - serv.setTime(value); - } - else if(action=="add") { - player.chat("Time was changed from "+serv.time+" to "+(value + serv.time)); - serv.setTime(value + serv.time); - } - } - else if(results = command.match(/^modpe (.+)$/)) { - player.emit("modpe",results[1]); - } - else - player.chat("Invalid command."); +class Command { + constructor(params, parent) { + this.params = params; + this.parent = parent; + this.child = []; + + this.updateHistory(); } - player.handleCommand = handleCommand; -} \ No newline at end of file + static find(command) { + var res; + for(var key in hash) { + var space = hash[key].space(true); + if(space) space += '?'; + + var ended = space + '(.*)'; + + var finded = command.match(new RegExp('^' + key + ended)); + if(finded) { + res = [hash[key], finded]; + } + } + + return res; + } + + static use(command, serv, player, options) { + var res = this.find(command); + + if(res) { + var parse = res[0].params.parse; + if(parse) { + if(typeof parse == 'function') { + res[1] = parse(res[1][1]); + if(res[1] === false) { + player.chat(res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'); + return; + } + } else { + res[1] = res[1][1].match(parse); + } + } else { + res[1].shift(); + } + + res = res[0].params.action(res[1], serv, player, options); + if(res) player.chat('' + res); + } else { + player.chat('Command not found'); + } + } + + updateHistory() { + var all = '(.+?)'; + + var list = [this.params.base]; + if(this.params.aliases && this.params.aliases.length) { + this.params.aliases.forEach(al => list.unshift(al)); + } + + list.forEach((command) => { + var parentBase = this.parent ? (this.parent.path || '') : ''; + this.path = parentBase + this.space() + (command || all); + if(this.path == all && !this.parent) this.path = ''; + + if(this.path) hash[this.path] = this; + }); + } + + add(params) { + var command = new Command(params, this); + this.child.push(command); + + return command; + } + + space(end) { + var first = !(this.parent && this.parent.parent); + return this.params.merged || (!end && first) ? '' : ' '; + } +} + +var base = new Command({ basic: true }); + +base.add({ + base: 'help', + info: 'for show all commands', + usage: '/help [command]', + action(params, serv, player, options) { + var c = params[0]; + + if(c) { + var res = Command.find(params[0])[0]; + + var help = res.params.help && res.params.help(params); + return help ? '' + help : 'Information not found'; + } else { + var used = []; + for(var key in hash) { + if(used.indexOf(hash[key]) > -1) continue; + used.push(hash[key]); + + if(hash[key].params.info) { + var str = '/' + hash[key].path + ' ' + hash[key].params.info; + if(hash[key].params.aliases && hash[key].params.aliases.length) { + str += ' (aliases: ' + hash[key].params.aliases.join(', ') + ')'; + } + + player.chat(str); + } + } + } + } +}); + +base.add({ + base: 'gamemode', + aliases: ['gm'], + info: 'for change game mode', + usage: '/gamemode <0-3>', + parse() { + var mode = parseInt(params[0]); + if(mode < 0 || mode > 3) return false; + else return mode; + }, + action(mode, serv, player) { + player.setGameMode(mode); + } +}); + +base.add({ + base: 'setblock', + info: 'for put block', + usage: '/setblock ', + parse(str) { + var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3})/); + + if(!results) return false; + else return results; + }, + action(params, serv, player) { + var res = params.map(function (num, i) { // parseInt paramaters + if (num.indexOf('~') == 0) { + return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); + } else { + return parseInt(num); // return parseInt>>5 if position, not id + } + }); + + serv.setBlock(new Vec3(res[1], res[2], res[3]), res[4]); + } +}); + +base.add({ + base: 'kick', + info: 'for kick a player', + usage: '/kick [reason]', + parse(str) { + var res = false; + + if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { + str = str.split(' '); + var nick = str.shift(); + var reason = str.join(' '); + + res = [nick, reason]; + } + + return res; + }, + action(params, serv, player) { + var username = params[0]; + var reason = params[1]; + + var kickPlayer = serv.getPlayer(username); + if (!kickPlayer) { + player.chat(username + " is not on this server!"); + } else { + kickPlayer.kick(reason); + kickPlayer.emit("kicked", player, reason); + } + } +}); + +base.add({ + base: 'ban', + info: 'for ban a player', + usage: '/ban [reason]', + parse(str) { + var res = false; + + if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { + str = str.split(' '); + var nick = str.shift(); + var reason = str.join(' '); + + res = [nick, reason]; + } + + return res; + }, + action(params, serv, player) { + var username = params[0]; + var reason = params[1]; + + var banPlayer = serv.getPlayer(username); + + if (!banPlayer) { + serv.banUsername(username, reason) + .then(() => { + serv.emit('banned', player, username, reason); + player.chat(username + ' was banned'); + }) + .catch(err => player.chat(username + " is not a valid player!")); + } else { + banPlayer.ban(reason); + serv.emit("banned", player, username, reason); + } + } +}); + +base.add({ + base: 'pardon', + info: 'for pardon a player', + usage: '/pardon ', + parse(str) { + var res = false; + + if(str.match(/([a-zA-Z0-9_]+)/)) { + res = str; + } + + return res; + }, + action(nick, serv, player) { + serv.pardonUsername(nick) + .then(()=> player.chat(nick + " is unbanned")) + .catch(err => player.chat(nick + " is not banned")); + } +}); + +base.add({ + base: 'time', + info: 'for change a time', + usage: '/time ', + parse(str) { + var res = false; + + var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); + + if(data[2] == 'day') data[2] = 1000; + if(data[2] == 'night') data[2] = 13000; + + return [data[1], data[2]]; + }, + action(params, serv, player) { + var action = params[0]; + var value = params[1] !== undefined ? parseInt(params[1]) : null; + + if(action == "query") { + player.chat("It is "+serv.time); + } else { + var newTime; + + if(action == "set") { + newTime = value; + } else if(action == "add") { + newTime = value + serv.time; + } + + player.chat("Time was changed from " + serv.time + " to " + newTime); + serv.setTime(newTime); + } + } +}); + +base.add({ + base: 'day', + info: 'for change a time to day', + usage: '/day', + action(params, serv, player) { + player.handleCommand('time set day'); + } +}); + +base.add({ + base: 'night', + info: 'for change a time to night', + usage: '/night', + action(params, serv, player) { + player.handleCommand('time set night'); + } +}); + +base.add({ + base: 'modpe', + info: 'for modpe commands', + usage: '/modpe ', + parse(str) { return str ? str : false }, + action(str, serv, player) { + player.emit("modpe", str); + } +}); + +base.add({ + base: 'version', + info: 'for get version of the server', + action() { + return 'This server is running flying-squid version 0.1.0'; + } +}); + +base.add({ + base: 'bug', + info: 'for bug report', + action() { + return 'Report bugs / issues here: https://github.com/mhsjlw/flying-squid/issues'; + } +}); + +function inject(serv, player, options) { + player.handleCommand = function(str) { + return Command.use(str, serv, player, options); + }; +} From 75f974ecc87976c808073d4eaa7b08287ef28186 Mon Sep 17 00:00:00 2001 From: JWo1F Date: Sun, 11 Oct 2015 06:42:46 +0300 Subject: [PATCH 2/5] ping! --- src/lib/playerPlugins/commands.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index 763be5d..6dc052a 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -288,6 +288,20 @@ base.add({ } }); +base.add({ + base: 'ping', + info: 'for pong!', + usage: '/ping [number]', + action(params, serv, player) { + var num = params[0] * 1 + 1; + + var str = 'pong'; + if(!isNaN(num)) str += ' [' + num + ']'; + + player.chat(str + '!'); + } +}); + base.add({ base: 'night', info: 'for change a time to night', From 19b5c9a9cc021ad68e4c061568028ebf23369260 Mon Sep 17 00:00:00 2001 From: JWo1F Date: Sun, 11 Oct 2015 07:11:36 +0300 Subject: [PATCH 3/5] move code to inject section --- src/lib/playerPlugins/commands.js | 590 +++++++++++++++--------------- 1 file changed, 295 insertions(+), 295 deletions(-) diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index 6dc052a..551d984 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -1,344 +1,344 @@ var Vec3 = require('vec3'); module.exports = inject; -var hash = {}; +function inject(serv, player, options) { + var hash = {}; -class Command { - constructor(params, parent) { - this.params = params; - this.parent = parent; - this.child = []; + class Command { + constructor(params, parent) { + this.params = params; + this.parent = parent; + this.child = []; - this.updateHistory(); - } - - static find(command) { - var res; - for(var key in hash) { - var space = hash[key].space(true); - if(space) space += '?'; - - var ended = space + '(.*)'; - - var finded = command.match(new RegExp('^' + key + ended)); - if(finded) { - res = [hash[key], finded]; - } + this.updateHistory(); } - return res; - } + static find(command) { + var res; + for(var key in hash) { + var space = hash[key].space(true); + if(space) space += '?'; - static use(command, serv, player, options) { - var res = this.find(command); + var ended = space + '(.*)'; - if(res) { - var parse = res[0].params.parse; - if(parse) { - if(typeof parse == 'function') { - res[1] = parse(res[1][1]); - if(res[1] === false) { - player.chat(res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'); - return; + var finded = command.match(new RegExp('^' + key + ended)); + if(finded) { + res = [hash[key], finded]; + } + } + + return res; + } + + static use(command) { + var res = this.find(command); + + if(res) { + var parse = res[0].params.parse; + if(parse) { + if(typeof parse == 'function') { + res[1] = parse(res[1][1]); + if(res[1] === false) { + player.chat(res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'); + return; + } + } else { + res[1] = res[1][1].match(parse); } } else { - res[1] = res[1][1].match(parse); + res[1].shift(); } + + res = res[0].params.action(res[1]); + if(res) player.chat('' + res); } else { - res[1].shift(); + player.chat('Command not found'); + } + } + + updateHistory() { + var all = '(.+?)'; + + var list = [this.params.base]; + if(this.params.aliases && this.params.aliases.length) { + this.params.aliases.forEach(al => list.unshift(al)); } - res = res[0].params.action(res[1], serv, player, options); - if(res) player.chat('' + res); - } else { - player.chat('Command not found'); + list.forEach((command) => { + var parentBase = this.parent ? (this.parent.path || '') : ''; + this.path = parentBase + this.space() + (command || all); + if(this.path == all && !this.parent) this.path = ''; + + if(this.path) hash[this.path] = this; + }); + } + + add(params) { + var command = new Command(params, this); + this.child.push(command); + + return command; + } + + space(end) { + var first = !(this.parent && this.parent.parent); + return this.params.merged || (!end && first) ? '' : ' '; } } - updateHistory() { - var all = '(.+?)'; + var base = new Command({ basic: true }); - var list = [this.params.base]; - if(this.params.aliases && this.params.aliases.length) { - this.params.aliases.forEach(al => list.unshift(al)); - } + base.add({ + base: 'help', + info: 'for show all commands', + usage: '/help [command]', + action(params) { + var c = params[0]; - list.forEach((command) => { - var parentBase = this.parent ? (this.parent.path || '') : ''; - this.path = parentBase + this.space() + (command || all); - if(this.path == all && !this.parent) this.path = ''; + if(c) { + var res = Command.find(params[0])[0]; - if(this.path) hash[this.path] = this; - }); - } + var help = res.params.help && res.params.help(params); + return help ? '' + help : 'Information not found'; + } else { + var used = []; + for(var key in hash) { + if(used.indexOf(hash[key]) > -1) continue; + used.push(hash[key]); - add(params) { - var command = new Command(params, this); - this.child.push(command); + if(hash[key].params.info) { + var str = '/' + hash[key].path + ' ' + hash[key].params.info; + if(hash[key].params.aliases && hash[key].params.aliases.length) { + str += ' (aliases: ' + hash[key].params.aliases.join(', ') + ')'; + } - return command; - } - - space(end) { - var first = !(this.parent && this.parent.parent); - return this.params.merged || (!end && first) ? '' : ' '; - } -} - -var base = new Command({ basic: true }); - -base.add({ - base: 'help', - info: 'for show all commands', - usage: '/help [command]', - action(params, serv, player, options) { - var c = params[0]; - - if(c) { - var res = Command.find(params[0])[0]; - - var help = res.params.help && res.params.help(params); - return help ? '' + help : 'Information not found'; - } else { - var used = []; - for(var key in hash) { - if(used.indexOf(hash[key]) > -1) continue; - used.push(hash[key]); - - if(hash[key].params.info) { - var str = '/' + hash[key].path + ' ' + hash[key].params.info; - if(hash[key].params.aliases && hash[key].params.aliases.length) { - str += ' (aliases: ' + hash[key].params.aliases.join(', ') + ')'; + player.chat(str); } - - player.chat(str); } } } - } -}); + }); -base.add({ - base: 'gamemode', - aliases: ['gm'], - info: 'for change game mode', - usage: '/gamemode <0-3>', - parse() { - var mode = parseInt(params[0]); - if(mode < 0 || mode > 3) return false; - else return mode; - }, - action(mode, serv, player) { - player.setGameMode(mode); - } -}); + base.add({ + base: 'gamemode', + aliases: ['gm'], + info: 'for change game mode', + usage: '/gamemode <0-3>', + parse() { + var mode = parseInt(params[0]); + if(mode < 0 || mode > 3) return false; + else return mode; + }, + action(mode) { + player.setGameMode(mode); + } + }); -base.add({ - base: 'setblock', - info: 'for put block', - usage: '/setblock ', - parse(str) { - var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3})/); + base.add({ + base: 'setblock', + info: 'for put block', + usage: '/setblock ', + parse(str) { + var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3})/); - if(!results) return false; - else return results; - }, - action(params, serv, player) { - var res = params.map(function (num, i) { // parseInt paramaters - if (num.indexOf('~') == 0) { - return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); + if(!results) return false; + else return results; + }, + action(params) { + var res = params.map(function (num, i) { // parseInt paramaters + if (num.indexOf('~') == 0) { + return (player.entity.position[['', 'x', 'y', 'z'][i]] >> 5) + parseInt(num.slice(1) || 0); + } else { + return parseInt(num); // return parseInt>>5 if position, not id + } + }); + + serv.setBlock(new Vec3(res[1], res[2], res[3]), res[4]); + } + }); + + base.add({ + base: 'kick', + info: 'for kick a player', + usage: '/kick [reason]', + parse(str) { + var res = false; + + if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { + str = str.split(' '); + var nick = str.shift(); + var reason = str.join(' '); + + res = [nick, reason]; + } + + return res; + }, + action(params) { + var username = params[0]; + var reason = params[1]; + + var kickPlayer = serv.getPlayer(username); + if (!kickPlayer) { + player.chat(username + " is not on this server!"); } else { - return parseInt(num); // return parseInt>>5 if position, not id + kickPlayer.kick(reason); + kickPlayer.emit("kicked", player, reason); } - }); - - serv.setBlock(new Vec3(res[1], res[2], res[3]), res[4]); - } -}); - -base.add({ - base: 'kick', - info: 'for kick a player', - usage: '/kick [reason]', - parse(str) { - var res = false; - - if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { - str = str.split(' '); - var nick = str.shift(); - var reason = str.join(' '); - - res = [nick, reason]; } + }); - return res; - }, - action(params, serv, player) { - var username = params[0]; - var reason = params[1]; + base.add({ + base: 'ban', + info: 'for ban a player', + usage: '/ban [reason]', + parse(str) { + var res = false; - var kickPlayer = serv.getPlayer(username); - if (!kickPlayer) { - player.chat(username + " is not on this server!"); - } else { - kickPlayer.kick(reason); - kickPlayer.emit("kicked", player, reason); - } - } -}); + if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { + str = str.split(' '); + var nick = str.shift(); + var reason = str.join(' '); -base.add({ - base: 'ban', - info: 'for ban a player', - usage: '/ban [reason]', - parse(str) { - var res = false; - - if(str.match(/([a-zA-Z0-9_]+)(?: (.*))/)) { - str = str.split(' '); - var nick = str.shift(); - var reason = str.join(' '); - - res = [nick, reason]; - } - - return res; - }, - action(params, serv, player) { - var username = params[0]; - var reason = params[1]; - - var banPlayer = serv.getPlayer(username); - - if (!banPlayer) { - serv.banUsername(username, reason) - .then(() => { - serv.emit('banned', player, username, reason); - player.chat(username + ' was banned'); - }) - .catch(err => player.chat(username + " is not a valid player!")); - } else { - banPlayer.ban(reason); - serv.emit("banned", player, username, reason); - } - } -}); - -base.add({ - base: 'pardon', - info: 'for pardon a player', - usage: '/pardon ', - parse(str) { - var res = false; - - if(str.match(/([a-zA-Z0-9_]+)/)) { - res = str; - } - - return res; - }, - action(nick, serv, player) { - serv.pardonUsername(nick) - .then(()=> player.chat(nick + " is unbanned")) - .catch(err => player.chat(nick + " is not banned")); - } -}); - -base.add({ - base: 'time', - info: 'for change a time', - usage: '/time ', - parse(str) { - var res = false; - - var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); - - if(data[2] == 'day') data[2] = 1000; - if(data[2] == 'night') data[2] = 13000; - - return [data[1], data[2]]; - }, - action(params, serv, player) { - var action = params[0]; - var value = params[1] !== undefined ? parseInt(params[1]) : null; - - if(action == "query") { - player.chat("It is "+serv.time); - } else { - var newTime; - - if(action == "set") { - newTime = value; - } else if(action == "add") { - newTime = value + serv.time; + res = [nick, reason]; } - player.chat("Time was changed from " + serv.time + " to " + newTime); - serv.setTime(newTime); + return res; + }, + action(params) { + var username = params[0]; + var reason = params[1]; + + var banPlayer = serv.getPlayer(username); + + if (!banPlayer) { + serv.banUsername(username, reason) + .then(() => { + serv.emit('banned', player, username, reason); + player.chat(username + ' was banned'); + }) + .catch(err => player.chat(username + " is not a valid player!")); + } else { + banPlayer.ban(reason); + serv.emit("banned", player, username, reason); + } } - } -}); + }); -base.add({ - base: 'day', - info: 'for change a time to day', - usage: '/day', - action(params, serv, player) { - player.handleCommand('time set day'); - } -}); + base.add({ + base: 'pardon', + info: 'for pardon a player', + usage: '/pardon ', + parse(str) { + var res = false; -base.add({ - base: 'ping', - info: 'for pong!', - usage: '/ping [number]', - action(params, serv, player) { - var num = params[0] * 1 + 1; + if(str.match(/([a-zA-Z0-9_]+)/)) { + res = str; + } - var str = 'pong'; - if(!isNaN(num)) str += ' [' + num + ']'; + return res; + }, + action(nick) { + serv.pardonUsername(nick) + .then(()=> player.chat(nick + " is unbanned")) + .catch(err => player.chat(nick + " is not banned")); + } + }); - player.chat(str + '!'); - } -}); + base.add({ + base: 'time', + info: 'for change a time', + usage: '/time ', + parse(str) { + var res = false; -base.add({ - base: 'night', - info: 'for change a time to night', - usage: '/night', - action(params, serv, player) { - player.handleCommand('time set night'); - } -}); + var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); -base.add({ - base: 'modpe', - info: 'for modpe commands', - usage: '/modpe ', - parse(str) { return str ? str : false }, - action(str, serv, player) { - player.emit("modpe", str); - } -}); + if(data[2] == 'day') data[2] = 1000; + if(data[2] == 'night') data[2] = 13000; -base.add({ - base: 'version', - info: 'for get version of the server', - action() { - return 'This server is running flying-squid version 0.1.0'; - } -}); + return [data[1], data[2]]; + }, + action(params) { + var action = params[0]; + var value = params[1] !== undefined ? parseInt(params[1]) : null; -base.add({ - base: 'bug', - info: 'for bug report', - action() { - return 'Report bugs / issues here: https://github.com/mhsjlw/flying-squid/issues'; - } -}); + if(action == "query") { + player.chat("It is "+serv.time); + } else { + var newTime; -function inject(serv, player, options) { - player.handleCommand = function(str) { - return Command.use(str, serv, player, options); - }; + if(action == "set") { + newTime = value; + } else if(action == "add") { + newTime = value + serv.time; + } + + player.chat("Time was changed from " + serv.time + " to " + newTime); + serv.setTime(newTime); + } + } + }); + + base.add({ + base: 'day', + info: 'for change a time to day', + usage: '/day', + action(params) { + player.handleCommand('time set day'); + } + }); + + base.add({ + base: 'ping', + info: 'for pong!', + usage: '/ping [number]', + action(params) { + var num = params[0] * 1 + 1; + + var str = 'pong'; + if(!isNaN(num)) str += ' [' + num + ']'; + + player.chat(str + '!'); + } + }); + + base.add({ + base: 'night', + info: 'for change a time to night', + usage: '/night', + action(params) { + player.handleCommand('time set night'); + } + }); + + base.add({ + base: 'modpe', + info: 'for modpe commands', + usage: '/modpe ', + parse(str) { return str ? str : false }, + action(str) { + player.emit("modpe", str); + } + }); + + base.add({ + base: 'version', + info: 'for get version of the server', + action() { + return 'This server is running flying-squid version 0.1.0'; + } + }); + + base.add({ + base: 'bug', + info: 'for bug report', + action() { + return 'Report bugs / issues here: https://github.com/mhsjlw/flying-squid/issues'; + } + }); + + serv.commands = base; + + player.handleCommand = Command.use.bind(Command); } From b51519e1389de3d26d80ae796e68efc6ac5d2270 Mon Sep 17 00:00:00 2001 From: JWo1F Date: Sun, 11 Oct 2015 07:32:49 +0300 Subject: [PATCH 4/5] fixes --- src/lib/playerPlugins/commands.js | 142 +++++++++++++++--------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index 551d984..887c0b7 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -1,92 +1,88 @@ var Vec3 = require('vec3'); module.exports = inject; -function inject(serv, player, options) { - var hash = {}; +class Command { + constructor(params, parent, hash) { + this.params = params; + this.parent = parent; + this.hash = parent ? parent.hash : {}; - class Command { - constructor(params, parent) { - this.params = params; - this.parent = parent; - this.child = []; + this.updateHistory(); + } - this.updateHistory(); - } + find(command) { + var res; + for(var key in this.hash) { + var space = this.hash[key].space(true); + if(space) space += '?'; - static find(command) { - var res; - for(var key in hash) { - var space = hash[key].space(true); - if(space) space += '?'; + var ended = space + '(.*)'; - var ended = space + '(.*)'; - - var finded = command.match(new RegExp('^' + key + ended)); - if(finded) { - res = [hash[key], finded]; - } + var finded = command.match(new RegExp('^' + key + ended)); + if(finded) { + res = [this.hash[key], finded]; } - - return res; } - static use(command) { - var res = this.find(command); + return res; + } - if(res) { - var parse = res[0].params.parse; - if(parse) { - if(typeof parse == 'function') { - res[1] = parse(res[1][1]); - if(res[1] === false) { - player.chat(res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'); - return; - } - } else { - res[1] = res[1][1].match(parse); + use(command) { + var res = this.find(command); + + if(res) { + var parse = res[0].params.parse; + if(parse) { + if(typeof parse == 'function') { + res[1] = parse(res[1][1]); + if(res[1] === false) { + return res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'; } } else { - res[1].shift(); + res[1] = res[1][1].match(parse); } - - res = res[0].params.action(res[1]); - if(res) player.chat('' + res); } else { - player.chat('Command not found'); - } - } - - updateHistory() { - var all = '(.+?)'; - - var list = [this.params.base]; - if(this.params.aliases && this.params.aliases.length) { - this.params.aliases.forEach(al => list.unshift(al)); + res[1].shift(); } - list.forEach((command) => { - var parentBase = this.parent ? (this.parent.path || '') : ''; - this.path = parentBase + this.space() + (command || all); - if(this.path == all && !this.parent) this.path = ''; - - if(this.path) hash[this.path] = this; - }); - } - - add(params) { - var command = new Command(params, this); - this.child.push(command); - - return command; - } - - space(end) { - var first = !(this.parent && this.parent.parent); - return this.params.merged || (!end && first) ? '' : ' '; + res = res[0].params.action(res[1]); + if(res) return '' + res; + } else { + return 'Command not found'; } } - var base = new Command({ basic: true }); + updateHistory() { + var all = '(.+?)'; + + var list = [this.params.base]; + if(this.params.aliases && this.params.aliases.length) { + this.params.aliases.forEach(al => list.unshift(al)); + } + + list.forEach((command) => { + var parentBase = this.parent ? (this.parent.path || '') : ''; + this.path = parentBase + this.space() + (command || all); + if(this.path == all && !this.parent) this.path = ''; + + if(this.path) this.hash[this.path] = this; + }); + } + + add(params) { + var command = new Command(params, this); + + return command; + } + + space(end) { + var first = !(this.parent && this.parent.parent); + return this.params.merged || (!end && first) ? '' : ' '; + } +} + +function inject(serv, player, options) { + var base = new Command({}); base.add({ base: 'help', @@ -94,9 +90,10 @@ function inject(serv, player, options) { usage: '/help [command]', action(params) { var c = params[0]; + var hash = base.hash; if(c) { - var res = Command.find(params[0])[0]; + var res = base.find(params[0])[0]; var help = res.params.help && res.params.help(params); return help ? '' + help : 'Information not found'; @@ -340,5 +337,8 @@ function inject(serv, player, options) { serv.commands = base; - player.handleCommand = Command.use.bind(Command); + player.handleCommand = function(str) { + var res = base.use(str); + if(res) player.chat('' + res); + }; } From c89c9e722e45709788d49020f4a295e762a5d73d Mon Sep 17 00:00:00 2001 From: Romain Beaumont Date: Tue, 13 Oct 2015 00:17:38 +0200 Subject: [PATCH 5/5] move Command class to its own file, fix bugs in commands and improve info --- app.js | 3 - config/commands.json | 5 -- src/lib/command.js | 81 +++++++++++++++++++ src/lib/playerPlugins/commands.js | 126 +++++++----------------------- 4 files changed, 108 insertions(+), 107 deletions(-) delete mode 100644 config/commands.json create mode 100644 src/lib/command.js diff --git a/app.js b/app.js index a1be411..157a004 100644 --- a/app.js +++ b/app.js @@ -11,15 +11,12 @@ catch(err) { settings = require('./config/default-settings'); } -var commands = require('./config/commands'); - var options = { 'motd': settings.motd, 'max-players': settings.maxPlayers, 'port': settings.port, 'online-mode': settings.onlineMode, gameMode:settings.gameMode, - commands: commands, logging:settings.logging, kickTimeout:10*60*1000, generation:settings.generation, diff --git a/config/commands.json b/config/commands.json deleted file mode 100644 index 54dc4c6..0000000 --- a/config/commands.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "help": "Available commands: /version and /bug", - "version": "This server is running flying-squid version 0.1.0", - "bug": "Report bugs / issues here: https://github.com/mhsjlw/flying-squid/issues" -} diff --git a/src/lib/command.js b/src/lib/command.js new file mode 100644 index 0000000..6fb8789 --- /dev/null +++ b/src/lib/command.js @@ -0,0 +1,81 @@ +class Command { + constructor(params, parent, hash) { + this.params = params; + this.parent = parent; + this.hash = parent ? parent.hash : {}; + + this.updateHistory(); + } + + find(command) { + var res; + for(var key in this.hash) { + var space = this.hash[key].space(true); + if(space) space += '?'; + + var ended = space + '(.*)'; + + var finded = command.match(new RegExp('^' + key + ended)); + if(finded) { + res = [this.hash[key], finded]; + } + } + + return res; + } + + use(command) { + var res = this.find(command); + + if(res) { + var parse = res[0].params.parse; + if(parse) { + if(typeof parse == 'function') { + res[1] = parse(res[1][1]); + if(res[1] === false) { + return res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'; + } + } else { + res[1] = res[1][1].match(parse); + } + } else { + res[1].shift(); + } + + res = res[0].params.action(res[1]); + if(res) return '' + res; + } else { + return 'Command not found'; + } + } + + updateHistory() { + var all = '(.+?)'; + + var list = [this.params.base]; + if(this.params.aliases && this.params.aliases.length) { + this.params.aliases.forEach(al => list.unshift(al)); + } + + list.forEach((command) => { + var parentBase = this.parent ? (this.parent.path || '') : ''; + this.path = parentBase + this.space() + (command || all); + if(this.path == all && !this.parent) this.path = ''; + + if(this.path) this.hash[this.path] = this; + }); + } + + add(params) { + var command = new Command(params, this); + + return command; + } + + space(end) { + var first = !(this.parent && this.parent.parent); + return this.params.merged || (!end && first) ? '' : ' '; + } +} + +module.exports=Command; \ No newline at end of file diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index 887c0b7..d607caf 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -1,92 +1,14 @@ var Vec3 = require('vec3'); module.exports = inject; -class Command { - constructor(params, parent, hash) { - this.params = params; - this.parent = parent; - this.hash = parent ? parent.hash : {}; +var Command = require('../command'); - this.updateHistory(); - } - - find(command) { - var res; - for(var key in this.hash) { - var space = this.hash[key].space(true); - if(space) space += '?'; - - var ended = space + '(.*)'; - - var finded = command.match(new RegExp('^' + key + ended)); - if(finded) { - res = [this.hash[key], finded]; - } - } - - return res; - } - - use(command) { - var res = this.find(command); - - if(res) { - var parse = res[0].params.parse; - if(parse) { - if(typeof parse == 'function') { - res[1] = parse(res[1][1]); - if(res[1] === false) { - return res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'; - } - } else { - res[1] = res[1][1].match(parse); - } - } else { - res[1].shift(); - } - - res = res[0].params.action(res[1]); - if(res) return '' + res; - } else { - return 'Command not found'; - } - } - - updateHistory() { - var all = '(.+?)'; - - var list = [this.params.base]; - if(this.params.aliases && this.params.aliases.length) { - this.params.aliases.forEach(al => list.unshift(al)); - } - - list.forEach((command) => { - var parentBase = this.parent ? (this.parent.path || '') : ''; - this.path = parentBase + this.space() + (command || all); - if(this.path == all && !this.parent) this.path = ''; - - if(this.path) this.hash[this.path] = this; - }); - } - - add(params) { - var command = new Command(params, this); - - return command; - } - - space(end) { - var first = !(this.parent && this.parent.parent); - return this.params.merged || (!end && first) ? '' : ' '; - } -} - -function inject(serv, player, options) { +function inject(serv, player) { var base = new Command({}); base.add({ base: 'help', - info: 'for show all commands', + info: 'to show all commands', usage: '/help [command]', action(params) { var c = params[0]; @@ -104,7 +26,7 @@ function inject(serv, player, options) { used.push(hash[key]); if(hash[key].params.info) { - var str = '/' + hash[key].path + ' ' + hash[key].params.info; + var str = hash[key].params.usage + ' ' + hash[key].params.info; if(hash[key].params.aliases && hash[key].params.aliases.length) { str += ' (aliases: ' + hash[key].params.aliases.join(', ') + ')'; } @@ -119,12 +41,13 @@ function inject(serv, player, options) { base.add({ base: 'gamemode', aliases: ['gm'], - info: 'for change game mode', + info: 'to change game mode', usage: '/gamemode <0-3>', - parse() { - var mode = parseInt(params[0]); - if(mode < 0 || mode > 3) return false; - else return mode; + parse(str) { + var results; + if(!(results = str.match(/^([0-3])$/))) + return false; + return parseInt(str); }, action(mode) { player.setGameMode(mode); @@ -133,7 +56,7 @@ function inject(serv, player, options) { base.add({ base: 'setblock', - info: 'for put block', + info: 'to put a block', usage: '/setblock ', parse(str) { var results = str.match(/^(~|~?-?[0-9]*) (~|~?-?[0-9]*) (~|~?-?[0-9]*) ([0-9]{1,3})/); @@ -156,7 +79,7 @@ function inject(serv, player, options) { base.add({ base: 'kick', - info: 'for kick a player', + info: 'to kick a player', usage: '/kick [reason]', parse(str) { var res = false; @@ -187,7 +110,7 @@ function inject(serv, player, options) { base.add({ base: 'ban', - info: 'for ban a player', + info: 'to ban a player', usage: '/ban [reason]', parse(str) { var res = false; @@ -224,7 +147,7 @@ function inject(serv, player, options) { base.add({ base: 'pardon', - info: 'for pardon a player', + info: 'to pardon a player', usage: '/pardon ', parse(str) { var res = false; @@ -244,15 +167,18 @@ function inject(serv, player, options) { base.add({ base: 'time', - info: 'for change a time', + info: 'to change a time', usage: '/time ', parse(str) { var res = false; var data = str.match(/^(add|query|set)(?: ([0-9]+|day|night))?/); + if(!data) return false; - if(data[2] == 'day') data[2] = 1000; - if(data[2] == 'night') data[2] = 13000; + if(data.length ==3) { + if (data[2] == 'day') data[2] = 1000; + if (data[2] == 'night') data[2] = 13000; + } return [data[1], data[2]]; }, @@ -279,7 +205,7 @@ function inject(serv, player, options) { base.add({ base: 'day', - info: 'for change a time to day', + info: 'to change a time to day', usage: '/day', action(params) { player.handleCommand('time set day'); @@ -288,7 +214,7 @@ function inject(serv, player, options) { base.add({ base: 'ping', - info: 'for pong!', + info: 'to pong!', usage: '/ping [number]', action(params) { var num = params[0] * 1 + 1; @@ -302,7 +228,7 @@ function inject(serv, player, options) { base.add({ base: 'night', - info: 'for change a time to night', + info: 'to change a time to night', usage: '/night', action(params) { player.handleCommand('time set night'); @@ -321,7 +247,8 @@ function inject(serv, player, options) { base.add({ base: 'version', - info: 'for get version of the server', + info: 'to get version of the server', + usage: '/version', action() { return 'This server is running flying-squid version 0.1.0'; } @@ -329,7 +256,8 @@ function inject(serv, player, options) { base.add({ base: 'bug', - info: 'for bug report', + info: 'to bug report', + usage: '/bug', action() { return 'Report bugs / issues here: https://github.com/mhsjlw/flying-squid/issues'; }