Botanique/src/commands/misc/archive.ts

142 lines
4.5 KiB
TypeScript
Raw Normal View History

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"),
),
],
});
});
},
};