Files
Yumi/src/discord/Say.ts
T

136 lines
4.7 KiB
TypeScript

import { Message, Permissions, Interaction, CommandInteraction, PermissionsBitField } from 'discord.js';
import { I18n } from 'i18n';
import DiscordModule, { HybridInteractionMessage } from '../utils/DiscordModule';
import {
makeSuccessEmbed,
sendHybridInteractionMessageResponse,
makeErrorEmbed,
makeInfoEmbed
} from '../utils/DiscordMessage';
import Locale from '../services/Locale';
const EMBEDS = {
SAY_INFO: (data: HybridInteractionMessage, locale: I18n) => {
return makeInfoEmbed({
title: locale.__('say.title'),
description: locale.__('say.info'),
fields: [
{
name: locale.__('common.available_args'),
value: locale.__('say.valid_args')
}
],
user: data.getUser()
});
},
NO_PERMISSION: (data: HybridInteractionMessage, locale: I18n) => {
return makeErrorEmbed({
title: locale.__('common.no_permissions'),
description: locale.__(
'common.no_permissions_description', {
PERMISSIONS: 'VIEW_CHANNEL, SEND_MESSAGES, MANAGE_CHANNELS'
}
),
user: data.getUser()
});
},
SAY_ERROR: (data: HybridInteractionMessage, locale: I18n, error: Error) => {
return makeErrorEmbed({
title: locale.__('say.error'),
description: error.message ? error.message : undefined,
user: data.getUser()
});
},
SUCCESSFULLY_SAID: (data: HybridInteractionMessage, locale: I18n) => {
return makeSuccessEmbed({
title: locale.__('say.success'),
user: data.getUser()
});
}
};
export default class Say extends DiscordModule {
public id = 'Discord_Say';
public commands = ['say'];
public commandInteractionName = 'say';
async GuildOnModuleCommand(args: any, message: Message) {
await this.run(new HybridInteractionMessage(message), args);
}
async GuildModuleCommandInteractionCreate(interaction: CommandInteraction) {
await this.run(new HybridInteractionMessage(interaction), interaction.options);
}
async run(data: HybridInteractionMessage, args: any) {
const guild = data.getGuild();
if (!guild) return;
const locale = await Locale.getGuildLocale(guild.id);
let query;
if (data.isMessage()) {
const message = data.getMessage();
if (!message.member) return;
if (
!message.member.permissions.has([
PermissionsBitField.Flags.ViewChannel,
PermissionsBitField.Flags.SendMessages,
PermissionsBitField.Flags.ManageChannels,
])
)
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.NO_PERMISSION(data, locale)]
});
if (args.length === 0)
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.SAY_INFO(data, locale)]
});
query = args.join(' ');
} else if (data.isApplicationCommand()) {
const interaction = data.getSlashCommand();
if (
!data
.getGuild()!
.members.cache.get(interaction.user.id)
?.permissions.has([PermissionsBitField.Flags.Administrator])
)
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.NO_PERMISSION(data, locale)]
});
query = interaction.options.get('message', true).value?.toString();
}
if (data.isApplicationCommand() && data.getChannel()) {
try {
await data.getChannel()!.send({ content: query });
await data
.getMessageComponentInteraction()
.reply({ ephemeral: true, embeds: [EMBEDS.SUCCESSFULLY_SAID(data, locale)] });
} catch (err: any) {
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.SAY_ERROR(data, locale, err)]
});
}
} else if (data.isMessage()) {
const message = data.getMessage();
if (message.deletable) await message.delete();
try {
await data.getChannel()!.send({ content: query });
} catch (err: any) {
return await sendHybridInteractionMessageResponse(data, {
embeds: [EMBEDS.SAY_ERROR(data, locale, err)]
});
}
}
}
}