diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index db17931e..6da212cd 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -26,7 +26,6 @@ import { ReloadGuildCmd } from "./commands/ReloadGuildCmd"; import { JumboCmd } from "./commands/JumboCmd"; import { AvatarCmd } from "./commands/AvatarCmd"; import { CleanCmd } from "./commands/CleanCmd"; -import { Message } from "eris"; import { InviteInfoCmd } from "./commands/InviteInfoCmd"; import { ChannelInfoCmd } from "./commands/ChannelInfoCmd"; import { MessageInfoCmd } from "./commands/MessageInfoCmd"; @@ -38,6 +37,7 @@ import { VcdisconnectCmd } from "./commands/VcdisconnectCmd"; import { ModActionsPlugin } from "../ModActions/ModActionsPlugin"; import { refreshMembersIfNeeded } from "./refreshMembers"; import { RoleInfoCmd } from "./commands/RoleInfoCmd"; +import { EmojiInfoCmd } from "./commands/EmojiInfoCmd"; const defaultOptions: PluginOptions = { config: { @@ -52,6 +52,7 @@ const defaultOptions: PluginOptions = { can_messageinfo: false, can_userinfo: false, can_roleinfo: false, + can_emojiinfo: false, can_snowflake: false, can_reload_guild: false, can_nickname: false, @@ -82,6 +83,7 @@ const defaultOptions: PluginOptions = { can_messageinfo: true, can_userinfo: true, can_roleinfo: true, + can_emojiinfo: true, can_snowflake: true, can_nickname: true, can_vcmove: true, @@ -142,6 +144,7 @@ export const UtilityPlugin = zeppelinGuildPlugin()("utility", InfoCmd, SnowflakeInfoCmd, RoleInfoCmd, + EmojiInfoCmd, ], onLoad(pluginData) { diff --git a/backend/src/plugins/Utility/commands/EmojiInfoCmd.ts b/backend/src/plugins/Utility/commands/EmojiInfoCmd.ts new file mode 100644 index 00000000..41889509 --- /dev/null +++ b/backend/src/plugins/Utility/commands/EmojiInfoCmd.ts @@ -0,0 +1,32 @@ +import { utilityCmd } from "../types"; +import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { sendErrorMessage } from "../../../pluginUtils"; +import { customEmojiRegex } from "../../../utils"; +import { getEmojiInfoEmbed } from "../functions/getEmojiInfoEmbed"; + +export const EmojiInfoCmd = utilityCmd({ + trigger: ["emoji", "emojiinfo"], + description: "Show information about an emoji", + usage: "!emoji 106391128718245888", + permission: "can_emojiinfo", + + signature: { + emoji: ct.string({ required: false }), + }, + + async run({ message, args, pluginData }) { + const emojiIdMatch = args.emoji.match(customEmojiRegex); + if (!emojiIdMatch?.[2]) { + sendErrorMessage(pluginData, message.channel, "Emoji not found"); + return; + } + + const embed = await getEmojiInfoEmbed(pluginData, emojiIdMatch[2]); + if (!embed) { + sendErrorMessage(pluginData, message.channel, "Emoji not found"); + return; + } + + message.channel.createMessage({ embed }); + }, +}); diff --git a/backend/src/plugins/Utility/commands/InfoCmd.ts b/backend/src/plugins/Utility/commands/InfoCmd.ts index c3a61e5a..0cf9a9b0 100644 --- a/backend/src/plugins/Utility/commands/InfoCmd.ts +++ b/backend/src/plugins/Utility/commands/InfoCmd.ts @@ -2,7 +2,7 @@ import { utilityCmd } from "../types"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { sendErrorMessage } from "../../../pluginUtils"; import { getInviteInfoEmbed } from "../functions/getInviteInfoEmbed"; -import { isValidSnowflake, parseInviteCodeInput, resolveInvite, resolveUser } from "../../../utils"; +import { customEmojiRegex, isValidSnowflake, parseInviteCodeInput, resolveInvite, resolveUser } from "../../../utils"; import { getUserInfoEmbed } from "../functions/getUserInfoEmbed"; import { resolveMessageTarget } from "../../../utils/resolveMessageTarget"; import { canReadChannel } from "../../../utils/canReadChannel"; @@ -13,6 +13,7 @@ import { getChannelId, getRoleId } from "knub/dist/utils"; import { getGuildPreview } from "../functions/getGuildPreview"; import { getSnowflakeInfoEmbed } from "../functions/getSnowflakeInfoEmbed"; import { getRoleInfoEmbed } from "../functions/getRoleInfoEmbed"; +import { getEmojiInfoEmbed } from "../functions/getEmojiInfoEmbed"; export const InfoCmd = utilityCmd({ trigger: "info", @@ -114,7 +115,15 @@ export const InfoCmd = utilityCmd({ return; } - // TODO: 8. Emoji ID + // 8. Emoji + const emojiIdMatch = value.match(customEmojiRegex); + if (emojiIdMatch?.[2] && userCfg.can_emojiinfo) { + const embed = await getEmojiInfoEmbed(pluginData, emojiIdMatch[2]); + if (embed) { + message.channel.createMessage({ embed }); + return; + } + } // 9. Arbitrary ID if (isValidSnowflake(value) && userCfg.can_snowflake) { diff --git a/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts b/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts new file mode 100644 index 00000000..28ee5712 --- /dev/null +++ b/backend/src/plugins/Utility/functions/getEmojiInfoEmbed.ts @@ -0,0 +1,34 @@ +import { EmbedOptions } from "eris"; +import { GuildPluginData } from "knub"; +import { UtilityPluginType } from "../types"; +import { trimLines, preEmbedPadding, EmbedWith } from "../../../utils"; + +export async function getEmojiInfoEmbed( + pluginData: GuildPluginData, + emojiId: string, +): Promise { + const emoji = pluginData.guild.emojis.find(e => e.id === emojiId); + if (!emoji) { + return null; + } + + const embed: EmbedWith<"fields"> = { + fields: [], + }; + + embed.author = { + name: `Emoji: ${emoji.name}`, + icon_url: `https://cdn.discordapp.com/emojis/${emoji.id}.${emoji.animated ? "gif" : "png"}?v=1`, + }; + + embed.fields.push({ + name: preEmbedPadding + "Emoji information", + value: trimLines(` + Name: **${emoji.name}** + ID: \`${emoji.id}\` + Animated: **${emoji.animated ? "Yes" : "No"}** + `), + }); + + return embed; +} diff --git a/backend/src/plugins/Utility/types.ts b/backend/src/plugins/Utility/types.ts index c51d9c62..2da7a559 100644 --- a/backend/src/plugins/Utility/types.ts +++ b/backend/src/plugins/Utility/types.ts @@ -19,6 +19,7 @@ export const ConfigSchema = t.type({ can_messageinfo: t.boolean, can_userinfo: t.boolean, can_roleinfo: t.boolean, + can_emojiinfo: t.boolean, can_snowflake: t.boolean, can_reload_guild: t.boolean, can_nickname: t.boolean,