From a85d29284197c2133122990decbb7566be2a5874 Mon Sep 17 00:00:00 2001 From: gnuxie Date: Sat, 27 Apr 2024 18:51:20 +0100 Subject: [PATCH] Renderers for UserConsequence UsersInRoom. --- src/capabilities/CommonRenderers.tsx | 47 +++++++++++++++++-- .../ServerACLConsequencesRenderer.tsx | 8 ++-- .../StandardUserConsequencesRenderer.tsx | 32 +++++++++++-- 3 files changed, 74 insertions(+), 13 deletions(-) diff --git a/src/capabilities/CommonRenderers.tsx b/src/capabilities/CommonRenderers.tsx index 917425e6..e16f0225 100644 --- a/src/capabilities/CommonRenderers.tsx +++ b/src/capabilities/CommonRenderers.tsx @@ -8,10 +8,10 @@ // https://github.com/matrix-org/mjolnir // -import { ActionError, ActionException, ActionResult, DescriptionMeta, MatrixRoomReference, RoomSetResult, StringRoomID, isOk } from "matrix-protection-suite"; +import { ActionError, ActionException, ActionResult, DescriptionMeta, MatrixRoomReference, ResultForUsersInRoom, RoomSetResult, StringRoomID, StringUserID, isOk } from "matrix-protection-suite"; import { DocumentNode } from "../commands/interface-manager/DeadDocument"; import { JSXFactory } from "../commands/interface-manager/JSXFactory"; -import { renderRoomPill } from "../commands/interface-manager/MatrixHelpRenderer"; +import { renderMentionPill, renderRoomPill } from "../commands/interface-manager/MatrixHelpRenderer"; export function renderElaborationTrail(error: ActionError): DocumentNode { return
Elaboration trail @@ -68,10 +68,15 @@ export function renderOutcome(isOutcomeOk: boolean): DocumentNode { function renderRoomOutcomeOk(roomID: StringRoomID): DocumentNode { return {renderRoomPill(MatrixRoomReference.fromRoomID(roomID))} - {renderOutcome(true)} } -function renderRoomOutcomeError(roomID: StringRoomID, error: ActionError): DocumentNode { + +function renderUserOutcomeOk(userID: StringUserID, result: ActionResult): DocumentNode { + return {renderMentionPill(userID, userID)} - {renderOutcome(true)} +} + +function renderOutcomeError(summary: DocumentNode, error: ActionError): DocumentNode { return
- {renderRoomPill(MatrixRoomReference.fromRoomID(roomID))} - {renderOutcome(false)}: {error.mostRelevantElaboration} + {summary} {renderDetailsNotice(error)} {renderElaborationTrail(error)} {renderExceptionTrail(error)} @@ -79,6 +84,21 @@ function renderRoomOutcomeError(roomID: StringRoomID, error: ActionError): Docum } +function renderRoomOutcomeError(roomID: StringRoomID, error: ActionError): DocumentNode { + return renderOutcomeError( + {renderRoomPill(MatrixRoomReference.fromRoomID(roomID))} - {renderOutcome(false)}: {error.mostRelevantElaboration}, + error + ) +} + +function renderUserOutcomeError(userID: StringUserID, error: ActionError): DocumentNode { + return renderOutcomeError( + {renderMentionPill(userID, userID)} - {renderOutcome(false)}, + error + ) +} + + export function renderRoomOutcome(roomID: StringRoomID, result: ActionResult): DocumentNode { if (isOk(result)) { return renderRoomOutcomeOk(roomID); @@ -87,6 +107,14 @@ export function renderRoomOutcome(roomID: StringRoomID, result: ActionResult): DocumentNode { + if (isOk(result)) { + return renderUserOutcomeOk(userID, result); + } else { + return renderUserOutcomeError(userID, result.error); + } +} + export function renderRoomSetResult(roomResults: RoomSetResult, { summary }: { summary: DocumentNode }): DocumentNode { return
{summary} @@ -95,3 +123,14 @@ export function renderRoomSetResult(roomResults: RoomSetResult, { summary }: { s })}
} + +export function renderResultForUsersInRoom(results: ResultForUsersInRoom, { summary }: { summary: DocumentNode}): DocumentNode { + return
+ {summary} +
    + {[...results.map.entries()].map(([userID, outcome]) => { +
  • {renderUserOutcome(userID, outcome)}
  • + })} +
+
+} diff --git a/src/capabilities/ServerACLConsequencesRenderer.tsx b/src/capabilities/ServerACLConsequencesRenderer.tsx index de425e78..7a2ff2d0 100644 --- a/src/capabilities/ServerACLConsequencesRenderer.tsx +++ b/src/capabilities/ServerACLConsequencesRenderer.tsx @@ -25,8 +25,8 @@ class StandardServerConsequencesRenderer implements ServerConsequences { public readonly requiredEventPermissions = this.capability.requiredEventPermissions; public readonly requiredPermissions = this.capability.requiredPermissions; public readonly requiredStatePermissions = this.capability.requiredStatePermissions; - public async consequenceForServerInRoom(roomID: StringRoomID, revision: PolicyListRevision): Promise> { - const capabilityResult = await this.capability.consequenceForServerInRoom(roomID, revision); + public async consequenceForServersInRoom(roomID: StringRoomID, revision: PolicyListRevision): Promise> { + const capabilityResult = await this.capability.consequenceForServersInRoom(roomID, revision); const title = Setting server ACL in {Permalinks.forRoom(roomID)} as it is out of sync with watched policies. ; @@ -37,8 +37,8 @@ class StandardServerConsequencesRenderer implements ServerConsequences { this.messageCollector.addOneliner(this.description, title); return Ok(undefined); } - public async consequenceForServerInRoomSet(revision: PolicyListRevision): Promise> { - const capabilityResult = await this.capability.consequenceForServerInRoomSet(revision); + public async consequenceForServersInRoomSet(revision: PolicyListRevision): Promise> { + const capabilityResult = await this.capability.consequenceForServersInRoomSet(revision); const title = Updating server ACL in protected rooms.; if (isError(capabilityResult)) { this.messageCollector.addMessage(this.description, renderFailedSingularConsequence(this.description, title, capabilityResult.error)) diff --git a/src/capabilities/StandardUserConsequencesRenderer.tsx b/src/capabilities/StandardUserConsequencesRenderer.tsx index 00fc4e28..c65faf6d 100644 --- a/src/capabilities/StandardUserConsequencesRenderer.tsx +++ b/src/capabilities/StandardUserConsequencesRenderer.tsx @@ -9,11 +9,12 @@ // import { JSXFactory } from "../commands/interface-manager/JSXFactory"; -import { ActionResult, Capability, DescriptionMeta, Ok, Permalinks, PolicyListRevision, ResultForUsersInSet, RoomSetResult, StandardUserConsequencesContext, StringRoomID, StringUserID, UserConsequences, describeCapabilityContextGlue, describeCapabilityRenderer, isError } from "matrix-protection-suite"; +import { ActionResult, Capability, DescriptionMeta, MatrixRoomReference, Ok, Permalinks, PolicyListRevision, ResultForUsersInRoom, ResultForUsersInSet, RoomSetResult, StandardUserConsequencesContext, StringRoomID, StringUserID, UserConsequences, describeCapabilityContextGlue, describeCapabilityRenderer, isError } from "matrix-protection-suite"; import { RendererMessageCollector } from "./RendererMessageCollector"; -import { renderFailedSingularConsequence, renderOutcome, renderRoomSetResult } from "./CommonRenderers"; +import { renderFailedSingularConsequence, renderOutcome, renderResultForUsersInRoom, renderRoomSetResult } from "./CommonRenderers"; import { DocumentNode } from "../commands/interface-manager/DeadDocument"; import { Draupnir } from "../Draupnir"; +import { renderRoomPill } from "../commands/interface-manager/MatrixHelpRenderer"; // yeah i know this is a bit insane but whatever, it can be our secret. function renderResultForUserInSetMap(usersInSetMap: ResultForUsersInSet, { @@ -54,7 +55,6 @@ function renderRoomSetResultForUser( ) } - class StandardUserConsequencesRenderer implements UserConsequences { constructor( private readonly description: DescriptionMeta, @@ -80,8 +80,8 @@ class StandardUserConsequencesRenderer implements UserConsequences { return Ok(undefined); } - public async consequenceForUserInRoomSet(revision: PolicyListRevision): Promise> { - const capabilityResult = await this.capability.consequenceForUserInRoomSet(revision); + public async consequenceForUsersInRoomSet(revision: PolicyListRevision): Promise> { + const capabilityResult = await this.capability.consequenceForUsersInRoomSet(revision); if (isError(capabilityResult)) { const title = Applying policy revision to protected rooms this.messageCollector.addMessage(this.description, renderFailedSingularConsequence(this.description, title, capabilityResult.error)) @@ -99,6 +99,28 @@ class StandardUserConsequencesRenderer implements UserConsequences { return capabilityResult; } + public async consequenceForUsersInRoom(roomID: StringRoomID, revision: PolicyListRevision): Promise> { + const capabilityResult = await this.capability.consequenceForUsersInRoom(roomID, revision); + if (isError(capabilityResult)) { + const title = Applying policy revision to {renderRoomPill(MatrixRoomReference.fromRoomID(roomID, []))} + this.messageCollector.addMessage(this.description, renderFailedSingularConsequence(this.description, title, capabilityResult.error)); + return capabilityResult; + } + const resultMap = capabilityResult.ok; + if (resultMap.map.size === 0) { + return capabilityResult; + } + this.messageCollector.addMessage(this.description, renderResultForUsersInRoom(resultMap, + { + summary: + {this.description === undefined ? '' : {this.description.name}:} + {resultMap.map.size} will be banned from {renderRoomPill(MatrixRoomReference.fromRoomID(roomID))} - + {renderOutcome(resultMap.isEveryResultOk)}. + + } + )); + return capabilityResult; + } public async unbanUserFromRoomSet(userID: StringUserID, reason: string): Promise> { const capabilityResult = await this.capability.unbanUserFromRoomSet(userID, reason); if (isError(capabilityResult)) {