import { client } from '#velvia/client'; import { RegisterType, SlashCommand } from '#velvia/handler'; import { type ChatInputCommandInteraction, PermissionFlagsBits, SlashCommandBuilder, MessageFlags, TextDisplayBuilder, ButtonBuilder, ButtonStyle, ContainerBuilder, SectionBuilder, ThumbnailBuilder, SeparatorBuilder } from 'discord.js'; import axios from 'axios'; export default new SlashCommand({ registerType: RegisterType.Guild, data: new SlashCommandBuilder() .setName('animeinfo') .setDescription('Get information about an anime by its title') .addStringOption(option => option .setName('title') .setDescription('The title of the anime to search for') .setRequired(true) ) .setDefaultMemberPermissions(PermissionFlagsBits.SendMessages) as SlashCommandBuilder, async execute(interaction: ChatInputCommandInteraction): Promise { const animeTitle = interaction.options.getString('title', true).toLowerCase(); try { // Fetch anime data from Jikan API const response = await axios.get(`https://api.jikan.moe/v4/anime?q=${encodeURIComponent(animeTitle)}&limit=1`); if (response.data.data.length === 0) { const errorText = new TextDisplayBuilder() .setContent(`❌ No anime found for **${animeTitle}**. Please try another title.`); const errorContainer = new ContainerBuilder() .addTextDisplayComponents(errorText); await interaction.reply({ flags: MessageFlags.IsComponentsV2, components: [errorContainer] }); return; } const anime = response.data.data[0]; const titleText = new TextDisplayBuilder() .setContent(`# ${anime.title}`); const infoText = new TextDisplayBuilder() .setContent( `${anime.synopsis}\n\n` + `**Score:** ${anime.score || 'N/A'}\n` + `**Episodes:** ${anime.episodes || 'N/A'}\n` + `**Aired:** ${anime.aired.string || 'N/A'}\n` + `**Rank:** ${anime.rank || 'N/A'}` ); const animeSection = new SectionBuilder() .addTextDisplayComponents(titleText, infoText) .setThumbnailAccessory( new ThumbnailBuilder() .setDescription(`Thumbnail for ${anime.title}`) .setURL(anime.images.jpg.image_url) ); const separator = new SeparatorBuilder(); const viewButton = new ButtonBuilder() .setLabel('View on MyAnimeList') .setStyle(ButtonStyle.Link) .setURL(anime.url) .setEmoji('🔗'); const buttonSection = new SectionBuilder() .setButtonAccessory(viewButton); const mainContainer = new ContainerBuilder() .addSectionComponents(animeSection, buttonSection); await interaction.reply({ flags: MessageFlags.IsComponentsV2, components: [mainContainer] }); } catch (error) { console.error(error); const errorText = new TextDisplayBuilder() .setContent('❌ An error occurred while fetching anime data. Please try again later.'); const errorContainer = new ContainerBuilder() .addTextDisplayComponents(errorText); await interaction.reply({ flags: MessageFlags.IsComponentsV2, components: [errorContainer] }); } }, });