diff --git a/backend/src/pluginUtils.ts b/backend/src/pluginUtils.ts index f84bf396..9e7f9783 100644 --- a/backend/src/pluginUtils.ts +++ b/backend/src/pluginUtils.ts @@ -5,6 +5,7 @@ import { ChatInputCommandInteraction, GuildMember, + InteractionReplyOptions, Message, MessageCreateOptions, PermissionsBitField, @@ -80,17 +81,19 @@ export async function getContextChannel( export async function sendContextResponse( context: TextBasedChannel | Message | User | ChatInputCommandInteraction, - response: string | Omit, + response: string | Omit | InteractionReplyOptions, ): Promise { if (isContextInteraction(context)) { const options = { ...(typeof response === "string" ? { content: response } : response), fetchReply: true }; return (context.replied ? context.followUp(options) : context.reply(options)) as Promise; - } else if ("send" in context) { - return context.send(response); - } else { - return (await getContextChannel(context)).send(response); } + + if (typeof response !== "string" && "ephemeral" in response) { + delete response.ephemeral; + } + + return (await getContextChannel(context)).send(response as string | Omit); } export function getBaseUrl(pluginData: AnyPluginData) { diff --git a/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts b/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts index 914cec0f..4e278e23 100644 --- a/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/CaseMsgCmd.ts @@ -2,6 +2,10 @@ import { commandTypeHelpers as ct } from "../../../../commandTypes"; import { actualCaseCmd } from "../../functions/actualCommands/actualCaseCmd"; import { modActionsMsgCmd } from "../../types"; +const opts = { + show: ct.switchOption({ def: false, shortcut: "sh" }), +}; + export const CaseMsgCmd = modActionsMsgCmd({ trigger: "case", permission: "can_view", @@ -10,10 +14,12 @@ export const CaseMsgCmd = modActionsMsgCmd({ signature: [ { caseNumber: ct.number(), + + ...opts, }, ], async run({ pluginData, message: msg, args }) { - actualCaseCmd(pluginData, msg, msg.author.id, args.caseNumber); + actualCaseCmd(pluginData, msg, msg.author.id, args.caseNumber, args.show); }, }); diff --git a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts index c537ec6e..98219e3f 100644 --- a/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/case/CaseSlashCmd.ts @@ -1,6 +1,10 @@ import { slashOptions } from "knub"; import { actualCaseCmd } from "../../functions/actualCommands/actualCaseCmd"; +const opts = [ + slashOptions.boolean({ name: "show", description: "To make the result visible to everyone", required: false }), +]; + export const CaseSlashCmd = { name: "case", configPermission: "can_view", @@ -9,9 +13,11 @@ export const CaseSlashCmd = { signature: [ slashOptions.number({ name: "case-number", description: "The number of the case to show", required: true }), + + ...opts, ], async run({ interaction, options, pluginData }) { - actualCaseCmd(pluginData, interaction, interaction.user.id, options["case-number"]); + actualCaseCmd(pluginData, interaction, interaction.user.id, options["case-number"], options.show); }, }; diff --git a/backend/src/plugins/ModActions/commands/cases/CasesModMsgCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesModMsgCmd.ts index debeff45..0777e1cf 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesModMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesModMsgCmd.ts @@ -13,6 +13,7 @@ const opts = { unmutes: ct.switchOption({ def: false, shortcut: "um" }), bans: ct.switchOption({ def: false, shortcut: "b" }), unbans: ct.switchOption({ def: false, shortcut: "ub" }), + show: ct.switchOption({ def: false, shortcut: "sh" }), }; export const CasesModMsgCmd = modActionsMsgCmd({ @@ -42,6 +43,7 @@ export const CasesModMsgCmd = modActionsMsgCmd({ args.reverseFilters, args.hidden, args.expand, + args.show, ); }, }); diff --git a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts index 7833cfab..9d22d5d7 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesSlashCmd.ts @@ -17,6 +17,7 @@ const opts = [ slashOptions.boolean({ name: "unmutes", description: "To filter unmutes", required: false }), slashOptions.boolean({ name: "bans", description: "To filter bans", required: false }), slashOptions.boolean({ name: "unbans", description: "To filter unbans", required: false }), + slashOptions.boolean({ name: "show", description: "To make the result visible to everyone", required: false }), ]; export const CasesSlashCmd = { @@ -43,6 +44,7 @@ export const CasesSlashCmd = { options["reverse-filters"], options.hidden, options.expand, + options.show, ); }, }; diff --git a/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts b/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts index 5640080d..a185950e 100644 --- a/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts +++ b/backend/src/plugins/ModActions/commands/cases/CasesUserMsgCmd.ts @@ -15,6 +15,7 @@ const opts = { unmutes: ct.switchOption({ def: false, shortcut: "um" }), bans: ct.switchOption({ def: false, shortcut: "b" }), unbans: ct.switchOption({ def: false, shortcut: "ub" }), + show: ct.switchOption({ def: false, shortcut: "sh" }), }; export const CasesUserMsgCmd = modActionsMsgCmd({ @@ -55,6 +56,7 @@ export const CasesUserMsgCmd = modActionsMsgCmd({ args.reverseFilters, args.hidden, args.expand, + args.show, ); }, }); diff --git a/backend/src/plugins/ModActions/functions/actualCommands/actualCaseCmd.ts b/backend/src/plugins/ModActions/functions/actualCommands/actualCaseCmd.ts index eabd8333..e45dc0e7 100644 --- a/backend/src/plugins/ModActions/functions/actualCommands/actualCaseCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualCommands/actualCaseCmd.ts @@ -10,6 +10,7 @@ export async function actualCaseCmd( context: Message | ChatInputCommandInteraction, authorId: string, caseNumber: number, + show: boolean | null, ) { const theCase = await pluginData.state.cases.findByCaseNumber(caseNumber); @@ -21,5 +22,5 @@ export async function actualCaseCmd( const casesPlugin = pluginData.getPlugin(CasesPlugin); const embed = await casesPlugin.getCaseEmbed(theCase.id, authorId); - sendContextResponse(context, embed); + sendContextResponse(context, { ...embed, ephemeral: show !== true }); } diff --git a/backend/src/plugins/ModActions/functions/actualCommands/actualCasesCmd.ts b/backend/src/plugins/ModActions/functions/actualCommands/actualCasesCmd.ts index ae92affa..abe63cfa 100644 --- a/backend/src/plugins/ModActions/functions/actualCommands/actualCasesCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualCommands/actualCasesCmd.ts @@ -29,6 +29,7 @@ async function sendExpandedCases( context: Message | ChatInputCommandInteraction, casesCount: number, cases: Case[], + show: boolean | null, ) { if (casesCount > maxExpandedCases) { await sendContextResponse(context, "Too many cases for expanded view. Please use compact view instead."); @@ -40,7 +41,7 @@ async function sendExpandedCases( for (const theCase of cases) { const embed = await casesPlugin.getCaseEmbed(theCase.id); - await sendContextResponse(context, embed); + await sendContextResponse(context, { ...embed, ephemeral: !show }); } } @@ -54,6 +55,7 @@ async function casesUserCmd( typesToShow: CaseTypes[], hidden: boolean | null, expand: boolean | null, + show: boolean | null, ) { const casesPlugin = pluginData.getPlugin(CasesPlugin); const casesFilters: Omit, "guild_id" | "user_id"> = { type: In(typesToShow) }; @@ -86,7 +88,7 @@ async function casesUserCmd( } if (expand) { - sendExpandedCases(pluginData, context, casesToDisplay.length, casesToDisplay); + sendExpandedCases(pluginData, context, casesToDisplay.length, casesToDisplay, show); return; } @@ -129,7 +131,7 @@ async function casesUserCmd( fields: [...(isLastChunk ? [footerField] : [])], } satisfies APIEmbed; - sendContextResponse(context, { embeds: [embed] }); + sendContextResponse(context, { embeds: [embed], ephemeral: !show }); } } @@ -143,6 +145,7 @@ async function casesModCmd( typesToShow: CaseTypes[], hidden: boolean | null, expand: boolean | null, + show: boolean | null, ) { const casesPlugin = pluginData.getPlugin(CasesPlugin); const casesFilters = { type: In(typesToShow), is_hidden: !!hidden }; @@ -161,7 +164,7 @@ async function casesModCmd( // Expanded view (= individual case embeds) const cases = totalCases > 8 ? [] : await casesPlugin.getRecentCasesByMod(modId ?? author.id, 8, 0, casesFilters); - sendExpandedCases(pluginData, context, totalCases, cases); + sendExpandedCases(pluginData, context, totalCases, cases, show); return; } @@ -199,7 +202,7 @@ async function casesModCmd( ], } satisfies APIEmbed; - return { embeds: [embed] }; + return { embeds: [embed], ephemeral: !show }; }, { limitToUserId: author.id, @@ -222,6 +225,7 @@ export async function actualCasesCmd( reverseFilters: boolean | null, hidden: boolean | null, expand: boolean | null, + show: boolean | null, ) { const mod = modId ? (await resolveMember(pluginData.client, pluginData.guild, modId)) || (await resolveUser(pluginData.client, modId)) @@ -253,6 +257,17 @@ export async function actualCasesCmd( } user - ? casesUserCmd(pluginData, context, author.user, modId!, user, modName, typesToShow, hidden, expand) - : casesModCmd(pluginData, context, author.user, modId!, mod ?? author, modName, typesToShow, hidden, expand); + ? casesUserCmd(pluginData, context, author.user, modId!, user, modName, typesToShow, hidden, expand, show === true) + : casesModCmd( + pluginData, + context, + author.user, + modId!, + mod ?? author, + modName, + typesToShow, + hidden, + expand, + show === true, + ); }