diff --git a/commands/utilities/roleinfo.js b/commands/utilities/roleinfo.js new file mode 100644 index 0000000..c084ae0 --- /dev/null +++ b/commands/utilities/roleinfo.js @@ -0,0 +1,52 @@ +const { SlashCommandBuilder, EmbedBuilder, PermissionsBitField } = require('discord.js'); + +module.exports = { + data: new SlashCommandBuilder() + .setName('roleinfo') + .setDescription('Provides information about the targetted role.') + .addRoleOption(option => + option + .setName('role') + .setDescription('Which role are you checking?') + .setRequired(true)) + .setDMPermission(false), + async execute(interaction) { + const role = interaction.options.getRole('role'); + const role_color = role.hexColor !== '#000000' ? role.hexColor : '#99aab5'; + const role_color_url_safe = role_color.toString().replace('#', ''); + const formattedCreationDate = ``; + let managed = role.managed ? 'True' : 'False'; + let managed_description = ''; + if (managed == 'True') { + if (role.tags.botId) { + managed_description += `\n**Management Type:** Managed Bot Role\n**Managed By:** <@${String(role.tags.botId)}>`; + } else if (role.tags.premiumSubscriberRole) { + managed_description += '\n**Management Type:** Nitro Booster Role'; + } else if (role.tags.guildConnections) { + managed_description += '\n**Management Type:** Guild Connections Role'; + } else if (role.tags.availableForPurchase) { + managed_description += '\n**Management Type:** Subscription Role'; + } + } + managed += managed_description; + const embed = new EmbedBuilder() + .setColor(role_color) + .setTitle(role.name) + .setDescription(`**ID:** ${role.id}\n**Mention:** ${role}\n**Creation Date:** ${formattedCreationDate}\n**Color:** [${role_color}](https://www.color-hex.com/color/${role_color_url_safe})\n**Hoisted:** ${role.hoist ? 'True' : 'False'}\n**Position:** ${role.position}\n **Managed:** ${managed}\n**Mentionable:** ${role.mentionable ? 'True' : 'False'}\n**Administrator:** ${role.permissions.has([PermissionsBitField.Flags.Administrator]) ? 'True' : 'False'}`); + if (role.icon) { + embed.setThumbnail(role.iconURL()); + } else if (role.unicodeEmoji) { + embed.setThumbnail(await fetchTwemoji(role.unicodeEmoji)); + } + await interaction.reply({ embeds: [embed], ephemeral: true }); + }, +}; + +async function fetchTwemoji(unicodeEmoji) { + const base_url = 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/72x72/'; + const emojiCodepoint = unicodeEmoji.split('').map(char => char.charCodeAt(0).toString(16)).join('-'); + const segments = emojiCodepoint.split('-'); + const validSegments = segments.filter(seg => seg.length >= 4); + const emojiUrl = `${base_url}${validSegments[0]}.png`; + return emojiUrl; +}