mirror of
https://github.com/danbulant/flying-squid
synced 2026-06-15 04:21:04 +00:00
commands
This commit is contained in:
parent
82067d1424
commit
0f5ce49610
1 changed files with 324 additions and 98 deletions
|
|
@ -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 <x> <y> <z> <id>");
|
||||
}
|
||||
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 <player> [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 <player> [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 <player>");
|
||||
}
|
||||
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;
|
||||
}
|
||||
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 <x> <y> <z> <id>',
|
||||
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 <player> [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 <player> [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 <player>',
|
||||
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 <add|query|set> <value>',
|
||||
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 <params>',
|
||||
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);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue