Level 0: Every user - Public commands Level 1: Guild owners or members with respective admin role - Elevated guild commands Level 2: Global admins - Every command including levels below
61 lines
2.8 KiB
JavaScript
61 lines
2.8 KiB
JavaScript
const { SlashCommandBuilder, ComponentType, ActionRowBuilder, ButtonBuilder, ButtonStyle, SelectMenuBuilder } = require("discord.js");
|
|
const { GeneralUtils, GuildUtils } = require("../util");
|
|
|
|
module.exports = {
|
|
data: new SlashCommandBuilder()
|
|
.setName("settings")
|
|
.setDescription("Change Guild Settings"),
|
|
permissionLevel: 1,
|
|
|
|
async execute(interaction) {
|
|
let reply = "Guild settings:\n";
|
|
const row = new ActionRowBuilder();
|
|
row.addComponents(
|
|
new ButtonBuilder()
|
|
.setCustomId(`set-admin-role`)
|
|
.setLabel('Set Admin Role')
|
|
.setStyle(ButtonStyle.Primary)
|
|
);
|
|
const message = await interaction.reply({ content: reply, components: [row], fetchReply: true });
|
|
|
|
const filter = (m) => m.author.id === message.author.id;
|
|
const collector = message.createMessageComponentCollector(filter, { componentType: ComponentType.Button, time: 120000 });
|
|
|
|
//BUGBUG: end callback does not trigger
|
|
collector.on('end', collected => {
|
|
console.log(`Collected ${collected.size} interactions.`);
|
|
message.edit({ components: [] });
|
|
});
|
|
|
|
collector.on('collect', async m => {
|
|
switch (m.customId) {
|
|
case 'set-admin-role':
|
|
//Build select menu with every role in the guild
|
|
const row = new ActionRowBuilder()
|
|
.addComponents(
|
|
new SelectMenuBuilder()
|
|
.setCustomId('select')
|
|
.setPlaceholder('Nothing selected')
|
|
.addOptions(
|
|
m.guild.roles.cache.map(role => ({
|
|
label: role.name,
|
|
description: role.id,
|
|
value: role.id
|
|
}))
|
|
),
|
|
);
|
|
const message = await m.reply({ content: 'Select a role', components: [row], fetchReply: true });
|
|
|
|
const filter = (m) => m.author.id === message.author.id;
|
|
const replyCollector = message.createMessageComponentCollector(filter, { componentType: ComponentType.SelectMenu, time: 25000 });
|
|
replyCollector.on('collect', async r => {
|
|
const role = m.guild.roles.cache.find(role => role.id === r.values[0]);
|
|
m.deleteReply(); //Delete select menu message
|
|
GuildUtils.setProperty(m.guild.id, 'adminRoleId', role.id);
|
|
r.reply({ content: `Selected role: ${role.name} \n(${role.id})`, components: [] });
|
|
});
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
} |