Files
ECS-FullStack/discord-bot/commands/setup-autorole.js

68 lines
2.5 KiB
JavaScript

const { SlashCommandBuilder, ActionRowBuilder, RoleSelectMenuBuilder, ComponentType } = require('discord.js');
const { readDb, writeDb } = require('../../backend/db.js');
module.exports = {
name: 'setup-autorole',
description: 'Interactively set up the autorole for this server.',
enabled: true,
builder: new SlashCommandBuilder()
.setName('setup-autorole')
.setDescription('Interactively set up the autorole for this server.'),
async execute(interaction) {
const guildId = interaction.guildId;
const roleSelect = new RoleSelectMenuBuilder()
.setCustomId('autorole_role_select')
.setPlaceholder('Select the role to assign on join.');
const row = new ActionRowBuilder().addComponents(roleSelect);
const roleReply = await interaction.reply({
content: 'Please select the role you want to automatically assign to new members.',
components: [row],
flags: 64,
});
try {
const roleConfirmation = await roleReply.awaitMessageComponent({
componentType: ComponentType.RoleSelect,
time: 60000,
});
const roleId = roleConfirmation.values[0];
const role = interaction.guild.roles.cache.get(roleId);
if (role.managed || role.position >= interaction.guild.members.me.roles.highest.position) {
await roleConfirmation.update({
content: `I cannot assign the role **${role.name}** because it is managed by an integration or is higher than my highest role. Please select another role.`,
components: [],
});
return;
}
// persist to backend
try {
const api = require('../api');
const existing = await api.getServerSettings(guildId) || {};
existing.autorole = { enabled: true, roleId };
await api.upsertServerSettings(guildId, existing);
} catch (e) {
console.error('Error persisting autorole to backend, falling back to local:', e);
const { readDb, writeDb } = require('../../backend/db.js');
const db = readDb();
if (!db[guildId]) db[guildId] = {};
db[guildId].autorole = { enabled: true, roleId };
writeDb(db);
}
await roleConfirmation.update({
content: `Autorole setup complete! New members will be assigned the **${role.name}** role.`,
components: [],
});
} catch (error) {
console.error('Error during autorole setup:', error);
await interaction.editReply({ content: 'Configuration timed out or an error occurred.', components: [] });
}
},
};