diff --git a/backend/src/plugins/ContextMenus/actions/clean.ts b/backend/src/plugins/ContextMenus/actions/clean.ts index 55ff9d4e..c63ffc1a 100644 --- a/backend/src/plugins/ContextMenus/actions/clean.ts +++ b/backend/src/plugins/ContextMenus/actions/clean.ts @@ -17,9 +17,9 @@ export async function cleanAction( channelId: interaction.channelId, member: executingMember, }); + const utility = pluginData.getPlugin(UtilityPlugin); - // TODO: Add perm check for can_clean in util - if (!userCfg.can_use) { + if (!userCfg.can_use || !(await utility.hasPermission(executingMember, interaction.channelId, "can_clean"))) { await interaction.followUp({ content: "Cannot clean: insufficient permissions" }); return; } @@ -36,7 +36,6 @@ export async function cleanAction( try { interaction.followUp(`Cleaning... Amount: ${amount}, User Only: ${targetUserOnly}, Pins: ${deletePins}`); - const utility = pluginData.getPlugin(UtilityPlugin); utility.clean({ count: amount, user, channel: targetMessage.channel.id, "delete-pins": deletePins }, targetMessage); } catch (e) { interaction.followUp({ ephemeral: true, content: "Plugin error, please check your BOT_ALERTs" }); diff --git a/backend/src/plugins/ContextMenus/actions/mute.ts b/backend/src/plugins/ContextMenus/actions/mute.ts index af9b71ed..d0e85764 100644 --- a/backend/src/plugins/ContextMenus/actions/mute.ts +++ b/backend/src/plugins/ContextMenus/actions/mute.ts @@ -1,5 +1,6 @@ import humanizeDuration from "humanize-duration"; import { GuildPluginData } from "knub"; +import { ModActionsPlugin } from "src/plugins/ModActions/ModActionsPlugin"; import { canActOn } from "src/pluginUtils"; import { LogType } from "../../../data/LogType"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError"; @@ -17,8 +18,8 @@ export async function muteAction(pluginData: GuildPluginData()({ }; }, + hasMutePermission(pluginData) { + return (member: GuildMember, channelId: string) => { + return hasMutePermission(pluginData, member, channelId); + }; + }, + on: mapToPublicFn(onModActionsEvent), off: mapToPublicFn(offModActionsEvent), getEventEmitter(pluginData) { diff --git a/backend/src/plugins/ModActions/functions/hasMutePerm.ts b/backend/src/plugins/ModActions/functions/hasMutePerm.ts new file mode 100644 index 00000000..b26edd4d --- /dev/null +++ b/backend/src/plugins/ModActions/functions/hasMutePerm.ts @@ -0,0 +1,11 @@ +import { GuildMember, Snowflake } from "discord.js"; +import { GuildPluginData } from "knub"; +import { ModActionsPluginType } from "../types"; + +export async function hasMutePermission( + pluginData: GuildPluginData, + member: GuildMember, + channelId: Snowflake, +) { + return (await pluginData.config.getMatchingConfig({ member, channelId })).can_mute; +} diff --git a/backend/src/plugins/Utility/UtilityPlugin.ts b/backend/src/plugins/Utility/UtilityPlugin.ts index 9a624ed8..138100af 100644 --- a/backend/src/plugins/Utility/UtilityPlugin.ts +++ b/backend/src/plugins/Utility/UtilityPlugin.ts @@ -1,4 +1,4 @@ -import { MessageEmbedOptions } from "discord.js"; +import { GuildMember, MessageEmbedOptions } from "discord.js"; import { PluginOptions } from "knub"; import { GuildArchives } from "../../data/GuildArchives"; import { GuildCases } from "../../data/GuildCases"; @@ -38,6 +38,7 @@ import { VcdisconnectCmd } from "./commands/VcdisconnectCmd"; import { VcmoveAllCmd, VcmoveCmd } from "./commands/VcmoveCmd"; import { AutoJoinThreadEvt, AutoJoinThreadSyncEvt } from "./events/AutoJoinThreadEvt"; import { getUserInfoEmbed } from "./functions/getUserInfoEmbed"; +import { hasPermission } from "./functions/hasPermission"; import { activeReloads } from "./guildReloads"; import { refreshMembersIfNeeded } from "./refreshMembers"; import { ConfigSchema, UtilityPluginType } from "./types"; @@ -170,6 +171,12 @@ export const UtilityPlugin = zeppelinGuildPlugin()({ return getUserInfoEmbed(pluginData, userId, false, requestMemberId); }; }, + + hasPermission(pluginData) { + return (member: GuildMember, channelId: string, permission: string) => { + return hasPermission(pluginData, member, channelId, permission); + }; + }, }, beforeLoad(pluginData) { diff --git a/backend/src/plugins/Utility/functions/hasPermission.ts b/backend/src/plugins/Utility/functions/hasPermission.ts new file mode 100644 index 00000000..919d28f7 --- /dev/null +++ b/backend/src/plugins/Utility/functions/hasPermission.ts @@ -0,0 +1,12 @@ +import { GuildMember, Snowflake } from "discord.js"; +import { GuildPluginData } from "knub"; +import { UtilityPluginType } from "../types"; + +export async function hasPermission( + pluginData: GuildPluginData, + member: GuildMember, + channelId: Snowflake, + permission: string, +) { + return (await pluginData.config.getMatchingConfig({ member, channelId }))[permission]; +}