diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 5ee765a..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,12 +0,0 @@ -## Changes - -v3.0.1 - Migrate TenorJS API Endpoint -v3.0.2 - Add medical advice commands -v3.0.3 - Fix broken `/requests` command -v3.0.4 - Add ability to use multiple aliases -v3.0.5 - Add ability to save strains -v3.0.6 - Move `.strain` to `/strain` and add Autocomplete -v3.0.7 - Add `.spongebob` replies -v3.0.8 - Add ability to open requests by pages - -v3.1.0 - Migrate to Discord.js Version 14 \ No newline at end of file diff --git a/dot-commands/setmessage.js b/dot-commands/setmessage.js new file mode 100644 index 0000000..25a074e --- /dev/null +++ b/dot-commands/setmessage.js @@ -0,0 +1,25 @@ +const fn = require('../functions.js'); +const config = require('../config.json'); + +module.exports = { + name: 'setmessage', + alias: 'sm', + description: 'Set the message to be used for rank analysis', + usage: 'Reply to the Tree Ranking message with .setmessage', + execute(message, commandData) { + if (message.reference != undefined) { + const repliedMessageId = message.reference.messageId; + message.channel.messages.fetch(repliedMessageId) + .then(repliedMessage => { + console.log(repliedMessage.embeds[0].data.description); + message.reply('ID: ' + repliedMessage.id); + }) + .catch(err => { + console.error(err); + message.reply('There was a problem fetching the message.'); + }); + } else { + message.reply('You must reply to the message'); + } + } +} \ No newline at end of file diff --git a/dot-commands/spongebob.js b/dot-commands/spongebob.js deleted file mode 100644 index 692bd83..0000000 --- a/dot-commands/spongebob.js +++ /dev/null @@ -1,30 +0,0 @@ -const fn = require('../functions.js'); -const config = require('../config.json'); - -module.exports = { - name: 'spongebob', - alias: 'sb', - description: 'SpOnGeBoB-iFy AnYtHiNg AuToMaTiCaLly', - usage: '.spongebob', - execute(message, commandData) { - // message.reply(fn.spongebob(commandData)).then(() => { - // message.delete(); - // }); - if (message.reference != undefined) { - const repliedMessageId = message.reference.messageId; - message.channel.messages.fetch(repliedMessageId) - .then(repliedMessage => { - repliedMessage.reply(fn.spongebob({ args: repliedMessage.content })).then(() => { - message.delete(); - }); - }) - .catch(err => { - console.error(err); - }); - } else { - message.channel.send(fn.spongebob(commandData)).then(() => { - message.delete(); - }); - } - } -} \ No newline at end of file diff --git a/functions.js b/functions.js index 025c020..92cb3e6 100644 --- a/functions.js +++ b/functions.js @@ -2,14 +2,7 @@ // dotenv for handling environment variables const dotenv = require('dotenv'); dotenv.config(); -// Assignment of environment variables for database access -const dbHost = process.env.dbHost; -const dbUser = process.env.dbUser; -const dbName = process.env.dbName; -const dbPass = process.env.dbPass; -const dbPort = process.env.dbPort; const isDev = process.env.isDev; - const ownerId = process.env.ownerId; // filesystem @@ -18,26 +11,12 @@ const fs = require('fs'); // Discord.js const Discord = require('discord.js'); -// Fuzzy text matching for db lookups -const FuzzySearch = require('fuzzy-search'); - // Various imports from other files const config = require('./config.json'); const strings = require('./strings.json'); const slashCommandFiles = fs.readdirSync('./slash-commands/').filter(file => file.endsWith('.js')); const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.endsWith('.js')); -// MySQL database connection -const mysql = require('mysql'); -const db = new mysql.createPool({ - connectionLimit: 10, - host: dbHost, - user: dbUser, - password: dbPass, - database: dbName, - port: dbPort, -}); - const functions = { // Functions for managing and creating Collections collections: { @@ -82,83 +61,6 @@ const functions = { } if (isDev) console.log('Dot Commands Collection Built'); }, - gifs(rows, client) { - if (!client.gifs) client.gifs = new Discord.Collection(); - client.gifs.clear(); - for (const row of rows) { - const gif = { - id: row.id, - name: row.name, - embed_url: row.embed_url - }; - client.gifs.set(gif.name, gif); - } - if (isDev) console.log('GIFs Collection Built'); - }, - joints(rows, client) { - if (!client.joints) client.joints = new Discord.Collection(); - client.joints.clear(); - for (const row of rows) { - const joint = { - id: row.id, - content: row.content - }; - client.joints.set(joint.id, joint); - } - if (isDev) console.log('Joints Collection Built'); - }, - pastas(rows, client) { - if (!client.pastas) client.pastas = new Discord.Collection(); - client.pastas.clear(); - for (const row of rows) { - const pasta = { - id: row.id, - name: row.name, - content: row.content, - iconUrl: row.iconurl, - }; - client.pastas.set(pasta.name, pasta); - } - if (isDev) console.log('Pastas Collection Built'); - }, - requests(rows, client) { - if (!client.requests) client.requests = new Discord.Collection(); - client.requests.clear(); - for (const row of rows) { - const request = { - id: row.id, - author: row.author, - request: row.request, - }; - client.requests.set(request.id, request); - } - if (isDev) console.log('Requests Collection Built'); - }, - strains(rows, client) { - if (!client.strains) client.strains = new Discord.Collection(); - client.strains.clear(); - for (const row of rows) { - const strain = { - id: row.id, - name: row.strain, - }; - client.strains.set(strain.name, strain); - // if (isDev) console.log(strain) - } - if (isDev) console.log('Strains Collection Built'); - }, - medicalAdvice(rows, client) { - if (!client.medicalAdviceCol) client.medicalAdviceColl = new Discord.Collection(); - client.medicalAdviceColl.clear(); - for (const row of rows) { - const medicalAdvice = { - id: row.id, - content: row.content - }; - client.medicalAdviceColl.set(medicalAdvice.id, medicalAdvice); - } - if (isDev) console.log('Medical Advice Collection Built'); - }, }, dot: { getCommandData(message) { @@ -250,53 +152,6 @@ const functions = { helpEmbed ], ephemeral: true }; }, - gif(commandData) { - return { embeds: [new Discord.MessageEmbed() - .setAuthor(`${commandData.args}.${commandData.command}`) - .setImage(commandData.embed_url) - .setTimestamp() - .setFooter(commandData.author)]}; - }, - pasta(commandData) { - return { embeds: [ new Discord.MessageEmbed() - .setAuthor(`${commandData.args}.${commandData.command}`) - .setDescription(commandData.content) - .setThumbnail(commandData.iconUrl) - .setTimestamp() - .setFooter(commandData.author)]}; - }, - pastas(commandData) { - const pastasArray = []; - const pastasEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) - .setTimestamp() - .setFooter(commandData.author); - - for (const row of commandData.pastas) { - pastasArray.push(`#${row.id} - ${row.name}.pasta`); - } - - const pastasString = pastasArray.join('\n'); - pastasEmbed.setDescription(pastasString); - - return { embeds: [pastasEmbed], ephemeral: true }; - }, - gifs(commandData) { - const gifsArray = []; - const gifsEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) - .setTimestamp() - .setFooter(commandData.author); - - for (const row of commandData.gifs) { - gifsArray.push(`#${row.id} - ${row.name}.gif`); - } - - const gifsString = gifsArray.join('\n'); - gifsEmbed.setDescription(gifsString); - - return { embeds: [gifsEmbed] }; - }, text(commandData) { return { embeds: [new Discord.MessageEmbed() .setAuthor(commandData.command) @@ -304,272 +159,6 @@ const functions = { .setTimestamp() .setFooter(commandData.author)]}; }, - requests(commandData) { - const requestsEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) - .setTimestamp() - .setFooter(commandData.author); - - const requestsArray = []; - - for (const row of commandData.requests) { - requestsArray.push( - `**#${row.id} - ${row.author}**`, - `Request: ${row.request}` - ); - } - - requestsEmbed.setDescription(requestsArray.join('\n')); - - return { embeds: [requestsEmbed], ephemeral: true }; - }, - strain(strainInfo, interaction) { - const strainEmbed = new Discord.MessageEmbed() - .setTimestamp(); - strainEmbed.addFields([ - { - name: 'Strain Name', - value: `${strainInfo.strain}`, - inline: true, - }, - { - name: 'Type', - value: `${strainInfo.type}`, - inline: true, - }, - { - name: 'Effects', - value: `${strainInfo.effects}`, - inline: true, - }, - { - name: 'Flavor', - value: `${strainInfo.flavor}`, - inline: true, - }, - { - name: 'Rating', - value: `⭐️${strainInfo.rating}`, - inline: true, - }, - { - name: 'Description', - value: `${strainInfo.description}`, - inline: false, - }, - ]); - - interaction.reply({ embeds: [ strainEmbed ]}); - }, - }, - collect: { - gifName(interaction) { - const gifNameFilter = m => m.author.id == strings.temp.gifUserId; - return interaction.channel.createMessageCollector({ filter: gifNameFilter, time: 30000 }); - }, - }, - upload: { - request(commandData, client) { - const query = `INSERT INTO requests (author, request, status) VALUES (${db.escape(commandData.author)},${db.escape(commandData.args)},'Active')`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.requests(client); - }); - }, - pasta(pastaData, client) { - const query = `INSERT INTO pastas (name, content) VALUES (${db.escape(pastaData.name)},${db.escape(pastaData.content)})`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.pastas(client); - }); - }, - joint(content, client) { - const query = `INSERT INTO joints (content) VALUES (${db.escape(content)})`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.joints(client); - }); - }, - gif(gifData, client) { - const query = `INSERT INTO gifs (name, embed_url) VALUES (${db.escape(gifData.name)}, ${db.escape(gifData.embed_url)})`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.gifs(client); - }); - }, - setup(interaction) { - /* Tables: - * - gifs - * - joints - * - pastas - * - requests - * - strains */ - const gifsQuery = "CREATE TABLE 'gifs' (id int(11), name varchar(100), embed_url varchar(1000), PRIMARY KEY(id))"; - const jointsQuery = "CREATE TABLE 'joints' (id int(11), content varchar(1000), PRIMARY KEY(id))"; - const pastasQuery = "CREATE TABLE 'pastas' (id int(11), name varchar(100), content varchar(1900), iconurl varchar(200) DEFAULT 'https://cdn.discordapp.com/avatars/513184762073055252/12227aa23a06d5178853e59b72c7487b.webp?size=128', PRIMARY KEY(id))"; - const requestsQuery = "CREATE TABLE 'requests' (id int(11), author varchar(100), request varchar(1000), status varchar(10) DEFAULT 'Active', PRIMARY KEY(id))"; - const strainsQuery = "CREATE TABLE 'strains' (id smallint(6), name varchar(60), type varchar(10), effects varchat(80), ailment varchar(70), flavor varchar(30), PRIMARY KEY(id))"; - - // Check for owner - if (interaction.user.id == ownerId) { - db.query(gifsQuery, (err, rows, fields) => { - if (err) throw err; - }); - db.query(jointsQuery, (err, rows, fields) => { - if (err) throw err; - }); - db.query(pastasQuery, (err, rows, fields) => { - if (err) throw err; - }); - db.query(requestsQuery, (err, rows, fields) => { - if (err) throw err; - }); - db.query(strainsQuery, (err, rows, fields) => { - if (err) throw err; - }); - return 'I\'ve created the required tables. Please check your database to validate this.'; - } else { - return 'Sorry, you don\'t have permission to do that.'; - } - }, - medicalAdvice(content, client) { - const query = `INSERT INTO medical_advice (content) VALUES (${db.escape(content)})`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.medicalAdvice(client); - }); - }, - strain(interaction) { - const strain = db.escape(interaction.options.getString('name')); - const type = db.escape(interaction.options.getString('type')); - const effects = db.escape(( interaction.options.getString('effects') || 'Unkown' )); - const description = db.escape(( interaction.options.getString('description') || 'Unknown' )); - const flavor = db.escape(( interaction.options.getString('flavor') || 'Unknown' )); - const rating = db.escape(( interaction.options.getString('rating') || '3' )); - const strainQuery = `INSERT INTO strains (strain, type, effects, description, flavor, rating) VALUES (${strain}, ${type}, ${effects}, ${description}, ${flavor}, ${rating})`; - console.log(strainQuery); - return new Promise((resolve, reject) => { - db.query(strainQuery, (err, rows, fields) => { - if (err) reject(err); - functions.download.strains(interaction.client); - resolve(); - }); - }) - } - }, - download: { - requests(client) { - const query = 'SELECT * FROM requests WHERE status = \'Active\' ORDER BY id DESC'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.requests(rows, client); - }); - }, - pastas(client) { - const query = 'SELECT * FROM pastas ORDER BY id ASC'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.pastas(rows, client); - }); - }, - gifs(client) { - const query = 'SELECT * FROM gifs ORDER BY id ASC'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.gifs(rows, client); - }); - }, - joints(client) { - const query = 'SELECT * FROM joints ORDER BY id ASC'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.joints(rows, client); - }); - }, - strain(strainName, interaction) { - const query = `SELECT id, strain, type, effects, description, flavor, rating FROM strains WHERE strain = ${db.escape(strainName)}`; - db.query(query, (err, rows, fields) => { - if (rows != undefined) { - const strainInfo = { - id: `${rows[0].id}`, - strain: `${rows[0].strain}`, - type: `${rows[0].type}`, - effects: `${rows[0].effects}`, - description: `${rows[0].description}`, - flavor: `${rows[0].flavor}`, - rating: `${rows[0].rating}`, - }; - functions.embeds.strain(strainInfo, interaction); - } - }); - }, - strains(client) { - const query = 'SELECT id, strain FROM strains'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.strains(rows, client); - }); - }, - medicalAdvice(client) { - const query = 'SELECT * FROM medical_advice ORDER BY id ASC'; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.collections.medicalAdvice(rows, client); - }); - } - }, - weed: { - strain: { - lookup(strainName, client) { - const strainSearcher = new FuzzySearch(client.strains.map(e => e.name)); - return strainSearcher.search(strainName).slice(0,25); - }, - submit(strainName) { - const query = `` - return strainName; - } - } - }, - // Parent-Level functions (miscellaneuous) - closeRequest(requestId, interaction) { - if (interaction.user.id == ownerId) { - const { client } = interaction; - const query = `UPDATE requests SET status = 'Closed' WHERE id = ${db.escape(requestId)}`; - db.query(query, (err, rows, fields) => { - if (err) throw err; - functions.download.requests(client); - }); - interaction.reply({ content: `Request #${requestId} has been closed.`, ephemeral: true }); - } else { - interaction.reply({ content: 'You do not have permission to do that.', ephemeral: true }); - } - if (isDev) { - console.log(requestId, interaction, ownerId); - } - }, - spongebob(commandData) { - let newText = ''; - for (const letter of commandData.args) { - if (letter == ' ') { - newText += letter; - continue; - } - if (letter == 'i' || letter == 'I') { - newText += 'i'; - continue; - } - if (letter == 'l' || letter == 'L') { - newText += 'L'; - continue; - } - if (Math.random() > 0.5) { - newText += letter.toUpperCase(); - } else { - newText += letter.toLowerCase(); - } - } - - return newText + ' <:spongebob:1053398825965985822>'; }, }; diff --git a/main.js b/main.js index f98aa1a..8feacaf 100644 --- a/main.js +++ b/main.js @@ -13,18 +13,16 @@ const client = new Client({ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, - GatewayIntentBits.DirectMessages + GatewayIntentBits.MessageContent ], partials: [ Partials.Channel, - Partials.Message, + Partials.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 isDev = process.env.isDev; @@ -32,12 +30,6 @@ client.once('ready', () => { fn.collections.slashCommands(client); fn.collections.dotCommands(client); fn.collections.setvalidCommands(client); - fn.download.gifs(client); - fn.download.pastas(client); - fn.download.joints(client); - fn.download.requests(client); - fn.download.strains(client); - fn.download.medicalAdvice(client); console.log('Ready!'); client.channels.fetch(statusChannelId).then(channel => { channel.send(`${new Date().toISOString()} -- <@${process.env.ownerId}>\nStartup Sequence Complete`); @@ -59,132 +51,6 @@ client.on('interactionCreate', async interaction => { console.error('Slash command attempted to run but not found: ' + commandName); } } - - if (interaction.isButton()) { - if (interaction.user.id != strings.temp.gifUserId) return; - // 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, - embed_url: 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: - break; - } - } - - // Handle autocomplete requests - if (interaction.isAutocomplete()) { - if (interaction.commandName == '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 })) - ) - } else { - return; - } - } }); // dot-commands @@ -192,12 +58,6 @@ client.on('messageCreate', message => { // Some basic checking to prevent running unnecessary code if (message.author.bot) return; - // Wildcard Responses, will respond if any message contains the trigger word(s), excluding self-messages - const lowerContent = message.content.toLowerCase(); - if (lowerContent.includes('big') && lowerContent.includes('doinks')) message.reply('gang.'); - if (lowerContent.includes('ligma')) message.reply('ligma balls, goteem'); - if (lowerContent.includes('frfr') || lowerContent.includes('fr fr') || lowerContent.includes('bussin') || lowerContent.includes(' ong') || lowerContent.startsWith('ong')) message.reply('ongggg no :billed_cap: fr fr str8 bussin'); - // Break the message down into its components and analyze it const commandData = fn.dot.getCommandData(message); console.log(commandData);