From 76d4efcaf3ee2ea4d6feb1db1fa4cd1bbf42d70d Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Thu, 6 Aug 2020 01:54:46 +0300 Subject: [PATCH] Add support for messageTarget input in commands that take a message id --- backend/src/plugins/Post/commands/EditCmd.ts | 4 +-- .../src/plugins/Post/commands/EditEmbedCmd.ts | 4 +-- .../commands/ClearReactionRolesCmd.ts | 15 +++-------- .../commands/InitReactionRolesCmd.ts | 22 ++++++++-------- .../commands/RefreshReactionRolesCmd.ts | 12 +++------ .../plugins/Utility/commands/ContextCmd.ts | 26 ++++++++++++++----- 6 files changed, 42 insertions(+), 41 deletions(-) diff --git a/backend/src/plugins/Post/commands/EditCmd.ts b/backend/src/plugins/Post/commands/EditCmd.ts index 21594e13..d061f8a9 100644 --- a/backend/src/plugins/Post/commands/EditCmd.ts +++ b/backend/src/plugins/Post/commands/EditCmd.ts @@ -8,12 +8,12 @@ export const EditCmd = postCmd({ permission: "can_post", signature: { - messageId: ct.string(), + message: ct.messageTarget(), content: ct.string({ catchAll: true }), }, async run({ message: msg, args, pluginData }) { - const savedMessage = await pluginData.state.savedMessages.find(args.messageId); + const savedMessage = await pluginData.state.savedMessages.find(args.message.messageId); if (!savedMessage) { sendErrorMessage(pluginData, msg.channel, "Unknown message"); return; diff --git a/backend/src/plugins/Post/commands/EditEmbedCmd.ts b/backend/src/plugins/Post/commands/EditEmbedCmd.ts index 4ccb4d98..9cfdf357 100644 --- a/backend/src/plugins/Post/commands/EditEmbedCmd.ts +++ b/backend/src/plugins/Post/commands/EditEmbedCmd.ts @@ -12,7 +12,7 @@ export const EditEmbedCmd = postCmd({ permission: "can_post", signature: { - messageId: ct.string(), + message: ct.messageTarget(), maincontent: ct.string({ catchAll: true }), title: ct.string({ option: true }), @@ -21,7 +21,7 @@ export const EditEmbedCmd = postCmd({ }, async run({ message: msg, args, pluginData }) { - const savedMessage = await pluginData.state.savedMessages.find(args.messageId); + const savedMessage = await pluginData.state.savedMessages.find(args.message.messageId); if (!savedMessage) { sendErrorMessage(pluginData, msg.channel, "Unknown message"); return; diff --git a/backend/src/plugins/ReactionRoles/commands/ClearReactionRolesCmd.ts b/backend/src/plugins/ReactionRoles/commands/ClearReactionRolesCmd.ts index f08e07bc..5c7ed88d 100644 --- a/backend/src/plugins/ReactionRoles/commands/ClearReactionRolesCmd.ts +++ b/backend/src/plugins/ReactionRoles/commands/ClearReactionRolesCmd.ts @@ -8,26 +8,19 @@ export const ClearReactionRolesCmd = reactionRolesCmd({ permission: "can_manage", signature: { - messageId: ct.string(), + message: ct.messageTarget(), }, async run({ message: msg, args, pluginData }) { - const savedMessage = await pluginData.state.savedMessages.find(args.messageId); - if (!savedMessage) { - sendErrorMessage(pluginData, msg.channel, "Unknown message"); - return; - } - - const existingReactionRoles = pluginData.state.reactionRoles.getForMessage(args.messageId); + const existingReactionRoles = pluginData.state.reactionRoles.getForMessage(args.message.messageId); if (!existingReactionRoles) { sendErrorMessage(pluginData, msg.channel, "Message doesn't have reaction roles on it"); return; } - pluginData.state.reactionRoles.removeFromMessage(args.messageId); + pluginData.state.reactionRoles.removeFromMessage(args.message.messageId); - const channel = pluginData.guild.channels.get(savedMessage.channel_id) as TextChannel; - const targetMessage = await channel.getMessage(savedMessage.id); + const targetMessage = await args.message.channel.getMessage(args.message.messageId); await targetMessage.removeReactions(); sendSuccessMessage(pluginData, msg.channel, "Reaction roles cleared"); diff --git a/backend/src/plugins/ReactionRoles/commands/InitReactionRolesCmd.ts b/backend/src/plugins/ReactionRoles/commands/InitReactionRolesCmd.ts index e06bae9d..4675c0d1 100644 --- a/backend/src/plugins/ReactionRoles/commands/InitReactionRolesCmd.ts +++ b/backend/src/plugins/ReactionRoles/commands/InitReactionRolesCmd.ts @@ -5,6 +5,7 @@ import { TextChannel } from "eris"; import { RecoverablePluginError, ERRORS } from "src/RecoverablePluginError"; import { canUseEmoji, noop } from "../../../utils"; import { applyReactionRoleReactionsToMessage } from "../util/applyReactionRoleReactionsToMessage"; +import { canReadChannel } from "../../../utils/canReadChannel"; const CLEAR_ROLES_EMOJI = "❌"; @@ -13,26 +14,19 @@ export const InitReactionRolesCmd = reactionRolesCmd({ permission: "can_manage", signature: { - messageId: ct.string(), + message: ct.messageTarget(), reactionRolePairs: ct.string({ catchAll: true }), exclusive: ct.bool({ option: true, isSwitch: true, shortcut: "e" }), }, async run({ message: msg, args, pluginData }) { - const savedMessage = await pluginData.state.savedMessages.find(args.messageId); - if (!savedMessage) { + if (!canReadChannel(args.message.channel, msg.member.id)) { sendErrorMessage(pluginData, msg.channel, "Unknown message"); return; } - const channel = (await pluginData.guild.channels.get(savedMessage.channel_id)) as TextChannel; - if (!channel || !(channel instanceof TextChannel)) { - sendErrorMessage(pluginData, msg.channel, "Channel no longer exists"); - return; - } - - const targetMessage = await channel.getMessage(args.messageId); + const targetMessage = await args.message.channel.getMessage(args.message.messageId); if (!targetMessage) { sendErrorMessage(pluginData, msg.channel, "Unknown message (2)"); return; @@ -97,7 +91,13 @@ export const InitReactionRolesCmd = reactionRolesCmd({ // Save the new reaction roles to the database for (const pair of emojiRolePairs) { - await pluginData.state.reactionRoles.add(channel.id, targetMessage.id, pair[0], pair[1], args.exclusive); + await pluginData.state.reactionRoles.add( + args.message.channel.id, + targetMessage.id, + pair[0], + pair[1], + args.exclusive, + ); } // Apply the reactions themselves diff --git a/backend/src/plugins/ReactionRoles/commands/RefreshReactionRolesCmd.ts b/backend/src/plugins/ReactionRoles/commands/RefreshReactionRolesCmd.ts index 0a9fe103..0848a31e 100644 --- a/backend/src/plugins/ReactionRoles/commands/RefreshReactionRolesCmd.ts +++ b/backend/src/plugins/ReactionRoles/commands/RefreshReactionRolesCmd.ts @@ -8,22 +8,16 @@ export const RefreshReactionRolesCmd = reactionRolesCmd({ permission: "can_manage", signature: { - messageId: ct.string(), + message: ct.messageTarget(), }, async run({ message: msg, args, pluginData }) { - const savedMessage = await pluginData.state.savedMessages.find(args.messageId); - if (!savedMessage) { - sendErrorMessage(pluginData, msg.channel, "Unknown message"); - return; - } - - if (pluginData.state.pendingRefreshes.has(`${savedMessage.channel_id}-${savedMessage.id}`)) { + if (pluginData.state.pendingRefreshes.has(`${args.message.channel.id}-${args.message.messageId}`)) { sendErrorMessage(pluginData, msg.channel, "Another refresh in progress"); return; } - await refreshReactionRoles(pluginData, savedMessage.channel_id, savedMessage.id); + await refreshReactionRoles(pluginData, args.message.channel.id, args.message.messageId); sendSuccessMessage(pluginData, msg.channel, "Reaction roles refreshed"); }, diff --git a/backend/src/plugins/Utility/commands/ContextCmd.ts b/backend/src/plugins/Utility/commands/ContextCmd.ts index 3ef71e8d..a024ff5b 100644 --- a/backend/src/plugins/Utility/commands/ContextCmd.ts +++ b/backend/src/plugins/Utility/commands/ContextCmd.ts @@ -3,6 +3,7 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { messageLink } from "../../../utils"; import { sendErrorMessage } from "../../../pluginUtils"; import { TextChannel } from "eris"; +import { canReadChannel } from "../../../utils/canReadChannel"; export const ContextCmd = utilityCmd({ trigger: "context", @@ -10,18 +11,31 @@ export const ContextCmd = utilityCmd({ usage: "!context 94882524378968064 650391267720822785", permission: "can_context", - signature: { - channel: ct.channel(), - messageId: ct.string(), - }, + signature: [ + { + message: ct.messageTarget(), + }, + { + channel: ct.channel(), + messageId: ct.string(), + }, + ], async run({ message: msg, args, pluginData }) { - if (!(args.channel instanceof TextChannel)) { + if (args.channel && !(args.channel instanceof TextChannel)) { sendErrorMessage(pluginData, msg.channel, "Channel must be a text channel"); return; } - const previousMessage = (await pluginData.client.getMessages(args.channel.id, 1, args.messageId))[0]; + const channel = args.channel || args.message.channel; + const messageId = args.messageId || args.message.messageId; + + if (!canReadChannel(channel, msg.member.id)) { + sendErrorMessage(pluginData, msg.channel, "Message context not found"); + return; + } + + const previousMessage = (await pluginData.client.getMessages(channel.id, 1, messageId))[0]; if (!previousMessage) { sendErrorMessage(pluginData, msg.channel, "Message context not found"); return;