diff --git a/backend/src/plugins/ModActions/ModActionsPlugin.ts b/backend/src/plugins/ModActions/ModActionsPlugin.ts index 8efc5c4b..075c6d6f 100644 --- a/backend/src/plugins/ModActions/ModActionsPlugin.ts +++ b/backend/src/plugins/ModActions/ModActionsPlugin.ts @@ -170,26 +170,26 @@ export const ModActionsPlugin = zeppelinGuildPlugin()({ description: "Moderation actions", defaultMemberPermissions: "0", subcommands: [ - { type: "slash", ...AddCaseSlashCmd }, - { type: "slash", ...BanSlashCmd }, - { type: "slash", ...CaseSlashCmd }, - { type: "slash", ...CasesSlashCmd }, - { type: "slash", ...DeleteCaseSlashCmd }, - { type: "slash", ...ForceBanSlashCmd }, - { type: "slash", ...ForceMuteSlashCmd }, - { type: "slash", ...ForceUnmuteSlashCmd }, - { type: "slash", ...HideCaseSlashCmd }, - { type: "slash", ...KickSlashCmd }, - { type: "slash", ...MassBanSlashCmd }, - { type: "slash", ...MassMuteSlashSlashCmd }, - { type: "slash", ...MassUnbanSlashCmd }, - { type: "slash", ...MuteSlashCmd }, - { type: "slash", ...NoteSlashCmd }, - { type: "slash", ...UnbanSlashCmd }, - { type: "slash", ...UnhideCaseSlashCmd }, - { type: "slash", ...UnmuteSlashCmd }, - { type: "slash", ...UpdateSlashCmd }, - { type: "slash", ...WarnSlashCmd }, + AddCaseSlashCmd, + BanSlashCmd, + CaseSlashCmd, + CasesSlashCmd, + DeleteCaseSlashCmd, + ForceBanSlashCmd, + ForceMuteSlashCmd, + ForceUnmuteSlashCmd, + HideCaseSlashCmd, + KickSlashCmd, + MassBanSlashCmd, + MassMuteSlashSlashCmd, + MassUnbanSlashCmd, + MuteSlashCmd, + NoteSlashCmd, + UnbanSlashCmd, + UnhideCaseSlashCmd, + UnmuteSlashCmd, + UpdateSlashCmd, + WarnSlashCmd, ], }), ], diff --git a/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts index c8ee903e..5f427686 100644 --- a/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/addcase/AddCaseSlashCmd.ts @@ -1,9 +1,12 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { CaseTypes } from "../../../../data/CaseTypes"; import { hasPermission } from "../../../../pluginUtils"; +import { resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualAddCaseCmd } from "../../functions/actualCommands/actualAddCaseCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -15,7 +18,7 @@ const opts = [ }), ]; -export const AddCaseSlashCmd = { +export const AddCaseSlashCmd = modActionsSlashCmd({ name: "addcase", configPermission: "can_addcase", description: "Add an arbitrary case to the specified user without taking any action", @@ -38,7 +41,7 @@ export const AddCaseSlashCmd = { const attachments = retrieveMultipleOptions(NUMBER_ATTACHMENTS_CASE_CREATION, options, "attachment"); // The moderator who did the action is the message author or, if used, the specified -mod - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -52,13 +55,13 @@ export const AddCaseSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } actualAddCaseCmd( pluginData, interaction, - interaction.member, + interaction.member as GuildMember, mod, attachments, options.user, @@ -66,4 +69,4 @@ export const AddCaseSlashCmd = { options.reason || "", ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts b/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts index c1b0ebcd..21b5558a 100644 --- a/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/ban/BanSlashCmd.ts @@ -1,11 +1,12 @@ -import { ChannelType } from "discord.js"; +import { ChannelType, GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; -import { UserNotificationMethod, convertDelayStringToMS } from "../../../../utils"; +import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualBanCmd } from "../../functions/actualCommands/actualBanCmd"; import { readContactMethodsFromArgs } from "../../functions/readContactMethodsFromArgs"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -38,7 +39,7 @@ const opts = [ }), ]; -export const BanSlashCmd = { +export const BanSlashCmd = modActionsSlashCmd({ name: "ban", configPermission: "can_ban", description: "Ban or Tempban the specified member", @@ -58,7 +59,7 @@ export const BanSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -72,7 +73,7 @@ export const BanSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } let contactMethods: UserNotificationMethod[] | undefined; @@ -96,9 +97,9 @@ export const BanSlashCmd = { convertedTime, options.reason || "", attachments, - interaction.member, + interaction.member as GuildMember, mod, contactMethods, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts index 8db48612..15f2d03f 100644 --- a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts @@ -1,11 +1,12 @@ import { slashOptions } from "knub"; import { actualCaseCmd } from "../../functions/actualCommands/actualCaseCmd"; +import { modActionsSlashCmd } from "../../types"; const opts = [ slashOptions.boolean({ name: "show", description: "To make the result visible to everyone", required: false }), ]; -export const CaseSlashCmd = { +export const CaseSlashCmd = modActionsSlashCmd({ name: "case", configPermission: "can_view", description: "Show information about a specific case", @@ -21,4 +22,4 @@ export const CaseSlashCmd = { await interaction.deferReply({ ephemeral: options.show !== true }); actualCaseCmd(pluginData, interaction, interaction.user.id, options["case-number"], options.show); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts index ff29588d..8e885d1a 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts @@ -1,5 +1,7 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { actualCasesCmd } from "../../functions/actualCommands/actualCasesCmd"; +import { modActionsSlashCmd } from "../../types"; const opts = [ slashOptions.user({ name: "user", description: "The user to show cases for", required: false }), @@ -21,7 +23,7 @@ const opts = [ slashOptions.boolean({ name: "show", description: "To make the result visible to everyone", required: false }), ]; -export const CasesSlashCmd = { +export const CasesSlashCmd = modActionsSlashCmd({ name: "cases", configPermission: "can_view", description: "Show a list of cases the specified user has or the specified mod made", @@ -35,9 +37,9 @@ export const CasesSlashCmd = { return actualCasesCmd( pluginData, interaction, - options.mod, + options.mod?.id ?? null, options.user, - interaction.member, + interaction.member as GuildMember, options.notes, options.warns, options.mutes, @@ -51,4 +53,4 @@ export const CasesSlashCmd = { options.show, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts index 89004847..f852b666 100644 --- a/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/deletecase/DeleteCaseSlashCmd.ts @@ -1,9 +1,11 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { actualDeleteCaseCmd } from "../../functions/actualCommands/actualDeleteCaseCmd"; +import { modActionsSlashCmd } from "../../types"; const opts = [slashOptions.boolean({ name: "force", description: "Whether or not to force delete", required: false })]; -export const DeleteCaseSlashCmd = { +export const DeleteCaseSlashCmd = modActionsSlashCmd({ name: "deletecase", configPermission: "can_deletecase", description: "Delete the specified case. This operation can *not* be reversed.", @@ -21,9 +23,9 @@ export const DeleteCaseSlashCmd = { actualDeleteCaseCmd( pluginData, interaction, - interaction.member, - options["case-number"].split(/[\s,]+/), + interaction.member as GuildMember, + options["case-number"].split(/\D+/).map(Number), !!options.force, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts b/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts index 059ff2de..7f7e824c 100644 --- a/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceban/ForceBanSlashCmd.ts @@ -1,9 +1,11 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; -import { convertDelayStringToMS } from "../../../../utils"; +import { convertDelayStringToMS, resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualForceBanCmd } from "../../functions/actualCommands/actualForceBanCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -15,7 +17,7 @@ const opts = [ }), ]; -export const ForceBanSlashCmd = { +export const ForceBanSlashCmd = modActionsSlashCmd({ name: "forceban", configPermission: "can_ban", description: "Force-ban the specified user, even if they aren't on the server", @@ -35,7 +37,7 @@ export const ForceBanSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -49,7 +51,7 @@ export const ForceBanSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } const convertedTime = options.time ? convertDelayStringToMS(options.time) : null; @@ -58,6 +60,14 @@ export const ForceBanSlashCmd = { return; } - actualForceBanCmd(pluginData, interaction, interaction.user.id, options.user, options.reason, attachments, mod); + actualForceBanCmd( + pluginData, + interaction, + interaction.user.id, + options.user, + options.reason ?? "", + attachments, + mod, + ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts index 6f7fa2ca..348ff047 100644 --- a/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forcemute/ForceMuteSlashCmd.ts @@ -1,11 +1,12 @@ -import { ChannelType } from "discord.js"; +import { ChannelType, GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; -import { UserNotificationMethod, convertDelayStringToMS } from "../../../../utils"; +import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualMuteCmd } from "../../functions/actualCommands/actualMuteCmd"; import { readContactMethodsFromArgs } from "../../functions/readContactMethodsFromArgs"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -33,7 +34,7 @@ const opts = [ }), ]; -export const ForceMuteSlashCmd = { +export const ForceMuteSlashCmd = modActionsSlashCmd({ name: "forcemute", configPermission: "can_mute", description: "Force-mute the specified user, even if they're not on the server", @@ -53,7 +54,7 @@ export const ForceMuteSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; let ppId: string | undefined; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, @@ -68,7 +69,7 @@ export const ForceMuteSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; ppId = interaction.user.id; } @@ -94,8 +95,8 @@ export const ForceMuteSlashCmd = { mod, ppId, convertedTime, - options.reason, + options.reason ?? "", contactMethods, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts index 8ea323fe..326d5b73 100644 --- a/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/forceunmute/ForceUnmuteSlashCmd.ts @@ -1,9 +1,11 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; -import { convertDelayStringToMS } from "../../../../utils"; +import { convertDelayStringToMS, resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualUnmuteCmd } from "../../functions/actualCommands/actualUnmuteCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -16,7 +18,7 @@ const opts = [ }), ]; -export const ForceUnmuteSlashCmd = { +export const ForceUnmuteSlashCmd = modActionsSlashCmd({ name: "forceunmute", configPermission: "can_mute", description: "Force-unmute the specified user, even if they're not on the server", @@ -36,7 +38,7 @@ export const ForceUnmuteSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; let ppId: string | undefined; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, @@ -51,7 +53,7 @@ export const ForceUnmuteSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; ppId = interaction.user.id; } @@ -61,6 +63,6 @@ export const ForceUnmuteSlashCmd = { return; } - actualUnmuteCmd(pluginData, interaction, options.user, attachments, mod, ppId, convertedTime, options.reason); + actualUnmuteCmd(pluginData, interaction, options.user, attachments, mod, ppId, convertedTime, options.reason ?? ""); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts index 95f48580..a501a5b1 100644 --- a/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/hidecase/HideCaseSlashCmd.ts @@ -1,7 +1,8 @@ import { slashOptions } from "knub"; import { actualHideCaseCmd } from "../../functions/actualCommands/actualHideCaseCmd"; +import { modActionsSlashCmd } from "../../types"; -export const HideCaseSlashCmd = { +export const HideCaseSlashCmd = modActionsSlashCmd({ name: "hidecase", configPermission: "can_hidecase", description: "Hide the specified case so it doesn't appear in !cases or !info", @@ -13,6 +14,6 @@ export const HideCaseSlashCmd = { async run({ interaction, options, pluginData }) { await interaction.deferReply({ ephemeral: true }); - actualHideCaseCmd(pluginData, interaction, options["case-number"].split(/[\s,]+/).map(Number)); + actualHideCaseCmd(pluginData, interaction, options["case-number"].split(/\D+/).map(Number)); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts b/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts index ce0a659b..4776d093 100644 --- a/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/kick/KickSlashCmd.ts @@ -1,11 +1,12 @@ -import { ChannelType } from "discord.js"; +import { ChannelType, GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; -import { UserNotificationMethod } from "../../../../utils"; +import { UserNotificationMethod, resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualKickCmd } from "../../functions/actualCommands/actualKickCmd"; import { readContactMethodsFromArgs } from "../../functions/readContactMethodsFromArgs"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -37,7 +38,7 @@ const opts = [ }), ]; -export const KickSlashCmd = { +export const KickSlashCmd = modActionsSlashCmd({ name: "kick", configPermission: "can_kick", description: "Kick the specified member", @@ -57,7 +58,7 @@ export const KickSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -71,7 +72,7 @@ export const KickSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } let contactMethods: UserNotificationMethod[] | undefined; @@ -85,7 +86,7 @@ export const KickSlashCmd = { actualKickCmd( pluginData, interaction, - interaction.member, + interaction.member as GuildMember, options.user, options.reason || "", attachments, @@ -94,4 +95,4 @@ export const KickSlashCmd = { options.clean, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts b/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts index ab8ea1d1..de374434 100644 --- a/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massban/MassBanSlashCmd.ts @@ -1,7 +1,9 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualMassBanCmd } from "../../functions/actualCommands/actualMassBanCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -12,7 +14,7 @@ const opts = [ }), ]; -export const MassBanSlashCmd = { +export const MassBanSlashCmd = modActionsSlashCmd({ name: "massban", configPermission: "can_massban", description: "Mass-ban a list of user IDs", @@ -39,10 +41,10 @@ export const MassBanSlashCmd = { actualMassBanCmd( pluginData, interaction, - options["user-ids"].split(/[\s,\r\n]+/), - interaction.member, + options["user-ids"].split(/\D+/), + interaction.member as GuildMember, options.reason || "", attachments, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts index 6f2c18ba..ecdadbc7 100644 --- a/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massmute/MassMuteSlashCmd.ts @@ -1,7 +1,9 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualMassMuteCmd } from "../../functions/actualCommands/actualMassMuteCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -12,7 +14,7 @@ const opts = [ }), ]; -export const MassMuteSlashSlashCmd = { +export const MassMuteSlashSlashCmd = modActionsSlashCmd({ name: "massmute", configPermission: "can_massmute", description: "Mass-mute a list of user IDs", @@ -39,10 +41,10 @@ export const MassMuteSlashSlashCmd = { actualMassMuteCmd( pluginData, interaction, - options["user-ids"].split(/[\s,\r\n]+/), - interaction.member, + options["user-ids"].split(/\D+/), + interaction.member as GuildMember, options.reason || "", attachments, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts b/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts index da079dfd..1a2cf558 100644 --- a/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/massunban/MassUnbanSlashCmd.ts @@ -1,7 +1,9 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualMassUnbanCmd } from "../../functions/actualCommands/actualMassUnbanCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -12,7 +14,7 @@ const opts = [ }), ]; -export const MassUnbanSlashCmd = { +export const MassUnbanSlashCmd = modActionsSlashCmd({ name: "massunban", configPermission: "can_massunban", description: "Mass-unban a list of user IDs", @@ -40,9 +42,9 @@ export const MassUnbanSlashCmd = { pluginData, interaction, options["user-ids"].split(/[\s,\r\n]+/), - interaction.member, + interaction.member as GuildMember, options.reason || "", attachments, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts index f20585a9..5913d67e 100644 --- a/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/mute/MuteSlashCmd.ts @@ -1,4 +1,4 @@ -import { ChannelType } from "discord.js"; +import { ChannelType, GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { canActOn, hasPermission } from "../../../../pluginUtils"; import { UserNotificationMethod, convertDelayStringToMS, resolveMember } from "../../../../utils"; @@ -8,6 +8,7 @@ import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualMuteCmd } from "../../functions/actualCommands/actualMuteCmd"; import { isBanned } from "../../functions/isBanned"; import { readContactMethodsFromArgs } from "../../functions/readContactMethodsFromArgs"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -35,7 +36,7 @@ const opts = [ }), ]; -export const MuteSlashCmd = { +export const MuteSlashCmd = modActionsSlashCmd({ name: "mute", configPermission: "can_mute", description: "Mute the specified member", @@ -61,7 +62,7 @@ export const MuteSlashCmd = { const reply = await waitForButtonConfirm( interaction, { content: "User not found on the server, forcemute instead?" }, - { confirmText: "Yes", cancelText: "No", restrictToId: interaction.member.id }, + { confirmText: "Yes", cancelText: "No", restrictToId: interaction.user.id }, ); if (!reply) { @@ -74,12 +75,12 @@ export const MuteSlashCmd = { } // Make sure we're allowed to mute this member - if (memberToMute && !canActOn(pluginData, interaction.member, memberToMute)) { + if (memberToMute && !canActOn(pluginData, interaction.member as GuildMember, memberToMute)) { pluginData.getPlugin(CommonPlugin).sendErrorMessage(interaction, "Cannot mute: insufficient permissions"); return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; let ppId: string | undefined; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, @@ -94,7 +95,7 @@ export const MuteSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; ppId = interaction.user.id; } @@ -124,4 +125,4 @@ export const MuteSlashCmd = { contactMethods, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts b/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts index edcf60e9..8962be11 100644 --- a/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/note/NoteSlashCmd.ts @@ -2,6 +2,7 @@ import { slashOptions } from "knub"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualNoteCmd } from "../../functions/actualCommands/actualNoteCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -12,7 +13,7 @@ const opts = [ }), ]; -export const NoteSlashCmd = { +export const NoteSlashCmd = modActionsSlashCmd({ name: "note", configPermission: "can_note", description: "Add a note to the specified user", @@ -34,4 +35,4 @@ export const NoteSlashCmd = { actualNoteCmd(pluginData, interaction, interaction.user, attachments, options.user, options.note || ""); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts b/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts index 1a8a2181..954a90ae 100644 --- a/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unban/UnbanSlashCmd.ts @@ -1,8 +1,11 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { hasPermission } from "../../../../pluginUtils"; +import { resolveMember } from "../../../../utils"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualUnbanCmd } from "../../functions/actualCommands/actualUnbanCmd"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -14,7 +17,7 @@ const opts = [ }), ]; -export const UnbanSlashCmd = { +export const UnbanSlashCmd = modActionsSlashCmd({ name: "unban", configPermission: "can_unban", description: "Unban the specified member", @@ -34,7 +37,7 @@ export const UnbanSlashCmd = { return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -48,9 +51,9 @@ export const UnbanSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } - actualUnbanCmd(pluginData, interaction, interaction.user.id, options.user, options.reason, attachments, mod); + actualUnbanCmd(pluginData, interaction, interaction.user.id, options.user, options.reason ?? "", attachments, mod); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts index 92d3c0fb..2dbdc309 100644 --- a/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unhidecase/UnhideCaseSlashCmd.ts @@ -1,7 +1,8 @@ import { slashOptions } from "knub"; import { actualUnhideCaseCmd } from "../../functions/actualCommands/actualUnhideCaseCmd"; +import { modActionsSlashCmd } from "../../types"; -export const UnhideCaseSlashCmd = { +export const UnhideCaseSlashCmd = modActionsSlashCmd({ name: "unhidecase", configPermission: "can_hidecase", description: "Un-hide the specified case", @@ -13,6 +14,6 @@ export const UnhideCaseSlashCmd = { async run({ interaction, options, pluginData }) { await interaction.deferReply({ ephemeral: true }); - actualUnhideCaseCmd(pluginData, interaction, options["case-number"].split(/[\s,]+/).map(Number)); + actualUnhideCaseCmd(pluginData, interaction, options["case-number"].split(/\D+/).map(Number)); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts b/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts index df57fa05..b3ab730c 100644 --- a/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/unmute/UnmuteSlashCmd.ts @@ -1,3 +1,4 @@ +import { GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { canActOn, hasPermission } from "../../../../pluginUtils"; import { convertDelayStringToMS, resolveMember } from "../../../../utils"; @@ -7,6 +8,7 @@ import { CommonPlugin } from "../../../Common/CommonPlugin"; import { MutesPlugin } from "../../../Mutes/MutesPlugin"; import { actualUnmuteCmd } from "../../functions/actualCommands/actualUnmuteCmd"; import { isBanned } from "../../functions/isBanned"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -19,7 +21,7 @@ const opts = [ }), ]; -export const UnmuteSlashCmd = { +export const UnmuteSlashCmd = modActionsSlashCmd({ name: "unmute", configPermission: "can_mute", description: "Unmute the specified member", @@ -79,12 +81,12 @@ export const UnmuteSlashCmd = { } // Make sure we're allowed to unmute this member - if (memberToUnmute && !canActOn(pluginData, interaction.member, memberToUnmute)) { + if (memberToUnmute && !canActOn(pluginData, interaction.member as GuildMember, memberToUnmute)) { pluginData.getPlugin(CommonPlugin).sendErrorMessage(interaction, "Cannot unmute: insufficient permissions"); return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; let ppId: string | undefined; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, @@ -99,7 +101,7 @@ export const UnmuteSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; ppId = interaction.user.id; } @@ -111,4 +113,4 @@ export const UnmuteSlashCmd = { actualUnmuteCmd(pluginData, interaction, options.user, attachments, mod, ppId, convertedTime, options.reason); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts b/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts index a1a6cabf..2316f82d 100644 --- a/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/update/UpdateSlashCmd.ts @@ -1,6 +1,7 @@ import { slashOptions } from "knub"; import { generateAttachmentSlashOptions, retrieveMultipleOptions } from "../../../../utils/multipleSlashOptions"; import { updateCase } from "../../functions/updateCase"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_UPDATE } from "../constants"; const opts = [ @@ -12,7 +13,7 @@ const opts = [ }), ]; -export const UpdateSlashCmd = { +export const UpdateSlashCmd = modActionsSlashCmd({ name: "update", configPermission: "can_note", description: "Update the specified case (or your latest case) by adding more notes to it", @@ -27,9 +28,9 @@ export const UpdateSlashCmd = { pluginData, interaction, interaction.user, - options.caseNumber, - options.note, + options["case-number"] ? Number(options["case-number"]) : null, + options.reason ?? "", retrieveMultipleOptions(NUMBER_ATTACHMENTS_CASE_UPDATE, options, "attachment"), ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts b/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts index 7295551b..180d52c8 100644 --- a/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/warn/WarnSlashCmd.ts @@ -1,4 +1,4 @@ -import { ChannelType } from "discord.js"; +import { ChannelType, GuildMember } from "discord.js"; import { slashOptions } from "knub"; import { canActOn, hasPermission } from "../../../../pluginUtils"; import { UserNotificationMethod, resolveMember } from "../../../../utils"; @@ -7,6 +7,7 @@ import { CommonPlugin } from "../../../Common/CommonPlugin"; import { actualWarnCmd } from "../../functions/actualCommands/actualWarnCmd"; import { isBanned } from "../../functions/isBanned"; import { readContactMethodsFromArgs } from "../../functions/readContactMethodsFromArgs"; +import { modActionsSlashCmd } from "../../types"; import { NUMBER_ATTACHMENTS_CASE_CREATION } from "../constants"; const opts = [ @@ -33,7 +34,7 @@ const opts = [ }), ]; -export const WarnSlashCmd = { +export const WarnSlashCmd = modActionsSlashCmd({ name: "warn", configPermission: "can_warn", description: "Send a warning to the specified user", @@ -67,12 +68,12 @@ export const WarnSlashCmd = { } // Make sure we're allowed to warn this member - if (!canActOn(pluginData, interaction.member, memberToWarn)) { + if (!canActOn(pluginData, interaction.member as GuildMember, memberToWarn)) { await pluginData.getPlugin(CommonPlugin).sendErrorMessage(interaction, "Cannot warn: insufficient permissions"); return; } - let mod = interaction.member; + let mod = interaction.member as GuildMember; const canActAsOther = await hasPermission(pluginData, "can_act_as_other", { channel: interaction.channel, member: interaction.member, @@ -86,7 +87,7 @@ export const WarnSlashCmd = { return; } - mod = options.mod; + mod = (await resolveMember(pluginData.client, pluginData.guild, options.mod.id))!; } let contactMethods: UserNotificationMethod[] | undefined; @@ -108,4 +109,4 @@ export const WarnSlashCmd = { contactMethods, ); }, -}; +}); diff --git a/backend/src/plugins/ModActions/functions/actualCommands/actualKickCmd.ts b/backend/src/plugins/ModActions/functions/actualCommands/actualKickCmd.ts index a1767be9..f8ad0158 100644 --- a/backend/src/plugins/ModActions/functions/actualCommands/actualKickCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualCommands/actualKickCmd.ts @@ -20,7 +20,7 @@ export async function actualKickCmd( attachments: Attachment[], mod: GuildMember, contactMethods?: UserNotificationMethod[], - clean?: boolean, + clean?: boolean | null, ) { if (await handleAttachmentLinkDetectionAndGetRestriction(pluginData, context, reason)) { return; diff --git a/backend/src/plugins/ModActions/functions/actualCommands/actualMuteCmd.ts b/backend/src/plugins/ModActions/functions/actualCommands/actualMuteCmd.ts index d93e10d0..2cff62ff 100644 --- a/backend/src/plugins/ModActions/functions/actualCommands/actualMuteCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualCommands/actualMuteCmd.ts @@ -29,7 +29,7 @@ export async function actualMuteCmd( mod: GuildMember, ppId?: string, time?: number, - reason?: string, + reason?: string | null, contactMethods?: UserNotificationMethod[], ) { if (await handleAttachmentLinkDetectionAndGetRestriction(pluginData, context, reason)) { diff --git a/backend/src/plugins/ModActions/functions/actualCommands/actualUnmuteCmd.ts b/backend/src/plugins/ModActions/functions/actualCommands/actualUnmuteCmd.ts index 22f79eb6..11a668b4 100644 --- a/backend/src/plugins/ModActions/functions/actualCommands/actualUnmuteCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualCommands/actualUnmuteCmd.ts @@ -16,7 +16,7 @@ export async function actualUnmuteCmd( mod: GuildMember, ppId?: string, time?: number, - reason?: string, + reason?: string | null, ) { if (await handleAttachmentLinkDetectionAndGetRestriction(pluginData, context, reason)) { return; diff --git a/backend/src/plugins/ModActions/functions/readContactMethodsFromArgs.ts b/backend/src/plugins/ModActions/functions/readContactMethodsFromArgs.ts index a9503333..5ddc222b 100644 --- a/backend/src/plugins/ModActions/functions/readContactMethodsFromArgs.ts +++ b/backend/src/plugins/ModActions/functions/readContactMethodsFromArgs.ts @@ -2,8 +2,8 @@ import { GuildTextBasedChannel } from "discord.js"; import { disableUserNotificationStrings, UserNotificationMethod } from "../../../utils"; export function readContactMethodsFromArgs(args: { - notify?: string; - "notify-channel"?: GuildTextBasedChannel; + notify?: string | null; + "notify-channel"?: GuildTextBasedChannel | null; }): null | UserNotificationMethod[] { if (args.notify) { if (args.notify === "dm") { diff --git a/backend/src/plugins/ModActions/functions/updateCase.ts b/backend/src/plugins/ModActions/functions/updateCase.ts index 08f11230..e4011fb7 100644 --- a/backend/src/plugins/ModActions/functions/updateCase.ts +++ b/backend/src/plugins/ModActions/functions/updateCase.ts @@ -13,7 +13,7 @@ export async function updateCase( pluginData: GuildPluginData, context: Message | ChatInputCommandInteraction, author: User, - caseNumber?: number, + caseNumber?: number | null, note = "", attachments: Attachment[] = [], ) { diff --git a/backend/src/plugins/ModActions/types.ts b/backend/src/plugins/ModActions/types.ts index ec2d29ea..ee128986 100644 --- a/backend/src/plugins/ModActions/types.ts +++ b/backend/src/plugins/ModActions/types.ts @@ -1,6 +1,12 @@ import { ChatInputCommandInteraction, Message } from "discord.js"; import { EventEmitter } from "events"; -import { BasePluginType, guildPluginEventListener, guildPluginMessageCommand, guildPluginSlashGroup } from "knub"; +import { + BasePluginType, + guildPluginEventListener, + guildPluginMessageCommand, + guildPluginSlashCommand, + guildPluginSlashGroup, +} from "knub"; import z from "zod"; import { Queue } from "../../Queue"; import { GuildCases } from "../../data/GuildCases"; @@ -152,4 +158,5 @@ export type ModActionType = "note" | "warn" | "mute" | "unmute" | "kick" | "ban" export const modActionsMsgCmd = guildPluginMessageCommand(); export const modActionsSlashGroup = guildPluginSlashGroup(); +export const modActionsSlashCmd = guildPluginSlashCommand(); export const modActionsEvt = guildPluginEventListener();