/* eslint-disable no-case-declarations */ /* eslint-disable indent */ // dotenv for handling environment variables const dotenv = require('dotenv'); dotenv.config(); const token = process.env.TOKEN; const statusChannelId = process.env.STATUS_CHANNEL_ID; // Discord.JS const { Client } = require('discord.js-selfbot-v13'); const client = new Client({ partials: [ 'CHANNEL', 'MESSAGE', ], }); const { MessageActionRow, MessageButton } = require('discord.js'); // Various imports const fn = require('./functions.js'); const config = require('./config.json'); const strings = require('./strings.json'); const { GifData, CommandData } = require('./CustomModules/NodBot.js'); const isDev = process.env.IS_DEV; client.once('ready', async () => { fn.collections.interactionStorage(client); fn.collections.slashCommands(client); fn.collections.dotCommands(client); fn.collections.setvalidCommands(client); fn.collections.roaches(client); await fn.download.gifs(client); await fn.download.pastas(client); await fn.download.joints(client); await fn.download.requests(client); await fn.download.strains(client); await fn.download.medicalAdvice(client); console.log('Ready!'); await fn.avWx.metar.getAllICAOs(); await fn.avWx.datis.getAllICAOs(); // console.log(JSON.stringify(icaoArray)); client.channels.fetch(statusChannelId).then(channel => { channel.send(`${new Date().toISOString()} -- <@${process.env.OWNER_ID}>\nStartup Sequence Complete`); }); }); // slash-commands client.on('interactionCreate', async interaction => { if (interaction.isCommand()) { if (isDev) { console.log('Interaction ID: ' + interaction.id); } const { commandName } = interaction; if (!client.iStorage.has(interaction.id)) { new InteractionStorage(interaction.id, interaction); } if (client.slashCommands.has(commandName)) { client.slashCommands.get(commandName).execute(interaction); } else { interaction.reply('Sorry, I don\'t have access to that command.'); console.error('Slash command attempted to run but not found: ' + commandName); } } if (interaction.isButton()) { if (isDev) console.log('Origin Interaction ID: ' + interaction.message.interaction.id); if (isDev) console.log('Button ID: ' + interaction.component.customId); // Get some meta info from strings const index = strings.temp.gifIndex; const limit = strings.temp.gifLimit; let newIndex; const buttonId = interaction.component.customId; switch (buttonId) { case 'prevGif': newIndex = index - 1; strings.temp.gifIndex = newIndex; // If we're leaving the last GIF, enable the Next GIF button if (index == limit) { // Re-Send Previous GIF button const prevButton = new MessageButton().setCustomId('prevGif').setLabel('Previous GIF').setStyle('SECONDARY'); // Re-Send Confirm GIF Button const confirmButton = new MessageButton().setCustomId('confirmGif').setLabel('Confirm').setStyle('PRIMARY'); // Enable Next GIF Button const nextButton = new MessageButton().setCustomId('nextGif').setLabel('Next GIF').setStyle('SECONDARY'); // Re-Send Cancel Button const cancelButton = new MessageButton().setCustomId('cancelGif').setLabel('Cancel').setStyle('DANGER'); // Put all the above into an ActionRow to be sent as a component of the reply const row = new MessageActionRow().addComponents(prevButton, confirmButton, nextButton, cancelButton); interaction.update({ content: strings.temp.gifs[newIndex].embed_url, components: [row] }); break; } // If we're going into the first GIF, disable the Previous GIF button if (newIndex == 0) { // Disable Previous GIF button const prevButton = new MessageButton().setCustomId('prevGif').setLabel('Previous GIF').setStyle('SECONDARY').setDisabled(); // Re-Send Confirm GIF Button const confirmButton = new MessageButton().setCustomId('confirmGif').setLabel('Confirm').setStyle('PRIMARY'); // Re-Send Next GIF Button const nextButton = new MessageButton().setCustomId('nextGif').setLabel('Next GIF').setStyle('SECONDARY'); // Re-Send Cancel Button const cancelButton = new MessageButton().setCustomId('cancelGif').setLabel('Canceled').setStyle('DANGER'); // Put all the above into an ActionRow to be sent as a component of the reply const row = new MessageActionRow().addComponents(prevButton, confirmButton, nextButton, cancelButton); interaction.update({ content: strings.temp.gifs[newIndex].embed_url, components: [row] }); break; } interaction.update(strings.temp.gifs[newIndex].embed_url); break; case 'confirmGif': // const gifData = { // name: strings.temp.gifName, // url: strings.temp.gifs[strings.temp.gifIndex].embed_url, // }; const gifData = new GifData().setInfo(strings.temp.gifName, strings.temp.gifs[strings.temp.gifIndex].embed_url); fn.upload.gif(gifData, client); interaction.update({ content: `I've saved the GIF as ${gifData.name}.gif`, components: [] }); fn.download.gifs(interaction.client); break; case 'nextGif': newIndex = index + 1; strings.temp.gifIndex = newIndex; // If we're leaving the first GIF, enable the Previous GIF button if (index == 0) { // Enable Previous GIF button const prevButton = new MessageButton().setCustomId('prevGif').setLabel('Previous GIF').setStyle('SECONDARY').setDisabled(false); // Re-Send Confirm GIF Button const confirmButton = new MessageButton().setCustomId('confirmGif').setLabel('Confirm').setStyle('PRIMARY'); // Re-Send Next GIF Button const nextButton = new MessageButton().setCustomId('nextGif').setLabel('Next GIF').setStyle('SECONDARY'); // Re-Send Cancel Button const cancelButton = new MessageButton().setCustomId('cancelGif').setLabel('Cancel').setStyle('DANGER'); // Put all the above into an ActionRow to be sent as a component of the reply const row = new MessageActionRow().addComponents(prevButton, confirmButton, nextButton, cancelButton); interaction.update({ content: strings.temp.gifs[newIndex].embed_url, components: [row] }); break; } // If we're going into the last GIF, disable the Next GIF button if (newIndex == strings.temp.gifLimit) { // Re-Send Previous GIF button const prevButton = new MessageButton().setCustomId('prevGif').setLabel('Previous GIF').setStyle('SECONDARY'); // Re-Send Confirm GIF Button const confirmButton = new MessageButton().setCustomId('confirmGif').setLabel('Confirm').setStyle('PRIMARY'); // Disable Next GIF Button const nextButton = new MessageButton().setCustomId('nextGif').setLabel('Next GIF').setStyle('SECONDARY').setDisabled(); // Re-Send Cancel Button const cancelButton = new MessageButton().setCustomId('cancelGif').setLabel('Canceled').setStyle('DANGER'); // Put all the above into an ActionRow to be sent as a component of the reply const row = new MessageActionRow().addComponents(prevButton, confirmButton, nextButton, cancelButton); interaction.update({ content: strings.temp.gifs[newIndex].embed_url, components: [row] }); break; } interaction.update(strings.temp.gifs[newIndex].embed_url); break; case 'cancelGif': // Previous GIF button const prevButton = new MessageButton().setCustomId('prevGif').setLabel('Previous GIF').setStyle('SECONDARY').setDisabled(); // Confirm GIF Button const confirmButton = new MessageButton().setCustomId('confirmGif').setLabel('Confirm').setStyle('PRIMARY').setDisabled(); // Next GIF Button const nextButton = new MessageButton().setCustomId('nextGif').setLabel('Next GIF').setStyle('SECONDARY').setDisabled(); // Cancel Button const cancelButton = new MessageButton().setCustomId('cancelGif').setLabel('Canceled').setStyle('DANGER'); // Put all the above into an ActionRow to be sent as a component of the reply const row = new MessageActionRow().addComponents(prevButton, confirmButton, nextButton, cancelButton); interaction.component.setDisabled(true); interaction.update({ content: 'Canceled.', components: [row] }); break; default: ButtonHandlers.baseEvent(interaction); break; } } // Handle autocomplete requests if (interaction.isAutocomplete()) { switch (interaction.commandName) { case 'strain': const searchString = interaction.options.getFocused(); const choices = fn.weed.strain.lookup(searchString, interaction.client); await interaction.respond( choices.map(choice => ({ name: choice, value: choice })) ); break; case "edit": //TODO switch (interaction.options.getSubcommand()) { case 'gif': const gifQuery = interaction.options.getFocused(); const gifChoices = fn.search.gifs(gifQuery, interaction.client); await interaction.respond( gifChoices.map(choice => ({ name: choice, value: choice })) ); break; case 'pasta': const pastaQuery = interaction.options.getFocused(); const pastaChoices = fn.search.pastas(pastaQuery, interaction.client); await interaction.respond( pastaChoices.map(choice => ({ name: choice, value: choice })) ); break; default: break; } break; default: break; } } }); // dot-commands client.on('messageCreate', message => { // Some basic checking to prevent running unnecessary code if (message.author.bot) return; if (message.author.id == client.user.id) return; // Automatic Responses, will respond if any message contains the keyword(s), excluding self-messages const lowerContent = message.content.toLowerCase(); const autoresponses = fn.autoresponses.checkForAll(lowerContent); autoresponses.forEach(e => { fn.autoresponses.send(message, e); }); // Break the message down into its components and analyze it const commandData = new CommandData(message).validate(message.client.dotCommands); console.log(commandData); if (commandData.isValid && commandData.isCommand) { try { client.dotCommands.get(commandData.command).execute(message, commandData); } catch (error) { console.error(error); message.reply('There was an error trying to execute that command.'); } } return; }); client.login(token);