From cb834cb7eecb4c2d7aa6b0a088bdf2b303e9fad4 Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Tue, 8 Aug 2023 13:25:07 -0400 Subject: [PATCH 1/5] Classes, Embed.SetAuthor, /gifs, /edit, PARTIAL --- CustomModules/NodBot.js | 15 ++++++ dot-commands/gif.js | 6 +-- functions.js | 65 ++++++++++++++------------ main.js | 51 +++++++++++++++----- slash-commands/edit.js | 101 ++++++++++++++++++++++++++++++++++++++++ slash-commands/gifs.js | 33 +++++++------ slash-commands/save.js | 10 ++-- 7 files changed, 217 insertions(+), 64 deletions(-) create mode 100644 CustomModules/NodBot.js create mode 100644 slash-commands/edit.js diff --git a/CustomModules/NodBot.js b/CustomModules/NodBot.js new file mode 100644 index 0000000..ecb8c53 --- /dev/null +++ b/CustomModules/NodBot.js @@ -0,0 +1,15 @@ +module.exports = { + GifData: class { + constructor() { + this.gifName = ""; + this.gifUrl = ""; + } + setInfo(name, url) { + if ((!name) || (!url)) throw `Expected a name and url, receieved {name: ${name}, url: ${url}}`; + this.name = name; + this.url = url; + + return this; + } + } +} \ No newline at end of file diff --git a/dot-commands/gif.js b/dot-commands/gif.js index c7dedd7..b9f746a 100644 --- a/dot-commands/gif.js +++ b/dot-commands/gif.js @@ -13,7 +13,7 @@ module.exports = { async execute(message, commandData) { // if (message.deletable) message.delete(); const client = message.client; - if (!client.gifs.has(commandData.args)) { + if (!client.gifs.has(commandData.args.toLowerCase())) { if (process.env.isDev) console.log('https://tenor.googleapis.com/v2/search?' + `&q=${commandData.args}` + `&key=${process.env.tenorAPIKey}` + '&limit=1&contentfilter=off'); const q = await axios.get( 'https://tenor.googleapis.com/v2/search?' + @@ -43,11 +43,11 @@ module.exports = { // }).catch(err => console.error(err)); } else { // message.reply(commandData.args + ' requested by ' + message.author.username + '\n' + client.gifs.get(commandData.args).embed_url); - commandData.embed_url = client.gifs.get(commandData.args).embed_url; + const gifData = client.gifs.get(commandData.args.toLowerCase()); // message.reply(fn.embeds.gif(commandData)); // message.channel.send(`> ${commandData.author} - ${commandData.args}.gif`); // message.channel.send(commandData.embed_url); - message.reply(commandData.embed_url); + message.reply(gifData.url); } } } \ No newline at end of file diff --git a/functions.js b/functions.js index 358d552..b02a9bc 100644 --- a/functions.js +++ b/functions.js @@ -45,6 +45,7 @@ const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.en // MySQL database connection const mysql = require('mysql'); +const { GifData } = require('./CustomModules/NodBot'); const db = new mysql.createPool({ connectionLimit: 10, host: dbHost, @@ -102,12 +103,13 @@ const functions = { 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); + // const gif = { + // id: row.id, + // name: row.name, + // embed_url: row.embed_url + // }; + const gifData = new GifData().setInfo(row.name, row.embed_url); + client.gifs.set(gifData.name, gifData); } if (isDev) console.log('GIFs Collection Built'); }, @@ -215,7 +217,7 @@ const functions = { // Construct the Help Embed const helpEmbed = new Discord.MessageEmbed() .setColor('BLUE') - .setAuthor('Help Page') + .setAuthor({name: 'Help Page'}) .setDescription(strings.help.description) .setThumbnail(strings.urls.avatar); @@ -268,14 +270,14 @@ const functions = { }, gif(commandData) { return { embeds: [new Discord.MessageEmbed() - .setAuthor(`${commandData.args}.${commandData.command}`) + .setAuthor({name: `${commandData.args}.${commandData.command}`}) .setImage(commandData.embed_url) .setTimestamp() .setFooter(commandData.author)]}; }, pasta(commandData) { return { embeds: [ new Discord.MessageEmbed() - .setAuthor(`${commandData.args}.${commandData.command}`) + .setAuthor({name: `${commandData.args}.${commandData.command}`}) .setDescription(commandData.content) .setThumbnail(commandData.iconUrl) .setTimestamp() @@ -284,7 +286,7 @@ const functions = { pastas(commandData) { const pastasArray = []; const pastasEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) + .setAuthor({name: commandData.command}) .setTimestamp() .setFooter(commandData.author); @@ -297,32 +299,25 @@ const functions = { return { embeds: [pastasEmbed], ephemeral: true }; }, - gifs(commandData) { - const gifsArray = []; + gifs(commandData, gifList) { const gifsEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) + .setAuthor({name: 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); + .setFooter(commandData.author) + .setDescription(gifList.join('\n')); return { embeds: [gifsEmbed] }; }, text(commandData) { return { embeds: [new Discord.MessageEmbed() - .setAuthor(commandData.command) + .setAuthor({name: commandData.command}) .setDescription(commandData.content) .setTimestamp() .setFooter(commandData.author)]}; }, requests(commandData) { const requestsEmbed = new Discord.MessageEmbed() - .setAuthor(commandData.command) + .setAuthor({name: commandData.command}) .setTimestamp() .setFooter(commandData.author); @@ -418,7 +413,7 @@ const functions = { }); }, pasta(pastaData, client) { - const query = `INSERT INTO pastas (name, content) VALUES (${db.escape(pastaData.name)},${db.escape(pastaData.content)})`; + const query = `INSERT INTO pastas (name, content) VALUES (${db.escape(pastaData.name)},${db.escape(pastaData.content)}) ON DUPLICATE KEY UPDATE content=${db.escape(pastaData.content)}`; db.query(query, (err, rows, fields) => { if (err) throw err; functions.download.pastas(client); @@ -431,9 +426,9 @@ const functions = { 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) => { + async gif(gifData, client) { + const query = `INSERT INTO gifs (name, embed_url) VALUES (${db.escape(gifData.name)}, ${db.escape(gifData.url)}) ON DUPLICATE KEY UPDATE embed_url=${db.escape(gifData.embed_url)}`; + await db.query(query, (err, rows, fields) => { if (err) throw err; functions.download.gifs(client); }); @@ -487,7 +482,7 @@ const functions = { 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})`; + const strainQuery = `INSERT INTO strains (strain, type, effects, description, flavor, rating) VALUES (${strain}, ${type}, ${effects}, ${description}, ${flavor}, ${rating}) ON DUPLICATE KEY UPDATE strain=${db.escape(strain)}, type=${db.escape(type)}, effects=${db.escape(effects)}, description=${db.escape(description)}, flavor=${db.escape(flavor)}, rating=${db.escape(rating)}`; console.log(strainQuery); return new Promise((resolve, reject) => { db.query(strainQuery, (err, rows, fields) => { @@ -519,9 +514,9 @@ const functions = { functions.collections.pastas(rows, client); }); }, - gifs(client) { + async gifs(client) { const query = 'SELECT * FROM gifs ORDER BY id ASC'; - db.query(query, (err, rows, fields) => { + await db.query(query, (err, rows, fields) => { if (err) throw err; functions.collections.gifs(rows, client); }); @@ -608,6 +603,16 @@ const functions = { }); } }, + search: { + gifs(query, client) { + const gifSearcher = new FuzzySearch(client.gifs.map(element => element.name)); + return gifSearcher.search(query).slice(0,25); + }, + pastas(query, client) { + const pastaSearcher = new FuzzySearch(client.pastas.map(element => element.name)); + return pastaSearcher.search(query).slice(0,25); + } + }, // Parent-Level functions (miscellaneuous) closeRequest(requestId, interaction) { if (interaction.user.id == ownerId) { diff --git a/main.js b/main.js index 0ee3d91..ed084ef 100644 --- a/main.js +++ b/main.js @@ -27,6 +27,7 @@ const { MessageActionRow, MessageButton } = require('discord.js'); const fn = require('./functions.js'); const config = require('./config.json'); const strings = require('./strings.json'); +const { GifData } = require('./CustomModules/NodBot.js'); const isDev = process.env.isDev; client.once('ready', () => { @@ -108,10 +109,11 @@ client.on('interactionCreate', async interaction => { 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, - }; + // 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); @@ -176,14 +178,39 @@ client.on('interactionCreate', async interaction => { // 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; + 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; } } }); diff --git a/slash-commands/edit.js b/slash-commands/edit.js new file mode 100644 index 0000000..2c9394c --- /dev/null +++ b/slash-commands/edit.js @@ -0,0 +1,101 @@ +const tenor = require('tenorjs').client({ + 'Key': process.env.tenorAPIKey, // https://tenor.com/developer/keyregistration + 'Filter': 'off', // "off", "low", "medium", "high", not case sensitive + 'Locale': 'en_US', + 'MediaFilter': 'minimal', + 'DateFormat': 'D/MM/YYYY - H:mm:ss A', +}); + +const { SlashCommandBuilder } = require('@discordjs/builders'); +const { MessageActionRow, MessageButton } = require('discord.js'); +const { GifData } = require('../CustomModules/NodBot'); +const fn = require('../functions.js'); +const strings = require('../strings.json'); +const { emoji } = strings; + +module.exports = { + data: new SlashCommandBuilder() + .setName('edit') + .setDescription('Edit content in Nodbot\'s database.') + .addSubcommand(subcommand => + subcommand + .setName('gif') + .setDescription('Edit a GIF URL') + .addStringOption(option => + option + .setName('name') + .setDescription('The name of the GIF to edit') + .setRequired(true) + .setAutocomplete(true) + ) + .addStringOption(option => + option + .setName('url') + .setDescription('The new URL') + .setRequired(true) + ) + ) + .addSubcommand(subcommand => + subcommand + .setName('pasta') + .setDescription('Edit a copypasta\'s content') + .addStringOption(option => + option + .setName('name') + .setDescription('The name of the copypasta') + .setRequired(true) + .setAutocomplete(true) + ) + .addStringOption(option => + option + .setName('content') + .setDescription('The new content of the copypasta') + .setRequired(true) + ) + ), + async execute(interaction) { + await interaction.deferReply({ ephemeral: true }); + try { + // Code Here... + const subcommand = interaction.options.getSubcommand(); + switch (subcommand) { +// GIF + case "gif": + //TODO + await this.editGif(interaction, interaction.options.getString('name'), interaction.options.getString('url')); + break; +// Joint + case "joint": + //TODO + break; +// MD + case "md": + //TODO + break; +// Pasta + case "pasta": + //TODO + break; +// Strain + case "strain": + //TODO + break; + break; +// Default + default: + + break; + } + } catch (err) { + const errorId = fn.generateErrorId(); + console.error(`${errorId}: err`); + await interaction.editReply(`Sorry, an error has occured. Error ID: ${errorId}`); + } + }, + async editGif(interaction, name, url) { + const gifData = new GifData().setInfo(name, url); + await fn.upload.gif(gifData, interaction.client); + await fn.download.gifs(interaction.client); + await interaction.editReply(`I've updated ${gifData.name}.gif`); + } +}; \ No newline at end of file diff --git a/slash-commands/gifs.js b/slash-commands/gifs.js index 934ff86..0409968 100644 --- a/slash-commands/gifs.js +++ b/slash-commands/gifs.js @@ -11,23 +11,26 @@ module.exports = { interaction.reply('For some reason I don\'t have access to the collection of gifs. Sorry about that!'); return; } - const gifsMap = interaction.client.gifs.map(e => { - return { - id: e.id, - name: e.name, - }; + // const gifsMap = interaction.client.gifs.map(e => {e.name, e.url}); + // const commandData = { + // gifs: [], + // command: 'gifs', + // author: interaction.user.tag, + // }; + // for (const row of gifsMap) { + // commandData.gifs.push({ + // id: row.id, + // name: row.name, + // }); + // } + let gifList = []; + interaction.client.gifs.forEach(element => { + gifList.push(`[${element.name}](${element.url})`); }); const commandData = { - gifs: [], - command: 'gifs', - author: interaction.user.tag, + command: "/gifs", + author: interaction.member.displayName }; - for (const row of gifsMap) { - commandData.gifs.push({ - id: row.id, - name: row.name, - }); - } - interaction.reply(fn.embeds.gifs(commandData)); + interaction.reply(fn.embeds.gifs(commandData, gifList)); }, }; \ No newline at end of file diff --git a/slash-commands/save.js b/slash-commands/save.js index 13f5d38..6390e8b 100644 --- a/slash-commands/save.js +++ b/slash-commands/save.js @@ -10,6 +10,7 @@ const { SlashCommandBuilder } = require('@discordjs/builders'); const { MessageActionRow, MessageButton } = require('discord.js'); const fn = require('../functions.js'); const strings = require('../strings.json'); +const { GifData } = require('../CustomModules/NodBot.js'); const { emoji } = strings; module.exports = { @@ -178,10 +179,11 @@ module.exports = { // GIF URL case "gifurl": //TODO Check on option names - const gifData = { - name: interaction.options.getString('name').toLowerCase(), - embed_url: interaction.options.getString('url'), - }; + // const gifData = { + // name: interaction.options.getString('name').toLowerCase(), + // url: interaction.options.getString('url'), + // }; + const gifData = new GifData().setInfo(interaction.options.getString('name').toLowerCase(), interaction.options.getString('url')); fn.upload.gif(gifData, interaction.client); interaction.editReply({ content: `I've saved the GIF as ${gifData.name}.gif`, ephemeral: true }); fn.download.gifs(interaction.client); From f3051ec944e7dbd505cccee4d299dffee44a2c42 Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Tue, 8 Aug 2023 14:34:46 -0400 Subject: [PATCH 2/5] /edit pasta, setFooter, PastaData Classification --- CustomModules/NodBot.js | 51 +++++++++++++++++++++++++++++++++++------ dot-commands/pasta.js | 8 +++---- functions.js | 33 +++++++++++--------------- slash-commands/edit.js | 11 ++++++++- 4 files changed, 71 insertions(+), 32 deletions(-) diff --git a/CustomModules/NodBot.js b/CustomModules/NodBot.js index ecb8c53..2d5ff83 100644 --- a/CustomModules/NodBot.js +++ b/CustomModules/NodBot.js @@ -1,15 +1,52 @@ module.exports = { GifData: class { constructor() { - this.gifName = ""; - this.gifUrl = ""; + this.id = 0; + this.name = ""; + this.url = ""; } - setInfo(name, url) { - if ((!name) || (!url)) throw `Expected a name and url, receieved {name: ${name}, url: ${url}}`; - this.name = name; - this.url = url; - return this; + // Initial GifData configuration + // Can also be used to update the data piecemeal + setInfo(name, url, id) { + // Check for existing or incoming name + if ((this.name === "") && (typeof name !== 'string')) throw `Error: This Gif doesn't have existing name, and no name is going to be set.`; + // Check for existing content or incoming content + if ((this.url === "") && (typeof url !== 'string')) throw `Error: This Gif doesn't have existing url, and no url is going to be set.`; + + // Property is set if the variable is the right type, + // otherwise it keeps the existing property + this.id = typeof id === 'number' ? id : this.id; + this.name = typeof name === 'string' ? name : this.name; + this.url = typeof url === 'string' ? url : this.url; + + return this; // For chaining + } + }, + PastaData: class { + constructor() { + this.id = 0; + this.name = ""; + this.content = ""; + this.iconUrl = ""; + } + + // Initial PastaData configuration + // Can also be used to update the data piecemeal + setInfo(name, content, iconUrl, id) { + // Check for existing or incoming name + if ((this.name === "") && (typeof name !== 'string')) throw `Error: This Pasta doesn't have existing name, and no name is going to be set.`; + // Check for existing content or incoming content + if ((this.content === "") && (typeof content !== 'string')) throw `Error: This Pasta doesn't have existing content, and no content is going to be set.`; + + // Property is set if the variable is the right type, + // otherwise it keeps the existing property + this.id = typeof id === 'number' ? id : this.id; + this.name = typeof name === 'string' ? name : this.name; + this.content = typeof content === 'string' ? content : this.content; + this.iconUrl = typeof iconUrl === 'string' ? iconUrl : this.iconUrl; + + return this; // For chaining } } } \ No newline at end of file diff --git a/dot-commands/pasta.js b/dot-commands/pasta.js index 247cf96..357f8ac 100644 --- a/dot-commands/pasta.js +++ b/dot-commands/pasta.js @@ -6,14 +6,12 @@ module.exports = { usage: '.pasta', execute(message, commandData) { const client = message.client; - let replyBody = ''; - let iconUrl; + let pastaData; if (!client.pastas.has(commandData.args)) { commandData.content = 'Sorry I couldn\'t find that pasta.'; } else { - commandData.content = client.pastas.get(commandData.args).content; - commandData.iconUrl = client.pastas.get(commandData.args).iconUrl; + pastaData = client.pastas.get(commandData.args); } - message.reply(fn.embeds.pasta(commandData)); + message.reply(fn.embeds.pasta(commandData, pastaData)); } } \ No newline at end of file diff --git a/functions.js b/functions.js index b02a9bc..b3a571e 100644 --- a/functions.js +++ b/functions.js @@ -45,7 +45,7 @@ const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.en // MySQL database connection const mysql = require('mysql'); -const { GifData } = require('./CustomModules/NodBot'); +const { GifData, PastaData } = require('./CustomModules/NodBot'); const db = new mysql.createPool({ connectionLimit: 10, host: dbHost, @@ -129,13 +129,8 @@ const functions = { 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); + const pastaData = new PastaData().setInfo(row.name, row.content, row.iconurl, row.id); + client.pastas.set(pastaData.name, pastaData); } if (isDev) console.log('Pastas Collection Built'); }, @@ -183,7 +178,7 @@ const functions = { const commandData = {}; // Split the message content at the final instance of a period const finalPeriod = message.content.lastIndexOf('.'); - if(isDev) console.log(message.content); + // if(isDev) console.log(message.content); // If the final period is the last character, or doesn't exist if (finalPeriod < 0) { if (isDev) console.log(finalPeriod); @@ -195,7 +190,7 @@ const functions = { commandData.args = message.content.slice(0,finalPeriod).toLowerCase(); // Get the last part of the message, everything after the final period commandData.command = message.content.slice(finalPeriod).replace('.','').toLowerCase(); - commandData.author = `${message.author.username}#${message.author.discriminator}`; + commandData.author = `${message.author.username}`; return this.checkCommand(commandData); }, checkCommand(commandData) { @@ -273,22 +268,22 @@ const functions = { .setAuthor({name: `${commandData.args}.${commandData.command}`}) .setImage(commandData.embed_url) .setTimestamp() - .setFooter(commandData.author)]}; + .setFooter({text: commandData.author})]}; }, - pasta(commandData) { + pasta(commandData, pastaData) { return { embeds: [ new Discord.MessageEmbed() .setAuthor({name: `${commandData.args}.${commandData.command}`}) - .setDescription(commandData.content) - .setThumbnail(commandData.iconUrl) + .setDescription(pastaData.content) + .setThumbnail(pastaData.iconUrl) .setTimestamp() - .setFooter(commandData.author)]}; + .setFooter({text: commandData.author})]}; }, pastas(commandData) { const pastasArray = []; const pastasEmbed = new Discord.MessageEmbed() .setAuthor({name: commandData.command}) .setTimestamp() - .setFooter(commandData.author); + .setFooter({text: commandData.author}); for (const row of commandData.pastas) { pastasArray.push(`#${row.id} - ${row.name}.pasta`); @@ -303,7 +298,7 @@ const functions = { const gifsEmbed = new Discord.MessageEmbed() .setAuthor({name: commandData.command}) .setTimestamp() - .setFooter(commandData.author) + .setFooter({text: commandData.author}) .setDescription(gifList.join('\n')); return { embeds: [gifsEmbed] }; @@ -313,13 +308,13 @@ const functions = { .setAuthor({name: commandData.command}) .setDescription(commandData.content) .setTimestamp() - .setFooter(commandData.author)]}; + .setFooter({text: commandData.author})]}; }, requests(commandData) { const requestsEmbed = new Discord.MessageEmbed() .setAuthor({name: commandData.command}) .setTimestamp() - .setFooter(commandData.author); + .setFooter({text: commandData.author}); const requestsArray = []; diff --git a/slash-commands/edit.js b/slash-commands/edit.js index 2c9394c..975e933 100644 --- a/slash-commands/edit.js +++ b/slash-commands/edit.js @@ -8,7 +8,7 @@ const tenor = require('tenorjs').client({ const { SlashCommandBuilder } = require('@discordjs/builders'); const { MessageActionRow, MessageButton } = require('discord.js'); -const { GifData } = require('../CustomModules/NodBot'); +const { GifData, PastaData } = require('../CustomModules/NodBot'); const fn = require('../functions.js'); const strings = require('../strings.json'); const { emoji } = strings; @@ -17,6 +17,7 @@ module.exports = { data: new SlashCommandBuilder() .setName('edit') .setDescription('Edit content in Nodbot\'s database.') +// GIF .addSubcommand(subcommand => subcommand .setName('gif') @@ -35,6 +36,7 @@ module.exports = { .setRequired(true) ) ) +// Pasta .addSubcommand(subcommand => subcommand .setName('pasta') @@ -75,6 +77,7 @@ module.exports = { // Pasta case "pasta": //TODO + await this.editPasta(interaction, interaction.options.getString('name'), interaction.options.getString('content')); break; // Strain case "strain": @@ -97,5 +100,11 @@ module.exports = { await fn.upload.gif(gifData, interaction.client); await fn.download.gifs(interaction.client); await interaction.editReply(`I've updated ${gifData.name}.gif`); + }, + async editPasta(interaction, name, content) { + const pastaData = new PastaData().setInfo(name, content); + await fn.upload.pasta(pastaData, interaction.client); + await fn.download.gifs(interaction.client); + await interaction.editReply(`I've updated ${name}.pasta`); } }; \ No newline at end of file From 6e062ffef2b5672ea5ef7ed1a4998e61b92ca426 Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Tue, 8 Aug 2023 14:39:32 -0400 Subject: [PATCH 3/5] Use Head Ref for main PRs --- .github/workflows/production-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/production-docker.yml b/.github/workflows/production-docker.yml index 6b94711..d4e5c6b 100644 --- a/.github/workflows/production-docker.yml +++ b/.github/workflows/production-docker.yml @@ -22,7 +22,7 @@ jobs: whoami cd /root/nodbot git pull - git checkout main + git checkout $GITHUB_HEAD_REF - name: Build the Docker image run: | cd /root/nodbot From b28e193b55777879a20030e4f0ce5c50c879ecf4 Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Tue, 8 Aug 2023 14:44:59 -0400 Subject: [PATCH 4/5] Update to use Node 18 LTS --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7b75fef..e7e0027 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:16 +FROM node:18 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app From c562c06925aafb980f692ea51908160b9db55c46 Mon Sep 17 00:00:00 2001 From: Skylar Grant Date: Tue, 8 Aug 2023 15:06:29 -0400 Subject: [PATCH 5/5] Fix incorrect insert statement --- functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions.js b/functions.js index b3a571e..6b53169 100644 --- a/functions.js +++ b/functions.js @@ -422,7 +422,7 @@ const functions = { }); }, async gif(gifData, client) { - const query = `INSERT INTO gifs (name, embed_url) VALUES (${db.escape(gifData.name)}, ${db.escape(gifData.url)}) ON DUPLICATE KEY UPDATE embed_url=${db.escape(gifData.embed_url)}`; + const query = `INSERT INTO gifs (name, embed_url) VALUES (${db.escape(gifData.name)}, ${db.escape(gifData.url)}) ON DUPLICATE KEY UPDATE embed_url=${db.escape(gifData.url)}`; await db.query(query, (err, rows, fields) => { if (err) throw err; functions.download.gifs(client);