95 lines
No EOL
3 KiB
JavaScript
95 lines
No EOL
3 KiB
JavaScript
const path = require('path')
|
|
const Localization = require(path.join(__dirname, `../Configuration/Localization-${process.env.LOCALE}.json`)).lookup
|
|
|
|
class Commands {
|
|
constructor() {
|
|
this.Commands = {}
|
|
}
|
|
add(command) {
|
|
this.Commands[command.name] = command
|
|
}
|
|
findCommand(name) {
|
|
var found = false
|
|
Object.entries(this.Commands).forEach(command => {
|
|
if (command[0].toLocaleLowerCase() == name.toLocaleLowerCase() || (command[1].alias && command[1].alias.toLocaleLowerCase() == name.toLocaleLowerCase())) {
|
|
found = this.Commands[command[0]]
|
|
}
|
|
})
|
|
return found
|
|
}
|
|
async executeMiddleware (name, Player, args, options = { delay: true, broadcast: false }) {
|
|
return new Promise((resolve, reject) => {
|
|
var next = () => {
|
|
resolve()
|
|
}
|
|
|
|
Object.entries(this.Commands).forEach(command => {
|
|
if (!command[1].isMiddleware) return
|
|
|
|
this.execute(command[1].name, Player, args, options, next)
|
|
})
|
|
})
|
|
}
|
|
async execute (name, Player, args, options = { delay: true, broadcast: false }, next = null) {
|
|
var command = this.findCommand(name)
|
|
|
|
var funcs = {
|
|
Tell: (string) => {
|
|
options.broadcast ? (Player.Server.Broadcast(string)) : Player.Tell(string)
|
|
}
|
|
}
|
|
|
|
switch (true) {
|
|
case (!next && command.isMiddleware):
|
|
case (!command):
|
|
return
|
|
case (command.inGame && !Player.inGame):
|
|
Player.Tell(Localization['COMMAND_ENV_ERROR'])
|
|
return 1
|
|
case (Player.PermissionLevel < command.permission):
|
|
Player.Tell(Localization['COMMAND_FORBIDDEN'])
|
|
return 1
|
|
}
|
|
|
|
var defaultParam = {
|
|
join: false,
|
|
optional: false,
|
|
index: 0,
|
|
name: ''
|
|
}
|
|
|
|
var params = {}
|
|
for (var i = 0; i < command.params.length; i++) {
|
|
|
|
command.params[i] = {...defaultParam, ...command.params[i]}
|
|
|
|
if (!args[command.params[i].index + 1]) {
|
|
if (command.params[i].optional) continue
|
|
|
|
Player.Tell(Localization['COMMAND_ARGUMENT_ERROR'])
|
|
return 1
|
|
}
|
|
params[command.params[i].name] = command.params[i].join ? args.slice(command.params[i].index + 1).join(' ') : args[command.params[i].index + 1]
|
|
}
|
|
|
|
for (var i = 0; i < command.exceptions.length; i++) {
|
|
if (!command.exceptions[i].callback(Player, params, args)) {
|
|
Player.Tell(command.exceptions[i].error)
|
|
return 1
|
|
}
|
|
}
|
|
|
|
if (!command.callbacks.length) {
|
|
command.defaultCallback(Player, args)
|
|
return 1
|
|
}
|
|
|
|
for (var i = 0; i < command.callbacks.length; i++) {
|
|
await command.callbacks[i](Player, params, args, options, funcs, next)
|
|
}
|
|
|
|
return 1
|
|
}
|
|
}
|
|
|
|
module.exports = Commands |