205 lines
9.5 KiB
JavaScript
Executable File
205 lines
9.5 KiB
JavaScript
Executable File
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
|
|
const { GuildInfo } = require('../modules/CustomClasses.js');
|
|
const dbfn = require('../modules/dbfn.js');
|
|
const fn = require('../modules/functions.js');
|
|
const strings = require('../data/strings.json');
|
|
|
|
module.exports = {
|
|
data: new SlashCommandBuilder()
|
|
.setName('relay')
|
|
.setDescription('A notification relay for improved water and fruit notifications')
|
|
.addSubcommand(sc =>
|
|
sc.setName('set')
|
|
.setDescription('Set up the notification relay for the first time')
|
|
.addChannelOption(o =>
|
|
o.setName('watchchannel')
|
|
.setDescription('The channel Grow A Tree sends your notifications in')
|
|
.setRequired(true)
|
|
)
|
|
.addStringOption(o =>
|
|
o.setName('watermessage')
|
|
.setDescription('Message to send for water reminders')
|
|
.setRequired(true)
|
|
)
|
|
.addChannelOption(o =>
|
|
o.setName('pingchannel')
|
|
.setDescription('The channel to send the water reminder in')
|
|
.setRequired(true)
|
|
)
|
|
.addStringOption(o =>
|
|
o.setName('fruitmessage')
|
|
.setDescription("Message to send for fruit reminders")
|
|
.setRequired(false)
|
|
)
|
|
)
|
|
.addSubcommand(sc =>
|
|
sc.setName('update')
|
|
.setDescription('Update an already setup notification relay')
|
|
.addChannelOption(o =>
|
|
o.setName('watchchannel')
|
|
.setDescription('The channel Grow A Tree sends your notifications in')
|
|
.setRequired(false)
|
|
)
|
|
.addStringOption(o =>
|
|
o.setName('watermessage')
|
|
.setDescription('Message to send for water reminders')
|
|
.setRequired(false)
|
|
)
|
|
.addChannelOption(o =>
|
|
o.setName('pingchannel')
|
|
.setDescription('The channel to send the water reminder in')
|
|
.setRequired(false)
|
|
)
|
|
.addStringOption(o =>
|
|
o.setName('fruitmessage')
|
|
.setDescription("Message to send for fruit reminders")
|
|
.setRequired(false)
|
|
)
|
|
.addBooleanOption(o =>
|
|
o.setName('enabled')
|
|
.setDescription("Enable the relay?")
|
|
.setRequired(false)
|
|
)
|
|
)
|
|
.addSubcommand(sc =>
|
|
sc.setName('disable')
|
|
.setDescription('Disable the notification relay')
|
|
)
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles),
|
|
async execute(interaction) {
|
|
try {
|
|
await interaction.deferReply({ ephemeral: true });
|
|
const subcommand = interaction.options.getSubcommand();
|
|
// if (process.env.DEBUG) console.log(`${typeof subcommand}: ${subcommand}`);
|
|
switch (subcommand) {
|
|
// Set all components for the first time
|
|
case "set":
|
|
// If there is already a guildInfo object for this server
|
|
if (interaction.client.guildInfos.has(interaction.guildId)) {
|
|
let guildInfo = interaction.client.guildInfos.get(interaction.guildId);
|
|
// Get options from the interaction
|
|
const watchChannel = interaction.options.getChannel('watchchannel');
|
|
const waterMessage = interaction.options.getString('watermessage');
|
|
// If the fruit message is set, use it, otherwise default to the water message.
|
|
const fruitMessage = interaction.options.getString('fruitmessage') ? interaction.options.getString('fruitmessage') : interaction.options.getString('watermessage');
|
|
const reminderChannel = interaction.options.getChannel('pingchannel');
|
|
// Set the reminder configuration in the GuildInfo object
|
|
guildInfo.setReminders(waterMessage, fruitMessage, reminderChannel.id, watchChannel.id, true);
|
|
// Update the guildInfos Collection
|
|
interaction.client.guildInfos.set(interaction.guildId, guildInfo);
|
|
// Build a query to update the database
|
|
let query = guildInfo.queryBuilder("setReminders");
|
|
// Run the query
|
|
await dbfn.setGuildInfo(query);
|
|
// Set up a collector on the watch channel
|
|
fn.collectors.create(interaction.client, guildInfo);
|
|
// Compose a reply
|
|
const reply = [
|
|
`I'll watch <#${watchChannel.id}> for Grow A Tree Notifications and relay them to <#${reminderChannel.id}>.`,
|
|
`Water Message: ${waterMessage}`,
|
|
`Fruit Message: ${fruitMessage}`
|
|
].join("\n");
|
|
// Send the reply
|
|
await interaction.editReply(fn.builders.embed(reply)).catch(e => console.error(e));
|
|
} else {
|
|
// Get options from the interaction
|
|
const watchChannel = interaction.options.getChannel('watchchannel');
|
|
const waterMessage = interaction.options.getString('watermessage');
|
|
// If the fruit message is set, use it. Otherwise default to the water message
|
|
const fruitMessage = interaction.options.getString('fruitmessage') ? interaction.options.getString('fruitmessage') : interaction.options.getString('watermessage');
|
|
const reminderChannel = interaction.options.getChannel('pingchannel');
|
|
// Create a new GuildInfo object
|
|
let guildInfo = new GuildInfo()
|
|
.setIds(interaction.guildId, interaction.guild.ownerId)
|
|
// Set the reminder configuration
|
|
.setReminders(waterMessage, fruitMessage, reminderChannel.id, watchChannel.id, true);
|
|
// Update the guildInfos Collection
|
|
interaction.client.guildInfos.set(interaction.guildId, guildInfo);
|
|
// Build a query to update the database
|
|
let query = guildInfo.queryBuilder("setReminders");
|
|
// Run the query
|
|
await dbfn.setGuildInfo(query);
|
|
// Refresh the collection
|
|
await fn.collectionBuilders.guildInfos(interaction.client);
|
|
// Create a messageCollector on the watch channel
|
|
fn.collectors.create(interaction.client, guildInfo);
|
|
// Compose a reply
|
|
const reply = [
|
|
`I'll watch <#${watchChannel.id}> for Grow A Tree Notifications and relay them to <#${reminderChannel.id}>.`,
|
|
`Water Message: ${waterMessage}`,
|
|
`Fruit Message: ${fruitMessage}`
|
|
].join("\n");
|
|
// Send the reply
|
|
await interaction.editReply(reply).catch(e => console.error(e));
|
|
}
|
|
break;
|
|
case "update": // Update the relay configuration piecemeal
|
|
if (interaction.client.guildInfos.has(interaction.guildId)) {
|
|
let guildInfo = interaction.client.guildInfos.get(interaction.guildId);
|
|
|
|
// Get all possible options from the interaction
|
|
const inWatchChannel = interaction.options.getChannel('watchchannel');
|
|
const inWaterMessage = interaction.options.getString('watermessage');
|
|
const inFruitMessage = interaction.options.getString('fruitmessage');
|
|
const inReminderChannel = interaction.options.getChannel('pingchannel');
|
|
const inEnabled = interaction.options.getBoolean('enabled');
|
|
|
|
// Check if each option is set, if it is, use it. Otherwise use what was already set
|
|
const outWatchChannelId = inWatchChannel ? inWatchChannel.id : guildInfo.watchChannelId;
|
|
const outWaterMessage = inWaterMessage ? inWaterMessage : guildInfo.waterMessage;
|
|
const outFruitMessage = inFruitMessage ? inFruitMessage : guildInfo.fruitMessage;
|
|
const outReminderChannelId = inReminderChannel ? inReminderChannel.id : guildInfo.reminderChannelId;
|
|
const outEnabled = inEnabled === undefined ? guildInfo.notificationsEnabled : inEnabled;
|
|
|
|
// Update the relay configuration
|
|
guildInfo.setReminders(outWaterMessage, outFruitMessage, outReminderChannelId, outWatchChannelId, outEnabled);
|
|
// Update the guildInfos Collection
|
|
interaction.client.guildInfos.set(interaction.guildId, guildInfo);
|
|
// Build a query to update the database
|
|
let query = guildInfo.queryBuilder("setReminders");
|
|
// Run the query
|
|
await dbfn.setGuildInfo(query);
|
|
// Refresh the collection
|
|
await fn.collectionBuilders.guildInfos(interaction.client);
|
|
// Create a messageCollector on the watch channel
|
|
fn.collectors.create(interaction.client, guildInfo);
|
|
// Compose a reply
|
|
const reply = [
|
|
`I'll watch <#${outWatchChannelId}> for Grow A Tree Notifications and relay them to <#${outReminderChannelId}>.`,
|
|
`Water Message: ${outWaterMessage}`,
|
|
`Fruit Message: ${outFruitMessage}`
|
|
].join("\n");
|
|
// Send the reply
|
|
await interaction.editReply(reply).catch(e => console.error(e));
|
|
} else {
|
|
await interaction.editReply(fn.builders.errorEmbed("There is no existing notification relay to update!")).catch(e => console.error(e));
|
|
}
|
|
break;
|
|
case 'disable': // Disable the relay
|
|
if (interaction.client.guildInfos.has(interaction.guildId)) {
|
|
let guildInfo = interaction.client.guildInfos.get(interaction.guildId);
|
|
// Update the relay config with all undefined except for `enabled` which is false
|
|
guildInfo.setReminders(undefined, undefined, undefined, undefined, false);
|
|
// Update the guildInfos Collection
|
|
interaction.client.guildInfos.set(interaction.guildId, guildInfo);
|
|
// Update the database
|
|
await dbfn.setGuildInfo(guildInfo.queryBuilder("setReminders")).catch(e => console.error(e));
|
|
// Refresh the collection
|
|
await fn.collectionBuilders.guildInfos(interaction.client);
|
|
// Close the collector
|
|
await fn.collectors.end(interaction.client, guildInfo).catch(e => console.error(e));
|
|
// Reply confirming disabling of relay
|
|
await interaction.editReply(fn.builders.embed(strings.status.optout)).catch(e => console.error(e));
|
|
} else {
|
|
await interaction.editReply(fn.builders.errorEmbed("A notification relay has not been set up yet!")).catch(e => console.error(e));
|
|
}
|
|
break;
|
|
default:
|
|
await interaction.editReply(fn.builders.errorEmbed("Invalid subcommand detected.")).catch(e => console.error(e));
|
|
break;
|
|
}
|
|
} catch (err) {
|
|
console.error("Error occurred while setting up a notification relay: " + err);
|
|
}
|
|
},
|
|
}; |