Files
ButlerBot/src/commands/eyecandy.ts
2024-09-16 09:56:40 +00:00

63 lines
2.0 KiB
TypeScript

import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js';
import axios from 'axios';
const GIPHY_API_URL = 'http://api.giphy.com/v1/gifs/search';
// Initialise the command data.
export const data = new SlashCommandBuilder()
.setName('eyecandy')
.setDescription('Returns a random gif of Gerard Butler.');
console.log(`Loaded ${data.name} command.`);
/**
* Execute the command, fetch a random Gerard Butler gif, and send it to the user.
* @param interaction The interaction that triggered the command.
* @returns A promise that resolves when the command is finished executing.
*/
export async function execute(
interaction: ChatInputCommandInteraction
): Promise<void> {
await interaction.deferReply();
if (!process.env.GIPHY_API_KEY) {
await interaction.reply('The bot is missing the GIPHY API key.');
return;
}
try {
// Fetch a random gif of Gerard Butler.
const gifUrl = await fetchGif();
// Reply with the gif.
await interaction.editReply(gifUrl);
} catch (error: any) {
console.error('Error executing the command:', error.message);
await interaction.editReply(`An error occurred: ${error.message}`);
}
}
/**
* Fetch a random gif of Gerard Butler from Giphy.
* @returns A promise that resolves to the URL of the gif.
* @throws An error if no gif is found or if the request fails.
*/
async function fetchGif(): Promise<string> {
const randomOffset = Math.floor(Math.random() * 100);
const giphyQueryUrl = `${GIPHY_API_URL}?api_key=${process.env.GIPHY_API_KEY}&q=gerard+butler&limit=1&offset=${randomOffset}`;
try {
const response = await axios.get(giphyQueryUrl, { timeout: 5000 });
const result = response.data;
if (result.data.length === 0) {
throw new Error('No gifs found for the given query.');
}
return result.data[0].images.original.url;
} catch (error: any) {
console.error('Error fetching GIF:', error.message);
throw new Error('Failed to retrieve a GIF from Giphy.');
}
}