This commit is contained in:
JWo1F 2015-10-11 07:32:49 +03:00
parent 19b5c9a9cc
commit b51519e138

View file

@ -1,92 +1,88 @@
var Vec3 = require('vec3'); var Vec3 = require('vec3');
module.exports = inject; module.exports = inject;
function inject(serv, player, options) { class Command {
var hash = {}; constructor(params, parent, hash) {
this.params = params;
this.parent = parent;
this.hash = parent ? parent.hash : {};
class Command { this.updateHistory();
constructor(params, parent) { }
this.params = params;
this.parent = parent;
this.child = [];
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 ended = space + '(.*)';
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) {
var finded = command.match(new RegExp('^' + key + ended)); res = [this.hash[key], finded];
if(finded) {
res = [hash[key], finded];
}
} }
return res;
} }
static use(command) { return res;
var res = this.find(command); }
if(res) { use(command) {
var parse = res[0].params.parse; var res = this.find(command);
if(parse) {
if(typeof parse == 'function') { if(res) {
res[1] = parse(res[1][1]); var parse = res[0].params.parse;
if(res[1] === false) { if(parse) {
player.chat(res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax'); if(typeof parse == 'function') {
return; res[1] = parse(res[1][1]);
} if(res[1] === false) {
} else { return res[0].params.usage ? 'Usage: ' + res[0].params.usage : 'Bad syntax';
res[1] = res[1][1].match(parse);
} }
} else { } else {
res[1].shift(); res[1] = res[1][1].match(parse);
} }
res = res[0].params.action(res[1]);
if(res) player.chat('' + res);
} else { } else {
player.chat('Command not found'); res[1].shift();
}
}
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) => { res = res[0].params.action(res[1]);
var parentBase = this.parent ? (this.parent.path || '') : ''; if(res) return '' + res;
this.path = parentBase + this.space() + (command || all); } else {
if(this.path == all && !this.parent) this.path = ''; return 'Command not found';
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 }); 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.add({
base: 'help', base: 'help',
@ -94,9 +90,10 @@ function inject(serv, player, options) {
usage: '/help [command]', usage: '/help [command]',
action(params) { action(params) {
var c = params[0]; var c = params[0];
var hash = base.hash;
if(c) { 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); var help = res.params.help && res.params.help(params);
return help ? '' + help : 'Information not found'; return help ? '' + help : 'Information not found';
@ -340,5 +337,8 @@ function inject(serv, player, options) {
serv.commands = base; serv.commands = base;
player.handleCommand = Command.use.bind(Command); player.handleCommand = function(str) {
var res = base.use(str);
if(res) player.chat('' + res);
};
} }