Compare commits

...

19 Commits

Author SHA1 Message Date
304503f7d8 Merge pull request 'v3.6.1 Requests Expansion' (#32) from v3.6.1 into main
All checks were successful
NodBot Production Dockerization / build (push) Successful in 21s
Reviewed-on: #32
2026-10-01 19:38:34 +00:00
7b504a2312 Re-fix variable ref
All checks were successful
NodBot PE Dockerization / build (push) Successful in 21s
2026-10-01 15:32:38 -04:00
8039f8f1c7 Print raw error instead of trying to stringify it
All checks were successful
NodBot PE Dockerization / build (push) Successful in 20s
2026-10-01 15:30:45 -04:00
46e5079eaf Add client to sendAlert
All checks were successful
NodBot PE Dockerization / build (push) Successful in 19s
2026-10-01 15:28:03 -04:00
8580dda6c8 Change MessageEmbed Description to just a string
All checks were successful
NodBot PE Dockerization / build (push) Successful in 19s
2026-10-01 15:25:53 -04:00
211e07f5f0 Fix tagging system
All checks were successful
NodBot PE Dockerization / build (push) Successful in 10s
2026-10-01 15:15:09 -04:00
531167f2ba Add specific target to push in CI flow
Some checks failed
NodBot PE Dockerization / build (push) Failing after 3s
2026-10-01 14:39:12 -04:00
f7c63c8705 Tweak dev and prod workflow 2026-10-01 14:30:48 -04:00
acfe540148 Add error alerting in Discord, revert last fix to test alerting
All checks were successful
NodBot PE Dockerization / build (push) Successful in 20s
2026-10-01 13:15:28 -04:00
23a282a8a5 Fix var reference in reply text 2026-10-01 12:19:19 -04:00
fc941ad487 Add url to request upload
All checks were successful
NodBot PE Dockerization / build (push) Successful in 1m18s
2026-10-01 12:03:47 -04:00
e198ca3b4d Versioning 2026-10-01 10:20:28 -04:00
fb963cc153 Merge pull request 'v3.6.0 GIF Fix' (#31) from v3.6.0 into main
Reviewed-on: #31
2026-10-01 14:14:12 +00:00
20a2665615 Dump env vars to log in dev
All checks were successful
NodBot PE Dockerization / build (push) Successful in 20s
NodBot Production Dockerization / build (push) Successful in 21s
2026-09-21 20:41:06 -04:00
c342f4741a Remove TenorJS completely
All checks were successful
NodBot PE Dockerization / build (push) Successful in 1m7s
2026-09-21 20:32:06 -04:00
f147761d35 Add version to help embed footer
All checks were successful
NodBot PE Dockerization / build (push) Successful in 1m20s
2026-09-21 20:24:04 -04:00
7ed4318863 Testing GIPHY for GIFs 2026-09-21 20:08:57 -04:00
5d5db3be40 Merge pull request 'v3.5.0' (#30) from v3.5.0 into main
All checks were successful
NodBot PE Dockerization / build (push) Successful in 1m17s
Reviewed-on: #30
2026-09-21 23:01:49 +00:00
e88b33c4ed Rollback April Fools'
All checks were successful
NodBot Production Dockerization / build (push) Successful in 25s
2025-04-02 18:05:52 -04:00
13 changed files with 112 additions and 105 deletions

View File

@ -34,13 +34,13 @@ jobs:
- name: Build the Docker image - name: Build the Docker image
run: | run: |
cd /var/lib/act_runner/nodbot cd /var/lib/act_runner/nodbot
docker build . --file Dockerfile --tag v0idf1sh/nodbot-dev docker build --target dev . --file Dockerfile --tag v0idf1sh/nodbot:dev
- name: Log into Docker Hub - name: Log into Docker Hub
run: docker login -u $DHUB_UNAME -p $DHUB_PWORD run: docker login -u $DHUB_UNAME -p $DHUB_PWORD
- name: Push image to Docker Hub - name: Push image to Docker Hub
run: | run: |
cd /var/lib/act_runner/nodbot cd /var/lib/act_runner/nodbot
docker push v0idf1sh/nodbot-dev docker push v0idf1sh/nodbot:dev
- name: Restart the container - name: Restart the container
run: | run: |
cd /srv/docker/nodbot-dev cd /srv/docker/nodbot-dev

View File

@ -33,13 +33,13 @@ jobs:
- name: Build the Docker image - name: Build the Docker image
run: | run: |
cd /var/lib/act_runner/nodbot cd /var/lib/act_runner/nodbot
docker build . --file Dockerfile --tag v0idf1sh/nodbot docker build --target prod . --file Dockerfile --tag v0idf1sh/nodbot:prod
- name: Log into Docker Hub - name: Log into Docker Hub
run: docker login -u $DHUB_UNAME -p $DHUB_PWORD run: docker login -u $DHUB_UNAME -p $DHUB_PWORD
- name: Push image to Docker Hub - name: Push image to Docker Hub
run: | run: |
cd /var/lib/act_runner/nodbot cd /var/lib/act_runner/nodbot
docker push v0idf1sh/nodbot docker push v0idf1sh/nodbot:prod
- name: Restart the container - name: Restart the container
run: | run: |
cd /srv/docker/nodbot cd /srv/docker/nodbot

View File

@ -1,3 +1,11 @@
## v3.6.x
#### v3.6.1 (#32) Improving Requests
* Start logging message URLs and timestamps when requests are submitted.
* Plan to improve request submission process to interactive slash-command.
#### v3.6.0 (#31) Fixing GIF APIs
* Switch from Tenor to Giphy for GIFs
## v3.5.x ## v3.5.x
#### v3.5.0 (#30) The April Fools Update #### v3.5.0 (#30) The April Fools Update
* Add April Fools stuff * Add April Fools stuff

View File

@ -1,4 +1,15 @@
FROM node:18 # Dev Build
FROM node:18 AS dev
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY . .
# Invoke the bot without redirecting STDOUT and STDERR so that docker logs can be used.
CMD ["/bin/sh", "-c", "node main.js"]
FROM node:18 AS prod
RUN mkdir -p /usr/src/app RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app WORKDIR /usr/src/app

View File

@ -1,5 +1,5 @@
# About Nodbot # About Nodbot
Nodbot is a content saving and serving Discord bot. Nodbot is able to search Tenor for GIFs, save custom copypastas, and look up marijuana strain information. Nodbot is in semi-active development by voidf1sh. It's buggy as hell and very shoddily built. Don't use it. Nodbot is a content saving and serving Discord bot. Nodbot is able to search GIPHY for GIFs, save custom copypastas, and look up marijuana strain information. Nodbot is in semi-active development by voidf1sh. It's buggy as hell and very shoddily built. Don't use it.
# Nodbot Help # Nodbot Help
@ -16,7 +16,7 @@ Use the `/help` command to see the bot's help message.
1. Create an application at the [Discord Developer Portal](https://discord.com/developers/applications) 1. Create an application at the [Discord Developer Portal](https://discord.com/developers/applications)
2. Convert the application into a Bot 2. Convert the application into a Bot
3. Note down the token provided and keep this safe. You cannot view this token again, only regenerate a new one. 3. Note down the token provided and keep this safe. You cannot view this token again, only regenerate a new one.
4. Create a Tenor account and obtain an API key. 4. Create a GIPHY account and obtain an API key.
5. Install and configure MySQL or MariaDB with a user for the bot and a datbase 5. Install and configure MySQL or MariaDB with a user for the bot and a datbase
* Create the table structure as outlined below (* Nodbot will soon create its own table structure) * Create the table structure as outlined below (* Nodbot will soon create its own table structure)
6. Configure your environment variables as outlined below. 6. Configure your environment variables as outlined below.
@ -84,7 +84,7 @@ dbPort=<mySQL port (3306)>
dbUser=<mySQL username> dbUser=<mySQL username>
dbPass=<mySQL user password> dbPass=<mySQL user password>
dbName=<mySQL table name> dbName=<mySQL table name>
tenorAPIKey=<Tenor API Key> giphyAPIKey=<GIPHY API Key>
ownerId=<your Discord user ID> ownerId=<your Discord user ID>
statusChannelId=<Discord channel ID of channel used for status messages> statusChannelId=<Discord channel ID of channel used for status messages>
clientId=<Discord user ID of your bot> clientId=<Discord user ID of your bot>

View File

@ -2,10 +2,6 @@ const fn = require('../functions');
const axios = require('axios'); const axios = require('axios');
const dotenv = require('dotenv').config(); const dotenv = require('dotenv').config();
// TODO: Tenor has changed API versions, switch from TenorJS (unmaintained) to axios for
// general API usage. See: https://github.com/Jinzulen/TenorJS/issues/12
// see also: https://developers.google.com/tenor/guides/migrate-from-v1
module.exports = { module.exports = {
name: 'gif', name: 'gif',
description: 'Send a GIF', description: 'Send a GIF',
@ -15,11 +11,12 @@ module.exports = {
// if (message.deletable) message.delete(); // if (message.deletable) message.delete();
const client = message.client; const client = message.client;
if (!client.gifs.has(commandData.args.toLowerCase())) { 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'); // TODO: Implement proper logging
if (process.env.isDev) console.log('https://api.giphy.com/v2/search?' + `&q=${commandData.args}` + `&key=${process.env.giphyAPIKey}` + '&limit=1&contentfilter=off');
const q = await axios.get( const q = await axios.get(
'https://tenor.googleapis.com/v2/search?' + 'https://api.giphy.com/v2/search?' +
`&q=${commandData.args}` + `&q=${commandData.args}` +
`&key=${process.env.tenorAPIKey}` + `&key=${process.env.giphyAPIKey}` +
'&limit=1' + '&limit=1' +
`&contentfilter=off` `&contentfilter=off`
).then(async (res) => { ).then(async (res) => {
@ -45,17 +42,6 @@ module.exports = {
await message.reply(commandData.embed_url); await message.reply(commandData.embed_url);
} }
}).catch(err => console.error(err)); }).catch(err => console.error(err));
// tenor.Search.Query(commandData.args, "1").then(res => {
// if (res[0] == undefined) {
// message.reply('Sorry I was unable to find a GIF of ' + commandData.args);
// return;
// };
// commandData.embed_url = res[0].media[0].gif.url;
// // 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);
// }).catch(err => console.error(err));
} else { } else {
// message.reply(commandData.args + ' requested by ' + message.author.username + '\n' + client.gifs.get(commandData.args).embed_url); // message.reply(commandData.args + ' requested by ' + message.author.username + '\n' + client.gifs.get(commandData.args).embed_url);
const gifData = client.gifs.get(commandData.args.toLowerCase()); const gifData = client.gifs.get(commandData.args.toLowerCase());

View File

@ -5,13 +5,25 @@ module.exports = {
description: 'Submit a request to the bot developer.', description: 'Submit a request to the bot developer.',
usage: '<request or feedback>.request', usage: '<request or feedback>.request',
execute(message, commandData) { execute(message, commandData) {
const request = commandData.args; // Get the request information from the command data that was passed in
commandData.content = `Your request has been submitted!\nRequest: ${request}`; const requestText = commandData.args;
message.reply(fn.embeds.text(commandData)); const messageUrl = message.url;
commandData.content = `A new request has been submitted by ${message.author.tag}:\n${commandData.args}`; const requester = message.author.username;
message.client.users.fetch(process.env.ownerID).then(user => {
user.send(fn.embeds.text(commandData)); try {
}).catch(error => { console.error(error); }); fn.upload.request(requester, requestText, messageUrl, message.client);
fn.upload.request(commandData, message.client); // Set the content to sent a text embed notifying the user of success
commandData.content = `Your request has been submitted!\nRequest: ${requestText}`;
const replyEmbed = fn.embeds.text(commandData);
message.reply({ embeds: [ replyEmbed ]});
} catch(err) {
console.error(err);
commandData.content = "An error occurred while saving the request, please try again later.";
const replyEmbed = fn.embeds.text(commandData);
message.reply({ embeds: [ replyEmbed ]});
const errorEmbed = fn.embeds.error(`An error has occurred in command ${this.name}:\n${err}`);
fn.sendAlert(errorEmbed, message.client);
}
}, },
}; };

View File

@ -9,6 +9,7 @@ const dbPass = process.env.dbPass;
const dbPort = process.env.dbPort; const dbPort = process.env.dbPort;
const isDev = process.env.isDev; const isDev = process.env.isDev;
const ownerId = process.env.ownerId; const ownerId = process.env.ownerId;
const statusChannelId = process.env.statusChannelId;
// filesystem // filesystem
const fs = require('fs'); const fs = require('fs');
@ -26,6 +27,7 @@ const axios = require('axios');
// Various imports from other files // Various imports from other files
const config = require('./config.json'); const config = require('./config.json');
const strings = require('./strings.json'); const strings = require('./strings.json');
const appVersion = require('./package.json').version;
const slashCommandFiles = fs.readdirSync('./slash-commands/').filter(file => file.endsWith('.js')); const slashCommandFiles = fs.readdirSync('./slash-commands/').filter(file => file.endsWith('.js'));
const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.endsWith('.js')); const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.endsWith('.js'));
const customEmbeds = require('./CustomModules/Embeds.js'); const customEmbeds = require('./CustomModules/Embeds.js');
@ -182,7 +184,8 @@ const functions = {
const helpEmbed = new Discord.MessageEmbed() const helpEmbed = new Discord.MessageEmbed()
.setColor('BLUE') .setColor('BLUE')
.setAuthor({name: 'Help Page'}) .setAuthor({name: 'Help Page'})
.setThumbnail(strings.urls.avatar); .setThumbnail(strings.urls.avatar)
.setFooter(`v${appVersion}`);
// Construct the Slash Commands help // Construct the Slash Commands help
@ -300,11 +303,13 @@ const functions = {
return { embeds: [jointsEmbed], components: [jointsPageAR], ephemeral: true }; return { embeds: [jointsEmbed], components: [jointsPageAR], ephemeral: true };
}, },
text(commandData) { text(commandData) {
return { embeds: [new Discord.MessageEmbed() const textEmbed = new Discord.MessageEmbed()
.setAuthor({name: commandData.command}) .setAuthor({ name: commandData.command })
.setDescription(commandData.content) .setDescription(commandData.content)
.setTimestamp() .setTimestamp()
.setFooter({text: commandData.author})]}; .setFooter({text: commandData.author});
return textEmbed;
}, },
requests(commandData, indexedRequests) { requests(commandData, indexedRequests) {
const requestsEmbed = new Discord.MessageEmbed() const requestsEmbed = new Discord.MessageEmbed()
@ -456,6 +461,14 @@ const functions = {
.setDescription('* Data Collection – NodBot does collect personal data, including but not limited to: location, IP address, MAC address, physical address, mother\'s maiden name, social security number, credit card numbers, phone fingerprints, physical fingerprints, penis length and girth, first pet\'s name, city where you met your spouse, and city where your parents met.\n* Payment Info – All payments are processed through a sketchy-looking PayPal link. NodBot and voidf1sh take no responsibility if your bank, CPA, lawyer, or local PD calls you afterward.\n* Chat Logs – NodBot may or may not remember every dumbass thing you’ve ever typed. Just assume it does.\n* Third-Party Sharing – Your usage data may be shared with savage\'s mom\n* Right to Be Forgotten – You can request NodBot forget your existence, but that requires a one-time processing fee of $50.'); .setDescription('* Data Collection – NodBot does collect personal data, including but not limited to: location, IP address, MAC address, physical address, mother\'s maiden name, social security number, credit card numbers, phone fingerprints, physical fingerprints, penis length and girth, first pet\'s name, city where you met your spouse, and city where your parents met.\n* Payment Info – All payments are processed through a sketchy-looking PayPal link. NodBot and voidf1sh take no responsibility if your bank, CPA, lawyer, or local PD calls you afterward.\n* Chat Logs – NodBot may or may not remember every dumbass thing you’ve ever typed. Just assume it does.\n* Third-Party Sharing – Your usage data may be shared with savage\'s mom\n* Right to Be Forgotten – You can request NodBot forget your existence, but that requires a one-time processing fee of $50.');
return { content: announcement, embeds: [ embed1, embed2 ] }; return { content: announcement, embeds: [ embed1, embed2 ] };
},
error(errorText) {
const errorEmbed = new Discord.MessageEmbed()
.setAuthor({ name: "Error!" })
.setDescription(errorText)
.setFooter({ text: appVersion });
return errorEmbed;
} }
}, },
collect: { collect: {
@ -465,8 +478,8 @@ const functions = {
}, },
}, },
upload: { upload: {
request(commandData, client) { request(requester, requestText, messageUrl, client) {
const query = `INSERT INTO requests (author, request, status) VALUES (${db.escape(commandData.author)},${db.escape(commandData.args)},'Active')`; const query = `INSERT INTO requests (author, request, status, url) VALUES (${db.escape(requester)},${db.escape(requestText)},'Active',${db.escape(messageUrl)})`;
db.query(query, (err, rows, fields) => { db.query(query, (err, rows, fields) => {
if (err) throw err; if (err) throw err;
functions.download.requests(client); functions.download.requests(client);
@ -907,6 +920,17 @@ const functions = {
} }
const errorId = digits.join(""); const errorId = digits.join("");
return errorId; return errorId;
},
async sendAlert(embed, client) {
const statusChannel = await client.channels.fetch(statusChannelId)
.catch(err => {
console.error(err);
});
await statusChannel.send({ embeds: [ embed ] })
.catch(err => {
console.error(err);
});
} }
}; };

19
main.js
View File

@ -6,6 +6,9 @@ dotenv.config();
const token = process.env.TOKEN; const token = process.env.TOKEN;
const statusChannelId = process.env.statusChannelId; const statusChannelId = process.env.statusChannelId;
// Dump the env vars to log in dev environment:
if (process.env.isDev === "true") console.log(JSON.stringify(process.env));
// Discord.JS // Discord.JS
const { Client, Intents } = require('discord.js'); const { Client, Intents } = require('discord.js');
const client = new Client({ const client = new Client({
@ -32,7 +35,6 @@ const ButtonHandlers = require('./CustomModules/ButtonHandlers.js');
const InteractionStorage = require('./CustomModules/InteractionStorage.js'); const InteractionStorage = require('./CustomModules/InteractionStorage.js');
const isDev = process.env.isDev; const isDev = process.env.isDev;
let statusChannel; let statusChannel;
const announcementChannelId = '893183933645197312';
client.once('ready', async () => { client.once('ready', async () => {
fn.collections.interactionStorage(client); fn.collections.interactionStorage(client);
@ -53,9 +55,6 @@ client.once('ready', async () => {
// console.log(JSON.stringify(icaoArray)); // console.log(JSON.stringify(icaoArray));
statusChannel = await client.channels.fetch(statusChannelId).catch(e => console.error(e)); statusChannel = await client.channels.fetch(statusChannelId).catch(e => console.error(e));
await statusChannel.send(`${new Date().toISOString()} -- <@${process.env.ownerId}>\nStartup Sequence Complete`).catch(e => console.error(e)); await statusChannel.send(`${new Date().toISOString()} -- <@${process.env.ownerId}>\nStartup Sequence Complete`).catch(e => console.error(e));
const announcementChannel = await client.channels.fetch(announcementChannelId).catch(e => console.error(e));
await announcementChannel.send(fn.embeds.membershipAnnouncement()).catch(e => console.error(e));
// Check for banned servers // Check for banned servers
fn.checkBannedServers(client, statusChannel); fn.checkBannedServers(client, statusChannel);
}); });
@ -73,11 +72,7 @@ client.on('interactionCreate', async interaction => {
} }
if (client.slashCommands.has(commandName)) { if (client.slashCommands.has(commandName)) {
if (fn.checkMembership(client, interaction.user.id)) { client.slashCommands.get(commandName).execute(interaction);
client.slashCommands.get(commandName).execute(interaction);
} else {
interaction.reply(fn.embeds.noMembership());
}
} else { } else {
interaction.reply('Sorry, I don\'t have access to that command.'); interaction.reply('Sorry, I don\'t have access to that command.');
console.error('Slash command attempted to run but not found: ' + commandName); console.error('Slash command attempted to run but not found: ' + commandName);
@ -147,11 +142,7 @@ client.on('messageCreate', message => {
if (commandData.isValid && commandData.isCommand) { if (commandData.isValid && commandData.isCommand) {
try { try {
if (fn.checkMembership(client, message.member.user.id)) { client.dotCommands.get(commandData.command).execute(message, commandData);
client.dotCommands.get(commandData.command).execute(message, commandData);
} else {
message.reply(fn.embeds.noMembership());
}
} }
catch (error) { catch (error) {
console.error(error); console.error(error);

View File

@ -1,6 +1,6 @@
{ {
"name": "nodbot", "name": "nodbot",
"version": "3.5.0", "version": "3.6.1",
"description": "Nods and Nod Accessories", "description": "Nods and Nod Accessories",
"main": "main.js", "main": "main.js",
"dependencies": { "dependencies": {
@ -12,8 +12,7 @@
"dotenv": "^10.0.0", "dotenv": "^10.0.0",
"fuzzy-search": "^3.2.1", "fuzzy-search": "^3.2.1",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"openai": "^4.12.0", "openai": "^4.12.0"
"tenorjs": "^1.0.10"
}, },
"engines": { "engines": {
"node": "18.x" "node": "18.x"

View File

@ -1,11 +1,3 @@
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 { SlashCommandBuilder } = require('@discordjs/builders');
const { MessageActionRow, MessageButton } = require('discord.js'); const { MessageActionRow, MessageButton } = require('discord.js');
const { GifData, PastaData } = require('../CustomModules/NodBot'); const { GifData, PastaData } = require('../CustomModules/NodBot');

View File

@ -1,11 +1,3 @@
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 { SlashCommandBuilder } = require('@discordjs/builders');
const { Collection } = require('discord.js'); const { Collection } = require('discord.js');
const fn = require('../functions.js'); const fn = require('../functions.js');
@ -24,7 +16,7 @@ module.exports = {
.addSubcommand(subcommand => .addSubcommand(subcommand =>
subcommand subcommand
.setName('gifsearch') .setName('gifsearch')
.setDescription('Search Tenor for a GIF.') .setDescription('Search GIPHY for a GIF.')
.addStringOption(option => .addStringOption(option =>
option option
.setName('query') .setName('query')
@ -154,34 +146,34 @@ module.exports = {
iStorage.gifName = gifName; iStorage.gifName = gifName;
iStorage.query = query; iStorage.query = query;
interaction.editReply("Fuck off this is broken, come back later.");
// Search Tenor for the GIF // Search Tenor for the GIF
tenor.Search.Query(query, '20').then(res => { // tenor.Search.Query(query, '20').then(res => {
strings.temp.gifs = []; // strings.temp.gifs = [];
strings.temp.gifIndex = 0; // strings.temp.gifIndex = 0;
strings.temp.gifLimit = res.length - 1; // strings.temp.gifLimit = res.length - 1;
strings.temp.gifUserId = interaction.user.id; // strings.temp.gifUserId = interaction.user.id;
if (res[0] == undefined) { // if (res[0] == undefined) {
interaction.editReply('Sorry I was unable to find a GIF of ' + query); // interaction.editReply('Sorry I was unable to find a GIF of ' + query);
return; // return;
} // }
for (const row of res) { // for (const row of res) {
iStorage.gifsCollection.set(row.id, row); // iStorage.gifsCollection.set(row.id, row);
} // }
// Generate the initial action row // // Generate the initial action row
const actionRow = customEmbeds.actionRows.gifSearchAR('first'); // const actionRow = customEmbeds.actionRows.gifSearchAR('first');
// Get the index built // // Get the index built
const gifPage = Indexer(iStorage.gifsCollection, 0, 1); // const gifPage = Indexer(iStorage.gifsCollection, 0, 1);
gifPage.query = query; // gifPage.query = query;
gifPage.gifName = gifName; // gifPage.gifName = gifName;
// Generate the embed // // Generate the embed
const gifEmbed = Embeds.core.gifSearch({ author: interaction.user.username }, gifPage); // const gifEmbed = Embeds.core.gifSearch({ author: interaction.user.username }, gifPage);
interaction.editReply({ embeds: [gifEmbed], components: [actionRow], ephemeral: true }); // interaction.editReply({ embeds: [gifEmbed], components: [actionRow], ephemeral: true });
}); // });
break; break;
// GIF URL // GIF URL
case "gifurl": case "gifurl":

View File

@ -1,11 +1,3 @@
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 { SlashCommandBuilder } = require('@discordjs/builders');
const { Collection } = require('discord.js'); const { Collection } = require('discord.js');
const fn = require('../functions.js'); const fn = require('../functions.js');