diff --git a/src/discord/Settings/Language.ts b/src/discord/Settings/Language.ts new file mode 100644 index 0000000..4e0dba2 --- /dev/null +++ b/src/discord/Settings/Language.ts @@ -0,0 +1,103 @@ +import { Permissions, Guild, PermissionFlagsBits, PermissionsBitField } from 'discord.js'; +import { I18n } from 'i18n'; + +import DiscordProvider from '../../providers/Discord'; +import Prisma from '../../providers/Prisma'; +import Cache from '../../providers/Cache'; + +import { HybridInteractionMessage } from '../../utils/DiscordModule'; +import { + makeInfoEmbed, + makeErrorEmbed, + makeSuccessEmbed, + sendHybridInteractionMessageResponse +} from '../../utils/DiscordMessage'; + +import { COMMON_EMBEDS } from '.'; +import Locale from '../../providers/Locale'; + +const EMBEDS = { + LANGUAGE_INFO: (data: HybridInteractionMessage, locale: I18n, currentLocale: string) => { + return makeInfoEmbed({ + title: locale.__('settings_language.info', { LANGUAGE: currentLocale}), + description: locale.__('settings_language.info_description', { LANGUAGES: Locale.getLocaleProvider('en').getLocales().join(', ') }), + user: data.getUser() + }); + }, + LANGUAGE_INVALID: (data: HybridInteractionMessage, locale: I18n) => { + return makeErrorEmbed({ + title: locale.__('settings_language.language_invalid'), + description: locale.__('settings_language.language_invalid_description'), + user: data.getUser() + }); + }, + LANGUAGE_UPDATED: (data: HybridInteractionMessage, locale: I18n, newLanguage: string) => { + return makeSuccessEmbed({ + title: locale.__({ phrase: 'settings_language.language_updated', locale: newLanguage }), + description: locale.__({ phrase: 'settings_language.language_updated_description', locale: newLanguage }, { LANGUAGE: newLanguage }), + user: data.getUser() + }); + } +}; + +export default async (data: HybridInteractionMessage, args: any, guild: Guild, locale: I18n) => { + let member = data.getMember(); + if (!member) return; + + const GuildCache = await Cache.getCachedGuild(guild.id); + if (!GuildCache) return; + const language = GuildCache.locale; + + if (!member.permissions.has([PermissionsBitField.Flags.Administrator])) + return await sendHybridInteractionMessageResponse(data, { + embeds: [COMMON_EMBEDS.NO_PERMISSION(data, locale)] + }); + + let newLanguage: string | null | undefined; + if (data.isMessage()) { + let _name: string; + if (typeof args[1] === 'undefined') + return await sendHybridInteractionMessageResponse(data, { + embeds: [EMBEDS.LANGUAGE_INFO(data, locale, language)] + }); + + let __name = args; + __name.shift(); + _name = __name.join(' '); + newLanguage = _name; + } else if (data.isApplicationCommand()) newLanguage = data.getSlashCommand().options.get('language', true).value?.toString(); + + if (!newLanguage) + return await sendHybridInteractionMessageResponse(data, { + embeds: [EMBEDS.LANGUAGE_INFO(data, locale, language)] + }); + + newLanguage = newLanguage.toLowerCase(); + + if (!Locale.getLocaleProvider('en').getLocales().includes(newLanguage)) + return await sendHybridInteractionMessageResponse(data, { + embeds: [EMBEDS.LANGUAGE_INVALID(data, locale)] + }); + + let placeholder: HybridInteractionMessage | undefined; + + let _placeholder = await sendHybridInteractionMessageResponse(data, { + embeds: [COMMON_EMBEDS.PROCESSING(data, locale)] + }); + if (_placeholder) placeholder = new HybridInteractionMessage(_placeholder); + + await Prisma.client.guild.update({ + where: { id: guild.id }, + data: { locale: newLanguage } + }); + Cache.updateGuildCache(guild.id); + + if (data && data.isMessage() && placeholder && placeholder.isMessage()) + return placeholder.getMessage().edit({ embeds: [EMBEDS.LANGUAGE_UPDATED(data, locale, newLanguage)] }); + else if (data.isApplicationCommand()) + return await sendHybridInteractionMessageResponse( + data, + { embeds: [EMBEDS.LANGUAGE_UPDATED(data, locale, newLanguage)] }, + true + ); +}; diff --git a/src/discord/Settings/index.ts b/src/discord/Settings/index.ts index 4d2d61a..a47948f 100644 --- a/src/discord/Settings/index.ts +++ b/src/discord/Settings/index.ts @@ -1,6 +1,5 @@ import { Message, - Interaction, CommandInteraction, Permissions, ThreadChannel, @@ -24,6 +23,7 @@ import { } from '../../utils/DiscordMessage'; import * as PrefixModule from './Prefix'; +import * as LanguageModule from './Language'; import * as ServiceAnnouncementModule from './ServiceAnnouncement'; export const COMMON_EMBEDS = { @@ -102,6 +102,8 @@ export default class Settings extends DiscordModule { }); case 'prefix': return await PrefixModule.default(data, args, guild, locale); + case 'language': + return await LanguageModule.default(data, args, guild, locale); case 'enableserviceannouncement': return await ServiceAnnouncementModule.setEnableServiceAnnouncement(data, args, guild, locale); case 'serviceannouncementchannel':