ztavern/node-server-manager/Plugins/NativeCommands.js
2024-10-18 00:19:19 +00:00

800 lines
No EOL
37 KiB
JavaScript

const moment = require('moment')
const path = require('path')
const crypto = require('crypto')
const wait = require('delay')
const fs = require('fs')
const Permissions = require(path.join(__dirname, `../Configuration/NSMConfiguration.json`)).Permissions
const configName = path.join(__dirname, `../Configuration/NSMConfiguration.json`)
const Localization = require(path.join(__dirname, `../Configuration/Localization-${process.env.LOCALE}.json`)).lookup
const Utils = new (require(path.join(__dirname, '../Utils/Utils.js')))()
var config = require(configName)
fs.watch(configName, async (filename) => {
if (filename) {
try { var newData = require(configName) }
catch (e) {
console.log(`Failed to reload config file ${configName}: ${e.toString()}`); return }
config = newData
}
})
class Plugin {
constructor(Server, Manager, Managers) {
this.Server = Server
this.Manager = Manager
this.Managers = Managers
//add the .pguid of players to grant them staff permissions (must be done on ClanTag, ZombiesBank, ZombiesStats, NativeCommands & the gsc script staff.gsc)
this.staff_list_a = [564391]
this.init()
}
onEventAsync (event) {
switch (event.type) {
case 'say':
if (config.commandPrefixes.includes(event.data.Message[0]) || config.broadcastCommandPrefixes.includes(event.data.Message[0]))
this.playerCommand(event.data.Origin, event.data.Message.substr(1).split(/\s+/), event.data.Message[0])
break
}
}
init () {
this.Manager.commands = {
'help': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args = null, delay) => {
var commands = Object.entries({...this.Manager.commands, ...this.Manager.Commands.Commands})
.filter(command => {
return !command[1].isMiddleware && (Permissions.Levels[command[1].Permission] <= Player.PermissionLevel || command[1].PermissionLevel <= Player.PermissionLevel)
})
switch (true) {
case (!args[1]):
case (Number.isInteger(parseInt(args[1]))):
var chunkedCommands = Utils.chunkArray(commands, Player.inGame ? 4 : 15)
var page = args[1] ? Math.max(1, Math.min(parseInt(args[1]), chunkedCommands.length)) : 1
await Player.Tell(Utils.formatString(Localization['COMMAND_LIST_PAGE'], {max: chunkedCommands.length, current: page}, '%')[0])
delay && await wait(300)
for (var i = 0; i < chunkedCommands[page - 1].length; i++) {
Player.Tell(`^7[^6${chunkedCommands[page - 1][i][0]}^7] ${Localization[`COMMAND_${chunkedCommands[page - 1][i][0].toLocaleUpperCase()}`]}`)
delay && await wait(300)
}
break
default:
var command = Utils.getCommand({...this.Manager.commands, ...this.Manager.Commands.Commands}, args[1])
if (!command) {
Player.Tell(Localization['COMMAND_NOT_FOUND'])
return
}
Player.Tell(`${Localization[`COMMAND_${command.toLocaleUpperCase()}`]}`)
delay && await wait(300)
Player.Tell(`Usage: ^5${config.commandPrefixes[0]}^7${Localization[`USAGE_${command.toLocaleUpperCase()}`]}`)
break
}
}
},
'fastrestart': {
ArgumentLength: 0,
Alias: 'fre',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: true,
callback: async (Player, args) => {
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
await this.Server.Rcon.executeCommandAsync('fast_restart')
this.Server.Broadcast(Utils.formatString(Localization['COMMAND_FASTRESTART_FORMAT'], {Name: Player.Name}, '%'))
}
},
'maprestart': {
ArgumentLength: 0,
Alias: 'mr',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: true,
callback: async (Player, args) => {
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
await this.Server.Rcon.executeCommandAsync('map_restart')
}
},
'maprotate': {
ArgumentLength: 0,
Alias: 'rotate',
Permission: Permissions.Commands.COMMAND_MAP,
inGame: true,
callback: async (Player, args) => {
await this.Server.Rcon.executeCommandAsync('map_rotate')
}
},
'map': {
ArgumentLength: 1,
Alias: 'm',
Permission: Permissions.Commands.COMMAND_MAP,
inGame: true,
callback: async (Player, args) => {
var delay = 3000
var Map = this.Server.getMap(args[1]) ? this.Server.getMap(args[1]) : {Name: args[1], Alias: args[1]}
this.Server.Broadcast(Utils.formatString(Localization['COMMAND_MAP_FORMAT'], {Name: Map.Alias, Delay: (delay / 1000).toFixed(0)}, '%')[0])
await wait(delay)
await this.Server.Rcon.executeCommandAsync(`map ${Map.Name}`)
}
},
'globalchat': {
ArgumentLength: 0,
Alias: 'gc',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: true,
callback: async (Player) => {
if (!Player.Session) return
Player.Session.Data.globalChat = !Player.Session.Data.globalChat
Player.Tell(Localization[`COMMAND_GLOBALCHAT_${Player.Session.Data.globalChat.toString().toLocaleUpperCase()}`])
}
},
'nextmap': {
ArgumentLength: 0,
Alias: 'nm',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: true,
callback: async (Player, args) => {
var mapIndex = this.Server.mapRotation.indexOf(this.Server.mapRotation.find(Map => Map == this.Server.Mapname))
var nextMap = mapIndex < this.Server.mapRotation.length - 1 ? this.Server.mapRotation[mapIndex + 1] : this.Server.mapRotation[0]
nextMap = this.Server.getMap(nextMap) ? this.Server.getMap(nextMap).Alias : nextMap
if (mapIndex < 0 || !nextMap) {
Player.Tell(Localization['COMMAND_NEXTMAP_NOT_FOUND'])
return
}
Player.Tell(Utils.formatString(Localization['COMMAND_NEXTMAP_FORMAT'], {Name: nextMap}, '%'))
}
},
'links': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
if (!config.links || !config.links.length) {
Player.Tell(Localization['COMMAND_LINKS_NOT_CONFIG'])
}
if (args[1]) {
var found = false
config.links.forEach(link => {
if (found) return
if (link.Name.toLocaleLowerCase().startsWith(args[1].toLocaleLowerCase())) {
Player.Tell(Utils.formatString(Localization['COMMAND_LINKS_FORMAT'], link, '%')[0])
found = true
}
})
!found && Player.Tell(Localization['COMMAND_LINKS_NOT_FOUND'])
return
}
for (var i = 0; i < config.links.length; i++) {
Player.Tell(Utils.formatString(Localization['COMMAND_LINKS_FORMAT'], config.links[i], '%')[0])
await wait(500)
}
}
},
'ping': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: function (Player) {
Player.Tell('pong')
}
},
'broadcast': {
ArgumentLength: 1,
Permission: Permissions.Commands.COMMAND_MAP,
inGame: false,
callback: async (Player, args) => {
this.Managers.forEach(Manager => {
Manager.Server.Broadcast(`^7[^1Broadcast ^7(^5${Player.Name}^7)] ${args.slice(1).join(' ')}`)
})
Player.Tell(`^1Broadcasted^7: ${args.slice(1).join(' ')}`)
}
},
'tell': {
ArgumentLength: 2,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args = null, delay) => {
var Client = await this.Server.getClient(args[1])
switch (true) {
case (!Client):
Player.Tell(Localization.COMMAND_CLIENT_NOT_FOUND)
return
}
var Target = this.Server.findClient(Client.ClientId)
switch (true) {
case (!Target):
Player.Tell(Localization.COMMAND_CLIENT_NOT_INGAME)
return
}
Target.Session && (Target.Session.Data.lastMsg = Player)
Player.inGame && (Player.Session.Data.lastMsg = Target)
Target.Tell(`^3[^5${Player.Name}^3 (@^5${Player.ClientId}^3) -> me]^7 ${args.slice(2).join(' ')}`)
Player.Tell(`^3[me -> ^5${Target.Name} ^3(@^5${Target.ClientId}^3)^3]^7 ${args.slice(2).join(' ')}`)
}
},
'reply': {
ArgumentLength: 1,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
Alias: 'r',
inGame: true,
callback: async(Player, args) => {
switch (true) {
case (!Player.Session || !Player.Session.Data.lastMsg):
Player.Tell(Localization['COMMAND_REPLY_NOT_CONV'])
return
case (!this.Server.findClient(Player.Session.Data.lastMsg.ClientId)):
Player.Tell(Localization['COMMAND_CLIENT_NOT_INGAME'])
return
}
Player.Session.Data.lastMsg.Tell(`^3[^5${Player.Name}^3 (@^5${Player.ClientId}^3) -> me]^7 ${args.slice(1).join(' ')}`)
Player.Tell(`^3[me -> ^5${Player.Session.Data.lastMsg.Name} ^3(@^5${Player.Session.Data.lastMsg.ClientId}^3)^3]^7 ${args.slice(1).join(' ')}`)
}
},
'players': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args = null, delay) => {
var allClients = Utils.chunkArray(this.getAllClients(), Player.inGame ? 4 : 15)
var page = Number.isInteger(parseInt(args[1])) ? Math.max(1, Math.min(parseInt(args[1]), allClients.length)) : 1
if (!allClients.length) {
Player.Tell(Localization['NO_PLAYERS_ONLINE'])
return
}
await Player.Tell(Utils.formatString(Localization['COMMAND_LIST_PAGE'], {max: allClients.length, current: page}, '%')[0])
for (var i = 0; i < allClients[page - 1].length; i++) {
Player.Tell(Utils.formatString(Localization['COMMAND_PLAYERS_FORMAT'],
{
Name: allClients[page - 1][i].Name,
ClientId: allClients[page - 1][i].ClientId,
Role: Utils.getRoleFrom(allClients[page - 1][i].PermissionLevel, 1).Name,
Level: allClients[page - 1][i].PermissionLevel,
Hostname: allClients[page - 1][i].Server.HostnameRaw
}, '%')[0])
}
}
},
'info': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: (Player) => {
Player.Tell(`Node Server Manager - v${this.Manager.Version} by ${this.Manager.Author}`)
}
},
'whoami': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player) => {
var info = await this.Server.DB.getClient(Player.ClientId)
if (!info) {
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
}
Player.Tell(`[^5${info.Name}^7] [@^5${info.ClientId}^7] [^5${Utils.getRoleFrom(Math.min(info.PermissionLevel, 5), 1).Name}^7] [^5${info.IPAddress}^7] [^5${info.Guid}^7]`)
}
},
'whois': {
ArgumentLength: 1,
Permission: 'ROLE_ADMIN',
inGame: false,
callback: async (Player, args) => {
var Client = await this.Server.getClient(args[1])
switch (true) {
case (!Client):
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
}
var info = await this.Server.DB.getClient(Client.ClientId)
Player.Tell(`[^5${info.Name}^7] [@^5${info.ClientId}^7] [^5${Utils.getRoleFrom(Math.min(info.PermissionLevel, 5), 1).Name}^7] [^5${info.IPAddress}^7] ^7[^5${info.Guid}^7]`)
}
},
'testperm': {
ArgumentLength: 1,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
var Permission = Utils.getRoleFrom(args.slice(1).join(' '), 0)
var Client = await this.Server.DB.getClient(Player.ClientId)
switch (true) {
case (!Client):
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
case (!Permission):
Player.Tell(Localization['ROLE_NOT_EXIST'])
return
case (Client.PermissionLevel < Permissions.Levels.ROLE_ADMIN):
Player.Tell(Localization['COMMAND_FORBIDDEN'])
return
case (Client.PermissionLevel < Permission.Level):
Player.Tell(Localization['ROLE_HIERARCHY_ERROR'])
return
}
Player.PermissionLevel = Permission.Level
Player.Tell(`Permissions set to [ ^5${Permission.Name}^7 ]`)
}
},
'servers': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args, delay) => {
var Managers = this.Managers.concat()
if (args[1] && Managers[parseInt(args[1])] && Managers[parseInt(args[1])].Server.Mapname) {
var Manager = Managers[parseInt(args[1])]
Player.Tell(Utils.formatString(Localization['COMMAND_SERVERS_FORMAT'],
{
Id: Manager.Server.Id,
Hostname: Manager.Server.Hostname,
Host: Manager.Server.getAddress(),
Clients: Manager.Server.getClients().length,
MaxClients: Manager.Server.MaxClients,
Mapname: Manager.Server.getMapname().Alias
}, '%'))
return
}
for (var i = 0; i < Managers.length; i++) {
var Manager = Managers[i]
if (!Manager.Server.Mapname) continue
Player.Tell(Utils.formatString(Localization['COMMAND_SERVERS_FORMAT'],
{
Id: Manager.Server.Id,
Hostname: Manager.Server.Hostname,
Host: Manager.Server.getAddress(),
Clients: Manager.Server.getClients().length,
MaxClients: Manager.Server.MaxClients,
Mapname: Manager.Server.getMapname().Alias
}, '%'))
delay && await wait(500)
}
}
},
'token': {
ArgumentLength: 0,
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player) => {
var Client = await this.Server.DB.getClient(Player.ClientId)
switch (true) {
case (Player.discordUser):
Player.Tell(Localization['COMMAND_ENV_ERROR'])
return
case (!Client):
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
case (!Client.Settings.TokenLogin):
Player.Tell(Localization['TOKEN_LOGIN_DISABLED'])
return
}
var rawToken = crypto.randomBytes(3).toString('hex').toLocaleUpperCase();
rawToken = rawToken.split('')
var formattedToken = []
rawToken.forEach(char => {
if (Number.isInteger(parseInt(char))) {
formattedToken.push(`^5${char}^7`)
} else {
formattedToken.push(`^3${char}^7`)
}
})
Player.Tell(Localization.COMMAND_TOKEN_FORMAT
.replace('%CLIENTID%', Player.ClientId)
.replace('%TOKEN%', formattedToken.join('')))
await this.Server.DB.createToken(Player.ClientId, rawToken.join(''))
}
},
'rcon': {
ArgumentLength: 1,
Permission: Permissions.Commands.COMMAND_RCON,
inGame: false,
callback: async (Player, args, delay) => {
var result = []
if (!Player.inGame) {
switch (true) {
case (args.length < 2):
Player.Tell(Localization.RCON_SERVER_NOT_SPECIFIED)
return
case (!this.Managers[parseInt(args[1])] || !this.Managers[parseInt(args[1])].Server.Mapname || !this.Managers[parseInt(args[1])].Server.Rcon.isRunning):
Player.Tell(Localization.SERVER_NOT_EXIST)
return
}
var cmd = (await this.Managers[parseInt(args[1])].Server.Rcon.executeCommandAsync(args.slice(2).join(' ')))
result = cmd ? cmd.trim().split('\n') : Localization['COMMAND_RCON_FAILED'].split('\n')
} else {
var cmd = await this.Server.Rcon.executeCommandAsync(args.slice(1).join(' '))
result = cmd ? cmd.trim().split('\n') : Localization['COMMAND_RCON_FAILED'].split('\n')
}
result[0] = Localization.COMMAND_EXECUTE_SUCCESS
for (var i = 0; i < result.length; i++) {
Player.Tell(result[i])
delay && await wait(300)
}
}
},
'setrole': {
ArgumentLength: 2,
Permission: Permissions.Commands.COMMAND_SETROLE,
inGame: false,
Alias: 'sr',
callback: async (Player, args) => {
var Role = args.slice(2).join(' ')
var Client = await this.Server.getClient(args[1])
var Permission = Utils.getRoleFrom(Role, 0)
switch (true) {
case (!Client):
Player.Tell(Localization.COMMAND_CLIENT_NOT_FOUND)
return
case (!Permission):
Player.Tell(Localization.ROLE_NOT_EXIST)
return
case (Permission.Level >= Player.PermissionLevel):
Player.Tell(Localization.ROLE_HIERARCHY_ERROR)
return
case (Player.ClientId == Client.ClientId):
Player.Tell(Localization.ROLE_SELF_ERROR)
return
}
var Target = this.Server.findClient(Client.ClientId)
if (Target) {
Target.PermissionLevel = Permission.Level
Target.Tell(`Your role has been set to [ ^5${Permission.Name}^7 ]`)
var role = Permission.Name
var customTag = await this.Server.DB.metaService.getPersistentMeta('custom_tag', Target.ClientId)
role = customTag ? customTag.Value : Utils.stripString(role)
Target.Server.Rcon.executeCommandAsync(`setclantagraw ${Target.Clientslot} "${role}"`)
}
this.Server.DB.setLevel(Client, Permission.Level)
Player.Tell(`^5${Client.Name}^7's role has been set to [ ^5${Permission.Name}^7 ]`)
}
},
'owner': {
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: true,
callback: async (Player) => {
var Owner = await this.Server.DB.getOwner()
switch (true) {
case !Owner:
this.Server.DB.setLevel(Player, Permissions.Levels['ROLE_OWNER'])
Player.PermissionLevel = Permissions.Levels['ROLE_OWNER']
Player.Tell(`Your role has been set to [ ^5${Utils.getRoleFrom(5, 1).Name}^7 ]`)
return
case (Owner.ClientId == Player.ClientId):
Player.Tell(`You're already the owner!`)
return
case (Owner.ClientId != Player.ClientId):
Player.Tell(`^5${(await this.Server.DB.getClient(Owner.ClientId)).Name}^7 owns this server`)
return
}
}
},
'kick': {
ArgumentLength: 2,
Alias: 'k',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
var Client = await this.Server.getClient(args[1])
switch (true) {
case (!Client):
Player.Tell(Localization.COMMAND_CLIENT_NOT_FOUND)
return
/* case (Client.PermissionLevel >= Player.PermissionLevel):
Player.Tell(Localization.CLIENT_HIERARCHY_ERROR)*/
return
}
var Target = this.Server.findClient(Client.ClientId)
Target ? ( Player.Tell(`^5${Target.Name}^7 was kicked`), Target.Kick(`${args.slice(2).join(' ')}`, Player)) : Player.Tell(Localization.COMMAND_CLIENT_NOT_INGAME)
}
},
'unban': {
ArgumentLength: 2,
Alias: 'ub',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
var Client = await this.Server.getClient(args[1])
var Reason = args.slice(2).join(' ')
/*switch (true) {
case (Client.PermissionLevel >= Player.PermissionLevel):
Player.Tell(Localization.CLIENT_HIERARCHY_ERROR)
return
}*/
var count = await this.Server.DB.unbanClient(Client.ClientId, Reason, Player.ClientId)
this.Server.DB.addPenalty({
TargetId: Client.ClientId,
OriginId: Player.ClientId,
PenaltyType: 'PENALTY_UNBAN',
Active: false,
Duration: 0,
Reason: Reason
})
if (count) {
Player.Tell(`Unbanned ^5${Client.Name}^7 for ^5${Reason}^7`)
this.Server.emit('penalty', 'PENALTY_UNBAN', Client, Reason, Player)
} else
Player.Tell(`^5${Client.Name}^7 is not banned`)
}
},
'tempban': {
ArgumentLength: 3,
Alias: 'tb',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
var timeVars = {
'd': 86400,
'h': 3600,
'm': 60,
's': 1,
}
var Client = await this.Server.getClient(args[1])
if (!args[2].match(/([0-9]+)([A-Za-z]+)/)) {
Player.Tell(Localization.COMMAND_PARSE_TIME_ERROR)
return
}
var parts = Array.from(args[2].match(/([0-9]+)([A-Za-z]+)/)).slice(1)
switch (true) {
case (!Client):
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
/* case (Client.PermissionLevel >= Player.PermissionLevel):
Player.Tell(Localization['CLIENT_HIERARCHY_ERROR'])*/
return
case (!parts || parts.length < 2 || !timeVars[parts[1]] || !Number.isInteger(parseInt(parts[0]))):
Player.Tell(Localization['COMMAND_PARSE_TIME_ERROR'])
return
}
var Reason = args.slice(3).join(' ')
var Duration = parseInt(parts[0] * timeVars[parts[1]])
Reason = Reason.replace(new RegExp(/rule([0-9]+)/g), (rule) => {
var num = Math.max(parseInt(rule.substr(4)), 1) - 1
if (this.Server.config.rules[num]) {
return this.Server.config.rules[num]
}
return rule
})
if (Duration > 86400 * 32) {
Player.Tell(Localization['COMMAND_PARSE_TIME_ERROR'])
return
}
var Target = this.Server.findClient(Client.ClientId)
if (Target) {
Target.Tempban(Reason, Player, Duration)
Player.Tell(`Banned ^5${Client.Name}^7 for ^5${Duration}^7 seconds for ^5${Reason}^7`)
return
}
this.Server.DB.addPenalty({
TargetId: Client.ClientId,
OriginId: Player.ClientId,
PenaltyType: 'PENALTY_TEMP_BAN',
Duration: Duration,
Reason: Reason
})
this.Server.emit('penalty', 'PENALTY_TEMP_BAN', Client, Reason, Player, Duration)
Player.Tell(`Banned ^5${Client.Name}^7 for ^5${Duration}^7 seconds for ^5${Reason}^7`)
}
},
'ban': {
ArgumentLength: 2,
Alias: 'b',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args) => {
var Client = await this.Server.getClient(args[1])
if (await this.is_staff(Player) == false)
{
Player.Tell("^1Staff only")
return
}
switch (true) {
case (!Client):
Player.Tell(Localization.COMMAND_CLIENT_NOT_FOUND)
return
/* case (Client.PermissionLevel >= Player.PermissionLevel):
Player.Tell(Localization.CLIENT_HIERARCHY_ERROR)*/
return
}
var Reason = args.slice(2).join(' ')
Reason = Reason.replace(new RegExp(/rule([0-9]+)/g), (rule) => {
var num = Math.max(parseInt(rule.substr(4)), 1) - 1
if (this.Server.config.rules[num]) {
return this.Server.config.rules[num]
}
return rule
})
var Target = this.Server.findClient(Client.ClientId)
if (Target) {
Target.Ban(Reason, Player)
Player.Tell(`Banned ${Target.Name} permanently for ${Reason}`)
return
}
this.Server.DB.addPenalty({
TargetId: Client.ClientId,
OriginId: Player.ClientId,
PenaltyType: 'PENALTY_PERMA_BAN',
Duration: 0,
Reason: Reason
})
this.Server.emit('penalty', 'PENALTY_PERMA_BAN', Client, Reason, Player)
Player.Tell(`Banned ${Client.Name} permanently for ${Reason}`)
}
},
'find': {
ArgumentLength: 1,
Alias: 'f',
Permission: Permissions.Commands.COMMAND_USER_CMDS,
inGame: false,
callback: async (Player, args, delay) => {
var MatchedClients = await this.Server.DB.getClientByName(args.slice(1).join(' '), 10)
if (MatchedClients.length <= 0) {
Player.Tell(Localization['COMMAND_CLIENT_NOT_FOUND'])
return
}
for (var i = 0; i < Math.min(MatchedClients.length, 10); i++) {
Player.Tell(`^5${MatchedClients[i].Name} ^7| ^5@${MatchedClients[i].ClientId} ^7| ^5${Utils.getRoleFrom(MatchedClients[i].PermissionLevel, 1).Name} ^7| Active ${moment(MatchedClients[i].LastConnection).calendar()} | Joined ${moment(MatchedClients[i].FirstConnection).calendar()}`)
delay && await wait(300)
}
}
}
}
this.Server.on('event', this.onEventAsync.bind(this));
}
getAllClients() {
var Clients = []
this.Managers.forEach(Manager => {
var clients = Manager.Server.Clients.filter(x => x)
Clients = Clients.concat(clients)
})
return Clients
}
async playerCommand (Player, args, prefix) {
try {
if (!Player) return
var Client = await this.Server.DB.getClient(Player.ClientId)
if (Client.Settings && Client.Settings.InGameLogin && !Player.Session.Data.Authorized) {
Player.Tell(Localization['CLIENT_NOT_AUTHORIZED'])
return
}
var isBroadcast = config.broadcastCommandPrefixes.includes(prefix)
var executedMiddleware = await this.Manager.Commands.executeMiddleware(args[0], Player, args, { broadcast: isBroadcast })
if (await this.Manager.Commands.execute(args[0], Player, args, { broadcast: isBroadcast })) return
var command = Utils.getCommand(this.Manager.commands, args[0])
switch (true) {
case (!this.Manager.commands[command]):
case (this.Manager.commands[command].gameTypeExclusions && this.Manager.commands[command].gameTypeExclusions.includes(this.Server.Gametype)):
!executedMiddleware && Player.Tell(Localization.COMMAND_NOT_FOUND)
return
case (Client.Settings && Client.Settings.InGameLogin && !Player.Session.Data.Authorized):
Player.Tell(Localization.CLIENT_NOT_AUTHORIZED)
return
case (Player.PermissionLevel < Permissions.Levels[this.Manager.commands[command].Permission]):
Player.Tell(Localization.COMMAND_FORBIDDEN)
return
case (args.length - 1 < this.Manager.commands[command].ArgumentLength):
Player.Tell(Localization.COMMAND_ARGUMENT_ERROR)
await wait(300)
Player.Tell(`Usage: ^6${config.commandPrefixes[0]}^7${Localization[`USAGE_${command.toLocaleUpperCase()}`]}`)
return
}
this.Manager.commands[command].logToAudit != false && this.Server.DB.logActivity(`@${Player.ClientId}`, Localization['AUDIT_CMD_EXEC'].replace('%NAME%', command), args.join(' '))
this.Manager.commands[command].callback(Player, args, true)
}
catch (e) {
if (process.env.NODE_ENV && process.env.NODE_ENV.toLocaleLowerCase() == 'dev')
console.log(e)
Player.Tell(Localization['COMMAND_ERROR'])
}
}
async is_staff(Player)
{
for (var i = 0; i < this.staff_list_a.length; i++)
if (this.staff_list_a[i] == Player.Guid)
return true
Player.Tell("hehe boi u tryna scam da kiels by using staff cmd? oh helllll no fk emp")
return false
}
}
module.exports = Plugin