147 lines
5.3 KiB
JavaScript
147 lines
5.3 KiB
JavaScript
const { SlashCommandBuilder, ActionRowBuilder, ChannelSelectMenuBuilder, StringSelectMenuBuilder, ModalBuilder, TextInputBuilder, TextInputStyle, ComponentType } = require('discord.js');
|
|
const api = require('../api');
|
|
const { readDb, writeDb } = require('../../backend/db.js');
|
|
|
|
const defaultLeaveMessages = ["{user} has left the server.", "Goodbye, {user}.", "We'll miss you, {user}."];
|
|
|
|
module.exports = {
|
|
name: 'setup-leave',
|
|
description: 'Interactively set up the leave message for this server.',
|
|
enabled: true,
|
|
builder: new SlashCommandBuilder()
|
|
.setName('setup-leave')
|
|
.setDescription('Interactively set up the leave message for this server.'),
|
|
async execute(interaction) {
|
|
const db = readDb();
|
|
const guildId = interaction.guildId;
|
|
|
|
if (!db[guildId]) {
|
|
db[guildId] = {};
|
|
}
|
|
|
|
const channelSelect = new ChannelSelectMenuBuilder()
|
|
.setCustomId('leave_channel_select')
|
|
.setPlaceholder('Select the channel for leave messages.')
|
|
.setChannelTypes([0]); // Text channels
|
|
|
|
const row1 = new ActionRowBuilder().addComponents(channelSelect);
|
|
|
|
const channelReply = await interaction.reply({
|
|
content: 'Please select the channel where you want leave messages to be sent.',
|
|
components: [row1],
|
|
flags: 64,
|
|
});
|
|
|
|
try {
|
|
const channelConfirmation = await channelReply.awaitMessageComponent({
|
|
componentType: ComponentType.ChannelSelect,
|
|
time: 60000,
|
|
});
|
|
|
|
const channelId = channelConfirmation.values[0];
|
|
try {
|
|
const existing = (await api.getServerSettings(guildId)) || {};
|
|
existing.leaveEnabled = true;
|
|
existing.leaveChannel = channelId;
|
|
await api.upsertServerSettings(guildId, existing);
|
|
} catch (e) {
|
|
console.error('Error persisting leave settings to backend, falling back to local:', e);
|
|
const db = readDb();
|
|
if (!db[guildId]) db[guildId] = {};
|
|
db[guildId].leaveChannel = channelId;
|
|
db[guildId].leaveEnabled = true;
|
|
writeDb(db);
|
|
}
|
|
|
|
const messageOptions = defaultLeaveMessages.map(msg => ({
|
|
label: msg.length > 100 ? msg.substring(0, 97) + '...' : msg,
|
|
value: msg,
|
|
}));
|
|
|
|
messageOptions.push({
|
|
label: 'Custom Message',
|
|
value: 'custom',
|
|
});
|
|
|
|
const messageSelect = new StringSelectMenuBuilder()
|
|
.setCustomId('leave_message_select')
|
|
.setPlaceholder('Select a leave message or create your own.')
|
|
.addOptions(messageOptions);
|
|
|
|
const row2 = new ActionRowBuilder().addComponents(messageSelect);
|
|
|
|
await channelConfirmation.update({
|
|
content: `Channel <#${channelId}> selected. Now, please select a leave message.`,
|
|
components: [row2],
|
|
});
|
|
|
|
const messageConfirmation = await channelReply.awaitMessageComponent({
|
|
componentType: ComponentType.StringSelect,
|
|
time: 60000,
|
|
});
|
|
|
|
const selectedMessage = messageConfirmation.values[0];
|
|
|
|
if (selectedMessage === 'custom') {
|
|
const modal = new ModalBuilder()
|
|
.setCustomId('leave_custom_message_modal')
|
|
.setTitle('Custom Leave Message');
|
|
|
|
const messageInput = new TextInputBuilder()
|
|
.setCustomId('custom_message_input')
|
|
.setLabel("Your custom message")
|
|
.setPlaceholder('Use {user} for username and {server} for server name.')
|
|
.setStyle(TextInputStyle.Paragraph)
|
|
.setRequired(true);
|
|
|
|
const firstActionRow = new ActionRowBuilder().addComponents(messageInput);
|
|
modal.addComponents(firstActionRow);
|
|
|
|
await messageConfirmation.showModal(modal);
|
|
|
|
const modalSubmit = await interaction.awaitModalSubmit({
|
|
time: 300000,
|
|
});
|
|
|
|
const customMessage = modalSubmit.fields.getTextInputValue('custom_message_input');
|
|
try {
|
|
const existing = (await api.getServerSettings(guildId)) || {};
|
|
existing.leaveMessage = customMessage;
|
|
await api.upsertServerSettings(guildId, existing);
|
|
} catch (e) {
|
|
console.error('Error persisting leave message to backend, falling back to local:', e);
|
|
const db = readDb();
|
|
if (!db[guildId]) db[guildId] = {};
|
|
db[guildId].leaveMessage = customMessage;
|
|
writeDb(db);
|
|
}
|
|
|
|
await modalSubmit.reply({
|
|
content: `Leave message setup complete! Channel: <#${channelId}>, Message: "${customMessage}"`,
|
|
flags: 64,
|
|
});
|
|
|
|
} else {
|
|
try {
|
|
const existing = (await api.getServerSettings(guildId)) || {};
|
|
existing.leaveMessage = selectedMessage;
|
|
await api.upsertServerSettings(guildId, existing);
|
|
} catch (e) {
|
|
console.error('Error persisting leave message to backend, falling back to local:', e);
|
|
const db = readDb();
|
|
if (!db[guildId]) db[guildId] = {};
|
|
db[guildId].leaveMessage = selectedMessage;
|
|
writeDb(db);
|
|
}
|
|
await messageConfirmation.update({
|
|
content: `Leave message setup complete! Channel: <#${channelId}>, Message: "${selectedMessage}"`,
|
|
components: [],
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Error during leave setup:', error);
|
|
await interaction.editReply({ content: 'Configuration timed out or an error occurred.', components: [] });
|
|
}
|
|
},
|
|
};
|