pixelverse-helper/src/utils/command-utils.ts
2023-08-28 20:17:50 -04:00

73 lines
2.5 KiB
TypeScript

import {
CommandInteraction,
GuildChannel,
MessageComponentInteraction,
ModalSubmitInteraction,
ThreadChannel,
} from 'discord.js';
import { FormatUtils, InteractionUtils } from './index.js';
import { Command } from '../commands/index.js';
import { Permission } from '../models/enum-helpers/index.js';
import { EventData } from '../models/internal-models.js';
import { Lang } from '../services/index.js';
export class CommandUtils {
public static findCommand(commands: Command[], commandParts: string[]): Command {
let found = [...commands];
let closestMatch: Command;
for (let [index, commandPart] of commandParts.entries()) {
found = found.filter(command => command.names[index] === commandPart);
if (found.length === 0) {
return closestMatch;
}
if (found.length === 1) {
return found[0];
}
let exactMatch = found.find(command => command.names.length === index + 1);
if (exactMatch) {
closestMatch = exactMatch;
}
}
return closestMatch;
}
public static async runChecks(
command: Command,
intr: CommandInteraction | MessageComponentInteraction | ModalSubmitInteraction,
data: EventData
): Promise<boolean> {
if (command.cooldown) {
let limited = command.cooldown.take(intr.user.id);
if (limited) {
await InteractionUtils.send(
intr,
Lang.getEmbed('validationEmbeds.cooldownHit', data.lang, {
AMOUNT: command.cooldown.amount.toLocaleString(data.lang),
INTERVAL: FormatUtils.duration(command.cooldown.interval, data.lang),
})
);
return false;
}
}
if (
(intr.channel instanceof GuildChannel || intr.channel instanceof ThreadChannel) &&
!intr.channel.permissionsFor(intr.client.user).has(command.requireClientPerms)
) {
await InteractionUtils.send(
intr,
Lang.getEmbed('validationEmbeds.missingClientPerms', data.lang, {
PERMISSIONS: command.requireClientPerms
.map(perm => `**${Permission.Data[perm].displayName(data.lang)}**`)
.join(', '),
})
);
return false;
}
return true;
}
}