const { SlashCommandBuilder, MessageFlags, ActionRowBuilder, ButtonBuilder, ButtonStyle, Client, GatewayIntentBits, TextDisplayBuilder, ContainerBuilder, MediaGalleryBuilder, SeparatorBuilder } = require('discord.js'); module.exports = { name: 'avatar', aliases: ['av'], data: new SlashCommandBuilder() .setName('avatar') .setDescription('Display the avatar of a user') .addUserOption(option => option.setName('utilisateur') .setDescription('A user to see the avatar of') ), async executePrefix(message, args) { let user; if (message.mentions.users.size > 0) { user = message.mentions.users.first(); } else if (args.length > 0) { const possibleId = args[0].replace(/[<@!>]/g, ''); if (/^\d{17,19}$/.test(possibleId)) { try { user = await message.client.users.fetch(possibleId); } catch { // invalid ID or user not found } } } if (!user) user = message.author; const member = message.guild.members.cache.get(user.id); const displayName = member ? member.displayName : user.username; // Avatar URLs const avatarUrlPNG = user.displayAvatarURL({ format: 'png', size: 1024, dynamic: true }); const avatarUrlJPG = user.displayAvatarURL({ format: 'jpg', size: 1024, dynamic: true }); const avatarUrlWEBP = user.displayAvatarURL({ format: 'webp', size: 1024, dynamic: true }); // Build the components const titleText = new TextDisplayBuilder() .setContent(`## <:setting:1384138583312695356> ${displayName} Avatar`); const separatorLargeTop = new SeparatorBuilder().setDivider(false); const separatorLargeBottom = new SeparatorBuilder().setDivider(false); const avatarImage = new MediaGalleryBuilder().addItems([ { media: { url: avatarUrlPNG } } ]); const buttons = new ActionRowBuilder() .addComponents( new ButtonBuilder().setLabel('PNG').setStyle(ButtonStyle.Link).setURL(avatarUrlPNG), new ButtonBuilder().setLabel('JPG').setStyle(ButtonStyle.Link).setURL(avatarUrlJPG), new ButtonBuilder().setLabel('WEBP').setStyle(ButtonStyle.Link).setURL(avatarUrlWEBP) ); const containerComponent = new ContainerBuilder() .addTextDisplayComponents(titleText) .addSeparatorComponents(separatorLargeTop) .addMediaGalleryComponents(avatarImage) .addSeparatorComponents(separatorLargeBottom); await message.channel.send({ content: null, flags: MessageFlags.IsComponentsV2, components: [containerComponent, buttons] }); }, async executeSlash(interaction) { const user = interaction.options.getUser('utilisateur') || interaction.user; // Avatar URLs const avatarUrlPNG = user.displayAvatarURL({ format: 'png', size: 1024, dynamic: true }); const avatarUrlJPG = user.displayAvatarURL({ format: 'jpg', size: 1024, dynamic: true }); const avatarUrlWEBP = user.displayAvatarURL({ format: 'webp', size: 1024, dynamic: true }); const titleText = new TextDisplayBuilder() .setContent(`### Avatar de ${user.username}`); const separatorLargeTop = new SeparatorBuilder().setDivider(false); const separatorLargeBottom = new SeparatorBuilder().setDivider(false); const avatarImage = new MediaGalleryBuilder().addItems([ { media: { url: avatarUrlPNG } } ]); const buttons = new ActionRowBuilder() .addComponents( new ButtonBuilder().setLabel('PNG').setStyle(ButtonStyle.Link).setURL(avatarUrlPNG), new ButtonBuilder().setLabel('JPG').setStyle(ButtonStyle.Link).setURL(avatarUrlJPG), new ButtonBuilder().setLabel('WEBP').setStyle(ButtonStyle.Link).setURL(avatarUrlWEBP) ); const containerComponent = new ContainerBuilder() .addTextDisplayComponents(titleText) .addSeparatorComponents(separatorLargeTop) .addMediaGalleryComponents(avatarImage) .addSeparatorComponents(separatorLargeBottom); await interaction.reply({ content: null, fetchReply: true, flags: MessageFlags.IsComponentsV2, components: [containerComponent, buttons] }); } };