import { SlashCommandBuilder } from '@discordjs/builders'; import { ChannelType, Client, Colors, CommandInteraction, EmbedBuilder, NonThreadGuildBasedChannel } from 'discord.js'; import '../../modules/string'; import { getLocale, getLocalizations } from '../../utils/locales'; import { getFilename } from '../../utils/misc'; export default { scope: () => ['807244911350906920'], data: (client: Client) => { const filename = getFilename(__filename); return new SlashCommandBuilder() .setName( filename.toLowerCase()) .setDescription(client.locales.get(client.config.default_lang) ?.get(`c_${filename}_desc`) ?? '') .setNameLocalizations( getLocalizations(client, `c_${filename}_name`, true)) .setDescriptionLocalizations( getLocalizations(client, `c_${filename}_desc`)) // Command option .addStringOption(option => option .setName(client.locales.get(client.config.default_lang) ?.get(`c_${filename}_opt1_name`) ?? '') .setDescription(client.locales.get(client.config.default_lang) ?.get(`c_${filename}_opt1_desc`) ?? '') .setNameLocalizations( getLocalizations(client, `c_${filename}_opt1_name`, true)) .setDescriptionLocalizations( getLocalizations(client, `c_${filename}_opt1_desc`)) ); }, interaction: async (interaction: CommandInteraction, client: Client) => { const loc = getLocale(client, interaction.locale); const desiredCat = interaction.options.get(client .locales .get(client.config.default_lang) ?.get(`c_${getFilename(__filename)}_opt1_name`) ?? '')?.value as string; // If a category isn't specified if (!desiredCat) { // Sends a list of commands sorted into categories return interaction.reply({ embeds: [ new EmbedBuilder() .setColor(Colors.Blurple) .setTitle(loc.get('c_archive1')) .setDescription(loc.get('c_archive2')), ], }); } // If a category is specified const cleanCat = ['L1', 'L2', 'L3', 'M1', 'M2']; const channel = cleanCat.includes(desiredCat); if (!channel) { // Category doesn't exist or is not included return interaction.reply({ content: `${loc.get('c_archive3')} \`${desiredCat}\``, ephemeral: true, }); } const allChannel = interaction.guild?.channels.fetch(); allChannel?.then(async channelGuild => { // Retrieve category to archive const catToArchive = channelGuild .filter(chan => chan?.type == ChannelType.GuildCategory) .filter(chan => chan?.name == desiredCat); // Create/Retrieve the archive category const catArchivedName = 'archive - ' + desiredCat; const catArchivedMap = channelGuild .filter(chan => chan?.type == ChannelType.GuildCategory) .filter(chan => chan?.name == catArchivedName); let catArchived: NonThreadGuildBasedChannel | null | undefined; if (catArchivedMap.size > 0) { catArchived = catArchivedMap.at(0); } else { catArchived = await interaction.guild?.channels .create({ name: catArchivedName, type: ChannelType.GuildCategory }); } const allChannelDesired = channelGuild .filter(chan => chan?.type == 0) .filter(chan => chan?.parentId == catToArchive.map(cat => cat?.id)[0]); // If no channels in the source category if (allChannelDesired.size == 0) { return interaction.reply({ embeds: [ new EmbedBuilder() .setColor(Colors.Blurple) .setTitle(loc.get('c_archive6')) .setDescription( loc.get('c_archive7') ), ], }); } // Move channels to the archived categoryx allChannelDesired.forEach(elem => elem?.setParent(catArchived?.id as string)); return interaction.reply({ embeds: [ new EmbedBuilder() .setColor(Colors.Blurple) .setTitle(loc.get('c_archive4') + ' `' + catToArchive.map(cat => cat?.name) + '` ' + loc.get('c_archive5') + ' `' + catArchivedName + '`') .setDescription( allChannelDesired .map(cgD => cgD?.name).toString().replaceAll(',', '\n') ), ], }); }); }, };