From a404c7a97f9b39b1b04ec6d94526d4fdd70779ab Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Fri, 7 Aug 2020 00:09:05 +0300 Subject: [PATCH] auto_reactions: check permissions ahead-of-time --- .../AutoReactions/events/AddReactionsEvt.ts | 37 ++++++++++++------- .../src/plugins/Utility/commands/SourceCmd.ts | 2 +- backend/src/utils/canReadChannel.ts | 4 +- ...ermissions.ts => hasChannelPermissions.ts} | 2 +- .../src/utils/memberHasChannelPermissions.ts | 8 ++++ 5 files changed, 36 insertions(+), 17 deletions(-) rename backend/src/utils/{hasPermissions.ts => hasChannelPermissions.ts} (77%) create mode 100644 backend/src/utils/memberHasChannelPermissions.ts diff --git a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts index 2a4edb57..ccdf5533 100644 --- a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts +++ b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts @@ -3,40 +3,51 @@ import { isDiscordRESTError } from "src/utils"; import { LogType } from "src/data/LogType"; import { logger } from "../../../logger"; import { LogsPlugin } from "../../Logs/LogsPlugin"; +import { Constants, GuildChannel } from "eris"; +import { memberHasChannelPermissions } from "../../../utils/memberHasChannelPermissions"; + +const p = Constants.Permissions; export const AddReactionsEvt = autoReactionsEvt({ event: "messageCreate", allowBots: true, allowSelf: true, - async listener(meta) { - const pluginData = meta.pluginData; - const msg = meta.args.message; - - const autoReaction = await pluginData.state.autoReactions.getForChannel(msg.channel.id); + async listener({ pluginData, args: { message } }) { + const autoReaction = await pluginData.state.autoReactions.getForChannel(message.channel.id); if (!autoReaction) return; + if ( + !memberHasChannelPermissions(message.member, message.channel as GuildChannel, [ + p.readMessages, + p.readMessageHistory, + p.addReactions, + ]) + ) { + const logs = pluginData.getPlugin(LogsPlugin); + logs.log(LogType.BOT_ALERT, { + body: `Missing permissions to apply auto-reactions in <#${message.channel.id}>. Ensure I can read messages, read message history, and add reactions.`, + }); + return; + } + for (const reaction of autoReaction.reactions) { try { - await msg.addReaction(reaction); + await message.addReaction(reaction); } catch (e) { if (isDiscordRESTError(e)) { - logger.warn( - `Could not apply auto-reaction to ${msg.channel.id}/${msg.id} in guild ${pluginData.guild.name} (${pluginData.guild.id}) (error code ${e.code})`, - ); - const logs = pluginData.getPlugin(LogsPlugin); if (e.code === 10008) { logs.log(LogType.BOT_ALERT, { - body: `Could not apply auto-reactions in <#${msg.channel.id}> for message \`${msg.id}\`. Make sure nothing is deleting the message before the reactions are applied.`, + body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Make sure nothing is deleting the message before the reactions are applied.`, }); } else { logs.log(LogType.BOT_ALERT, { - body: `Could not apply auto-reactions in <#${msg.channel.id}> for message \`${msg.id}\`. Error code ${e.code}.`, + body: `Could not apply auto-reactions in <#${message.channel.id}> for message \`${message.id}\`. Error code ${e.code}.`, }); } - return; + break; } else { throw e; } diff --git a/backend/src/plugins/Utility/commands/SourceCmd.ts b/backend/src/plugins/Utility/commands/SourceCmd.ts index 2a4dc4c1..3ebc5b71 100644 --- a/backend/src/plugins/Utility/commands/SourceCmd.ts +++ b/backend/src/plugins/Utility/commands/SourceCmd.ts @@ -4,7 +4,7 @@ import { errorMessage } from "../../../utils"; import { getBaseUrl, sendErrorMessage } from "../../../pluginUtils"; import moment from "moment-timezone"; import { Constants, TextChannel } from "eris"; -import { hasPermissions } from "../../../utils/hasPermissions"; +import { hasChannelPermissions } from "../../../utils/hasChannelPermissions"; import { canReadChannel } from "../../../utils/canReadChannel"; export const SourceCmd = utilityCmd({ diff --git a/backend/src/utils/canReadChannel.ts b/backend/src/utils/canReadChannel.ts index 18feacb1..3f4de5dd 100644 --- a/backend/src/utils/canReadChannel.ts +++ b/backend/src/utils/canReadChannel.ts @@ -1,9 +1,9 @@ import { Constants, GuildChannel } from "eris"; -import { hasPermissions } from "./hasPermissions"; +import { hasChannelPermissions } from "./hasChannelPermissions"; export function canReadChannel(channel: GuildChannel, memberId: string) { const channelPermissions = channel.permissionsOf(memberId); - return hasPermissions(channelPermissions, [ + return hasChannelPermissions(channelPermissions, [ Constants.Permissions.readMessages, Constants.Permissions.readMessageHistory, ]); diff --git a/backend/src/utils/hasPermissions.ts b/backend/src/utils/hasChannelPermissions.ts similarity index 77% rename from backend/src/utils/hasPermissions.ts rename to backend/src/utils/hasChannelPermissions.ts index 03e86d1e..1dfe4088 100644 --- a/backend/src/utils/hasPermissions.ts +++ b/backend/src/utils/hasChannelPermissions.ts @@ -1,6 +1,6 @@ import { Constants, Permission } from "eris"; -export function hasPermissions(channelPermissions: Permission, permissions: number | number[]) { +export function hasChannelPermissions(channelPermissions: Permission, permissions: number | number[]) { if (Boolean(channelPermissions.allow & Constants.Permissions.administrator)) { return true; } diff --git a/backend/src/utils/memberHasChannelPermissions.ts b/backend/src/utils/memberHasChannelPermissions.ts new file mode 100644 index 00000000..7e2f7d42 --- /dev/null +++ b/backend/src/utils/memberHasChannelPermissions.ts @@ -0,0 +1,8 @@ +import { Constants, GuildChannel, Member, Permission } from "eris"; +import { PluginData } from "knub"; +import { hasChannelPermissions } from "./hasChannelPermissions"; + +export function memberHasChannelPermissions(member: Member, channel: GuildChannel, permissions: number | number[]) { + const memberChannelPermissions = channel.permissionsOf(member.id); + return hasChannelPermissions(memberChannelPermissions, permissions); +}