ztavern/node-server-manager/Lib/Commands.js
2024-10-18 00:19:19 +00:00

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