mirror of
https://github.com/JonnyBro/JaBa.git
synced 2024-11-30 09:04:58 +05:00
147 lines
No EOL
4.8 KiB
JavaScript
147 lines
No EOL
4.8 KiB
JavaScript
const { SlashCommandBuilder, PermissionFlagsBits, ActionRowBuilder, StringSelectMenuBuilder } = require("discord.js");
|
|
const BaseCommand = require("../../base/BaseCommand");
|
|
|
|
class Selectroles extends BaseCommand {
|
|
/**
|
|
*
|
|
* @param {import("../../base/JaBa")} client
|
|
*/
|
|
constructor(client) {
|
|
super({
|
|
command: new SlashCommandBuilder()
|
|
.setName("selectroles")
|
|
.setDescription(client.translate("administration/selectroles:DESCRIPTION"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("administration/selectroles:DESCRIPTION", null, "uk-UA") })
|
|
.setDMPermission(false)
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator)
|
|
.addSubcommand(subcommand => subcommand.setName("message")
|
|
.setDescription(client.translate("administration/selectroles:MESSAGE"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("administration/selectroles:MESSAGE", null, "uk-UA") })
|
|
.addStringOption(option => option.setName("text")
|
|
.setDescription(client.translate("common:MESSAGE"))
|
|
.setRequired(true)),
|
|
)
|
|
.addSubcommand(subcommand => subcommand.setName("addrole")
|
|
.setDescription(client.translate("administration/selectroles:ADDROLE"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("administration/selectroles:ADDROLE", null, "uk-UA") })
|
|
.addChannelOption(option => option.setName("channel")
|
|
.setDescription(client.translate("common:CHANNEL"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("common:CHANNEL", null, "uk-UA") })
|
|
.setRequired(true))
|
|
.addStringOption(option => option.setName("message_id")
|
|
.setDescription(client.translate("common:MESSAGE_ID"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("common:MESSAGE_ID", null, "uk-UA") })
|
|
.setRequired(true))
|
|
.addRoleOption(option => option.setName("role")
|
|
.setDescription(client.translate("common:ROLE"))
|
|
.setDescriptionLocalizations({ "uk": client.translate("common:ROLE", null, "uk-UA") })
|
|
.setRequired(true)),
|
|
),
|
|
aliases: [],
|
|
dirname: __dirname,
|
|
ownerOnly: false,
|
|
});
|
|
}
|
|
/**
|
|
*
|
|
* @param {import("../../base/JaBa")} client
|
|
*/
|
|
async onLoad(client) {
|
|
client.on("interactionCreate", async interaction => {
|
|
if (!interaction.isStringSelectMenu()) return;
|
|
|
|
if (interaction.customId === "auto_roles") {
|
|
const removed = interaction.component.options.filter(option => {
|
|
return !interaction.values.includes(option.value);
|
|
});
|
|
|
|
for (const id of removed) {
|
|
await interaction.member.roles.remove(id.value);
|
|
}
|
|
|
|
for (const id of interaction.values) {
|
|
await interaction.member.roles.add(id);
|
|
}
|
|
|
|
interaction.reply({
|
|
content: interaction.translate("administration/selectroles:ROLES_UPDATED"),
|
|
ephemeral: true,
|
|
});
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
*
|
|
* @param {import("../../base/JaBa")} client
|
|
* @param {import("discord.js").ChatInputCommandInteraction} interaction
|
|
* @param {Object} data
|
|
*/
|
|
async execute(client, interaction) {
|
|
await interaction.deferReply({ ephemeral: true });
|
|
|
|
const command = interaction.options.getSubcommand();
|
|
|
|
if (command === "message") {
|
|
const text = interaction.options.getString("text");
|
|
|
|
interaction.channel.send(text).then(message => {
|
|
interaction.success("administration/selectroles:MESSAGE_SENT", {
|
|
channel: interaction.channel.toString(),
|
|
message_id: message.id,
|
|
}, { edit: true });
|
|
});
|
|
} else if (command === "addrole") {
|
|
const channel = interaction.options.getChannel("channel"),
|
|
message_id = interaction.options.getString("message_id"),
|
|
message = await channel.messages.fetch(message_id);
|
|
|
|
if (!message || message.author.id !== client.user.id) return interaction.error("administration/selectroles:MESSAGE_ROLE", null, { edit: true });
|
|
const role = interaction.options.getRole("role");
|
|
|
|
let row = message.components[0];
|
|
if (!row) row = new ActionRowBuilder();
|
|
|
|
const option = [{
|
|
label: role.name,
|
|
value: role.id,
|
|
}];
|
|
|
|
const menu = row.components[0];
|
|
if (menu) {
|
|
for (const o of menu.options) {
|
|
if (o.value === option[0].value) return interaction.error("administration/selectroles:ALREADY_IN_MENU");
|
|
}
|
|
|
|
row = ActionRowBuilder.from(row)
|
|
.setComponents(
|
|
StringSelectMenuBuilder.from(menu)
|
|
.setMinValues(0)
|
|
.setMaxValues(menu.options.length + 1)
|
|
.addOptions(option),
|
|
);
|
|
} else {
|
|
row.addComponents(
|
|
new StringSelectMenuBuilder()
|
|
.setCustomId("auto_roles")
|
|
.setMinValues(0)
|
|
.setMaxValues(1)
|
|
.setPlaceholder(interaction.translate("common:AVAILABLE_OPTIONS"))
|
|
.addOptions(option),
|
|
);
|
|
}
|
|
|
|
message.edit({
|
|
components: [row],
|
|
});
|
|
|
|
interaction.followUp({
|
|
content: interaction.translate("administration/selectroles:SUCCESS_ADDED", {
|
|
role: role.name,
|
|
}),
|
|
ephemeral: true,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = Selectroles; |