From e380cb908a9adeececf3d9a6c0f965858987a827 Mon Sep 17 00:00:00 2001 From: loonatiny Date: Tue, 17 Jan 2023 14:28:59 +0100 Subject: [PATCH] feat: command archive (#55) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Checklist: - [x] Suivre les indications de `CONTRIBUTING.md` - [x] Référence aux tickets (par exemple `Closes #xyz`) Co-authored-by: FRANCOIS tanya Co-authored-by: Mylloon Co-authored-by: Anri Reviewed-on: https://git.kennel.ml/ConfrerieDuKassoulait/Botanique/pulls/55 --- src/commands/misc/archive.ts | 112 +++++++++++++++++++++++++++++++++ src/commands/misc/prep.ts | 117 +++++++++++++++++++++++++++++++++++ src/locales/fr.json | 23 +++++++ tsconfig.json | 4 +- 4 files changed, 255 insertions(+), 1 deletion(-) create mode 100644 src/commands/misc/archive.ts create mode 100644 src/commands/misc/prep.ts diff --git a/src/commands/misc/archive.ts b/src/commands/misc/archive.ts new file mode 100644 index 0000000..5830b45 --- /dev/null +++ b/src/commands/misc/archive.ts @@ -0,0 +1,112 @@ +import { SlashCommandBuilder } from '@discordjs/builders'; +import { ChannelType, Client, CommandInteraction, EmbedBuilder } from 'discord.js'; +import { getLocale, getLocalizations } from '../../utils/locales'; +import { getFilename } from '../../utils/misc'; +import '../../modules/string'; + +export default { + 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 desired_cat = 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 (!desired_cat) { + + // Sends a list of commands sorted into categories + return interaction.reply({ + embeds: [ + new EmbedBuilder() + .setColor('Blurple') + .setTitle(loc.get('c_archive1')) + .setDescription(loc.get('c_archive2')), + ], + }); + } + + // If a category is specified + const clean_cat = ['L1', 'L2', 'L3', 'M1', 'M2']; + const channel = clean_cat.includes(desired_cat); + if (!channel) { + // Category doesn't exist or is not included + return interaction.reply({ + content: `${loc.get('c_archive3')} \`${desired_cat}\``, + ephemeral: true, + }); + } + + // Send information about the command + const allChannel = interaction.guild?.channels.fetch(); + allChannel?.then(channel_guild => { + const cat_to_archive = channel_guild.filter(chan => chan.type == ChannelType.GuildCategory).filter(chan => chan.name == desired_cat); + const cat_to_archive_id = cat_to_archive.map(cat => cat.id); + const cat_to_archive_name = cat_to_archive.map(cat => cat.name); + + const cat_archived = channel_guild.filter(chan => chan.type == ChannelType.GuildCategory).filter(chan => chan.name == 'archive - ' + desired_cat); + const cat_archived_id = cat_archived.map(cat => cat.id); + const cat_archived_name = cat_archived.map(cat => cat.name); + + const all_channel_desired = channel_guild.filter(chan => chan.type == 0).filter(chan => chan.parentId == cat_to_archive_id[0]); + if (all_channel_desired.size == 0) { + return interaction.reply({ + embeds: [ + new EmbedBuilder() + .setColor('Blurple') + .setTitle(loc.get('c_archive6')) + .setDescription( + // Loads the description + // according to the user's locals + loc.get('c_archive7') + ), + ], + }); + } + const all_channel_desired_name = all_channel_desired.map(cg_d => cg_d.name); + console.log(all_channel_desired_name); + all_channel_desired.forEach(elem => + elem.setParent(cat_archived_id[0]) + ); + + const list_cg_moved = all_channel_desired_name.toString().replaceAll(',', '\n'); + return interaction.reply({ + embeds: [ + new EmbedBuilder() + .setColor('Blurple') + .setTitle(loc.get('c_archive4') + cat_to_archive_name + loc.get('c_archive5') + cat_archived_name + '`') + .setDescription( + // Loads the description + // according to the user's locals + list_cg_moved + ), + ], + }); + }); + }, +}; diff --git a/src/commands/misc/prep.ts b/src/commands/misc/prep.ts new file mode 100644 index 0000000..d924c77 --- /dev/null +++ b/src/commands/misc/prep.ts @@ -0,0 +1,117 @@ +import { SlashCommandBuilder } from '@discordjs/builders'; +import { ChannelType, Client, CommandInteraction, EmbedBuilder } from 'discord.js'; +import { getLocale, getLocalizations } from '../../utils/locales'; +import { getFilename } from '../../utils/misc'; +import '../../modules/string'; + +export default { + 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 desired_cat = 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 (!desired_cat) { + + // Sends a list of commands sorted into categories + return interaction.reply({ + embeds: [ + new EmbedBuilder() + .setColor('Blurple') + .setTitle(loc.get('c_prep1')) + .setDescription(loc.get('c_prep2')), + ], + }); + } + + // If a category is specified + const clean_cat = ['L1', 'L2', 'L3', 'M1', 'M2']; + const channel = clean_cat.includes(desired_cat); + if (!channel) { + // Category doesn't exist or is not included + return interaction.reply({ + content: `${loc.get('c_prep3')} \`${desired_cat}\``, + ephemeral: true, + }); + } + + // Send information about the command + const allChannel = interaction.guild?.channels.fetch(); + allChannel?.then(channel_guild => { + const cat_to_prep = channel_guild.filter(chan => chan.type == ChannelType.GuildCategory).filter(chan => chan.name == desired_cat); + const cat_to_prep_id = cat_to_prep.map(cat => cat.id); + const cat_to_prep_name = cat_to_prep.map(cat => cat.name); + + // console.log(cat_to_prep); + const all_channel_desired = channel_guild.filter(chan => chan.type == 0).filter(chan => chan.parentId == cat_to_prep_id[0]); + const all_channel_desired_name = all_channel_desired.map(c_d => c_d.name); + + let desc = ''; + + const general = 'général'; + if (all_channel_desired_name.filter(cdn => cdn == general).length == 0) { + interaction.guild?.channels.create({ + name: general, + type: 0, + parent: cat_to_prep_id[0], + }); + desc = general + loc.get('c_prep5') + '\n'; + } + + const info = 'informations'; + if (all_channel_desired_name.filter(cdn => cdn == info).length == 0) { + interaction.guild?.channels.create({ + name: info, + type: 0, + parent: cat_to_prep_id[0], + }); + + desc += info + loc.get('c_prep5') + '\n'; + } + + if (desc == '') { + desc = loc.get('c_prep6'); + } + + return interaction.reply({ + embeds: [ + new EmbedBuilder() + .setColor('Blurple') + .setTitle(loc.get('c_prep4') + cat_to_prep_name) + .setDescription( + // Loads the description + // according to the user's locals + desc, + ), + ], + }); + }); + }, +}; diff --git a/src/locales/fr.json b/src/locales/fr.json index 061291e..a4f6194 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -16,6 +16,29 @@ "c_help2": "`/help ` pour obtenir plus d'informations sur une commande.", "c_help3": "Impossible de trouver :", + "c_archive_name": "Nettoyer", + "c_archive_desc": "Nettoyage pour le passage à niveau", + "c_archive_opt1_name": "catégorie", + "c_archive_opt1_desc": "Nom de la catégorie à nettoyer", + "c_archive1": "Liste des catégories soumis au nettoyage", + "c_archive2": "`L1`, `L2`, `L3`, `M1`, `M2`", + "c_archive3": "Impossible de trouver/nettoyer le salon :", + "c_archive4": "Listes des Salons archivés de la catégorie `", + "c_archive5": "` vers `", + "c_archive6": "Nettoyage", + "c_archive7": "Catégorie déjà nettoyée", + + "c_prep_name": "Préparation", + "c_prep_desc": "Préparation des salons généraux pour la nouvelle année", + "c_prep_opt1_name": "année", + "c_prep_opt1_desc": "Nom de l'année à préparer'", + "c_prep1": "Liste des catégories soumis à la préparation", + "c_prep2": "`L1`, `L2`, `L3`, `M1`, `M2`", + "c_prep3": "Impossible de trouver/nettoyer le salon :", + "c_prep4": "Listes des Salons préparés `", + "c_prep5": "créé", + "c_prep6": "Pas besoin de préparation", + "u_time_at": "à", "c_reminder_name": "rappel", diff --git a/tsconfig.json b/tsconfig.json index cb551e2..5d0dfd6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,9 @@ /* Language and Environment */ "target": "es6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "lib": [ + "ES2021.String" + ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */