diff --git a/src/DraupnirBotMode.ts b/src/DraupnirBotMode.ts index 3e672078..3bfbaa54 100644 --- a/src/DraupnirBotMode.ts +++ b/src/DraupnirBotMode.ts @@ -171,7 +171,8 @@ export class DraupnirBotModeToggle implements SafeModeToggle { return draupnirResult; } public async switchToSafeMode( - cause: SafeModeCause + cause: SafeModeCause, + options?: SafeModeToggleOptions ): Promise> { if (this.safeModeDraupnir !== null) { return ResultError.Result( @@ -192,6 +193,9 @@ export class DraupnirBotModeToggle implements SafeModeToggle { this.draupnir = null; this.safeModeDraupnir = safeModeResult.ok; this.safeModeDraupnir.start(); + if (options?.sendStatusOnStart) { + this.safeModeDraupnir.sendStartupComplete(); + } return safeModeResult; } } diff --git a/src/commands/SafeModeCommand.ts b/src/commands/SafeModeCommand.ts index 23e32eeb..648c2653 100644 --- a/src/commands/SafeModeCommand.ts +++ b/src/commands/SafeModeCommand.ts @@ -19,10 +19,13 @@ export const DraupnirSafeModeCommand = describeCommand({ { safeModeToggle }: Draupnir, info: BasicInvocationInformation ): Promise> { - return safeModeToggle.switchToSafeMode({ - reason: SafeModeReason.ByRequest, - user: info.commandSender, - }); + return safeModeToggle.switchToSafeMode( + { + reason: SafeModeReason.ByRequest, + user: info.commandSender, + }, + { sendStatusOnStart: true } + ); }, }); diff --git a/src/commands/interface-manager/MatrixHelpRenderer.tsx b/src/commands/interface-manager/MatrixHelpRenderer.tsx index 3a38a39c..34e6bde4 100644 --- a/src/commands/interface-manager/MatrixHelpRenderer.tsx +++ b/src/commands/interface-manager/MatrixHelpRenderer.tsx @@ -370,3 +370,7 @@ export function renderTableHelp(table: CommandTable): DocumentNode { ); } + +export function wrapInRoot(node: DocumentNode): DocumentNode { + return {node}; +} diff --git a/src/safemode/DraupnirSafeMode.ts b/src/safemode/DraupnirSafeMode.ts index 4721b2eb..e2aeacc3 100644 --- a/src/safemode/DraupnirSafeMode.ts +++ b/src/safemode/DraupnirSafeMode.ts @@ -7,8 +7,12 @@ import { ClientRooms, EventReport, RoomEvent, + Task, } from "matrix-protection-suite"; -import { MatrixAdaptorContext } from "../commands/interface-manager/MPSMatrixInterfaceAdaptor"; +import { + MatrixAdaptorContext, + sendMatrixEventsFromDeadDocument, +} from "../commands/interface-manager/MPSMatrixInterfaceAdaptor"; import { StringUserID, StringRoomID, @@ -27,6 +31,12 @@ import { } from "../commands/interface-manager/MatrixPromptForAccept"; import { makeCommandDispatcherTimelineListener } from "./ManagementRoom"; import { SafeModeToggle } from "./SafeModeToggle"; +import { Result } from "@gnuxie/typescript-result"; +import { + renderSafeModeStatusInfo, + safeModeStatusInfo, +} from "./commands/StatusCommand"; +import { wrapInRoot } from "../commands/interface-manager/MatrixHelpRenderer"; export class SafeModeDraupnir implements MatrixAdaptorContext { public reactionHandler: MatrixReactionHandler; @@ -90,4 +100,15 @@ export class SafeModeDraupnir implements MatrixAdaptorContext { public stop(): void { this.clientRooms.off("timeline", this.timelineEventListener); } + + public sendStartupComplete(): void { + void Task( + sendMatrixEventsFromDeadDocument( + this.clientPlatform.toRoomMessageSender(), + this.commandRoomID, + wrapInRoot(renderSafeModeStatusInfo(safeModeStatusInfo(this))), + {} + ) as Promise> + ); + } } diff --git a/src/safemode/commands/RestartDraupnirCommand.ts b/src/safemode/commands/RestartDraupnirCommand.ts index 687a5d2d..e40048a2 100644 --- a/src/safemode/commands/RestartDraupnirCommand.ts +++ b/src/safemode/commands/RestartDraupnirCommand.ts @@ -14,7 +14,7 @@ export const SafeModeRestartCommand = describeCommand({ async executor({ safeModeToggle, }: SafeModeDraupnir): Promise> { - return safeModeToggle.switchToDraupnir(); + return safeModeToggle.switchToDraupnir({ sendStatusOnStart: true }); }, });