Skip to content

Commit 9587d6f

Browse files
authored
Update for simulated capabilities from MPS v2.10.0 and add their renderers, commands. (#727)
* Set renderers and glue for new simulated capabilities. the-draupnir-project/planning#2. * Distinguish simulated capability messages when rendering. * Update for MPS 2.10.0 * Add `!protections capability reset <protection name>` command. This will allow you to use the default capabilities for a protection. * Update CHANGELOG for simulated capabilities.
1 parent d3b55a8 commit 9587d6f

11 files changed

+155
-26
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ and this project adheres to
1414

1515
## [Unreleased] - None
1616

17+
### Added
18+
19+
- Simulated capabilities for all available protection capabilities. These allow
20+
protections to run without effects.
21+
22+
- A command `!draupnir protections capability reset <protection name>` to
23+
restore the default capability set.
24+
1725
## [v2.1.0] - 2025-02-02
1826

1927
### Fixed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@
6363
"jsdom": "^24.0.0",
6464
"matrix-appservice-bridge": "^10.3.1",
6565
"matrix-bot-sdk": "npm:@vector-im/matrix-bot-sdk@^0.7.1-element.6",
66-
"matrix-protection-suite": "npm:@gnuxie/matrix-protection-suite@2.9.0",
67-
"matrix-protection-suite-for-matrix-bot-sdk": "npm:@gnuxie/matrix-protection-suite-for-matrix-bot-sdk@2.9.0",
66+
"matrix-protection-suite": "npm:@gnuxie/matrix-protection-suite@2.10.0",
67+
"matrix-protection-suite-for-matrix-bot-sdk": "npm:@gnuxie/matrix-protection-suite-for-matrix-bot-sdk@2.10.0",
6868
"pg": "^8.8.0",
6969
"yaml": "^2.3.2"
7070
},

src/capabilities/DraupnirRendererMessageCollector.tsx

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
RendererMessageCollector,
88
} from "./RendererMessageCollector";
99
import {
10+
Capability,
1011
DescriptionMeta,
1112
RoomMessageSender,
1213
Task,
@@ -17,8 +18,6 @@ import {
1718
DocumentNode,
1819
} from "@the-draupnir-project/interface-manager";
1920
import { sendMatrixEventsFromDeadDocument } from "../commands/interface-manager/MPSMatrixInterfaceAdaptor";
20-
import { Result } from "@gnuxie/typescript-result";
21-
2221
export class DraupnirRendererMessageCollector
2322
implements RendererMessageCollector
2423
{
@@ -28,21 +27,37 @@ export class DraupnirRendererMessageCollector
2827
) {
2928
// nothing to do.
3029
}
31-
private sendMessage(document: DocumentNode): void {
30+
private sendMessage(capability: Capability, document: DocumentNode): void {
3231
void Task(
3332
sendMatrixEventsFromDeadDocument(
3433
this.roomMessageSender,
3534
this.managementRoomID,
36-
<root>{document}</root>,
35+
<root>
36+
{capability.isSimulated ? (
37+
<fragment>⚠️ (preview) </fragment>
38+
) : (
39+
<fragment></fragment>
40+
)}
41+
{document}
42+
</root>,
3743
{}
38-
) as Promise<Result<void>>
44+
)
3945
);
4046
}
41-
addMessage(protection: DescriptionMeta, message: DocumentNode): void {
42-
this.sendMessage(message);
47+
addMessage(
48+
protection: DescriptionMeta,
49+
capability: Capability,
50+
message: DocumentNode
51+
): void {
52+
this.sendMessage(capability, message);
4353
}
44-
addOneliner(protection: DescriptionMeta, message: DocumentNode): void {
54+
addOneliner(
55+
protection: DescriptionMeta,
56+
capability: Capability,
57+
message: DocumentNode
58+
): void {
4559
this.sendMessage(
60+
capability,
4661
<fragment>
4762
<code>{protection.name}</code>: {message}
4863
</fragment>

src/capabilities/RendererMessageCollector.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// SPDX-License-Identifier: AFL-3.0
44

55
import { DocumentNode } from "@the-draupnir-project/interface-manager";
6-
import { DescriptionMeta } from "matrix-protection-suite";
6+
import { Capability, DescriptionMeta } from "matrix-protection-suite";
77

88
export enum MessageType {
99
Document = "Document",
@@ -12,13 +12,22 @@ export enum MessageType {
1212
}
1313

1414
export interface RendererMessageCollector {
15-
addMessage(protection: DescriptionMeta, message: DocumentNode): void;
16-
addOneliner(protection: DescriptionMeta, message: DocumentNode): void;
15+
addMessage(
16+
protection: DescriptionMeta,
17+
capability: Capability,
18+
message: DocumentNode
19+
): void;
20+
addOneliner(
21+
protection: DescriptionMeta,
22+
capability: Capability,
23+
message: DocumentNode
24+
): void;
1725
getMessages(): RendererMessage[];
1826
}
1927

2028
export interface RendererMessage {
2129
protection: DescriptionMeta;
30+
capability: Capability;
2231
message: DocumentNode;
2332
type: MessageType;
2433
}
@@ -33,17 +42,27 @@ export class AbstractRendererMessageCollector
3342
public getMessages(): RendererMessage[] {
3443
return this.messages;
3544
}
36-
addMessage(protection: DescriptionMeta, message: DocumentNode): void {
45+
addMessage(
46+
protection: DescriptionMeta,
47+
capability: Capability,
48+
message: DocumentNode
49+
): void {
3750
this.messages.push({
3851
protection,
52+
capability,
3953
message,
4054
type: MessageType.Document,
4155
});
4256
}
4357

44-
addOneliner(protection: DescriptionMeta, message: DocumentNode): void {
58+
addOneliner(
59+
protection: DescriptionMeta,
60+
capability: Capability,
61+
message: DocumentNode
62+
): void {
4563
this.messages.push({
4664
protection,
65+
capability,
4766
message,
4867
type: MessageType.OneLine,
4968
});

src/capabilities/ServerACLConsequencesRenderer.tsx

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
6262
if (isError(capabilityResult)) {
6363
this.messageCollector.addMessage(
6464
this.description,
65+
this.capability,
6566
renderFailedSingularConsequence(
6667
this.description,
6768
title,
@@ -72,7 +73,11 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
7273
}
7374
// only add the message if we changed anything in the room.
7475
if (capabilityResult.ok) {
75-
this.messageCollector.addOneliner(this.description, title);
76+
this.messageCollector.addOneliner(
77+
this.description,
78+
this.capability,
79+
title
80+
);
7681
}
7782
return capabilityResult;
7883
}
@@ -85,6 +90,7 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
8590
if (isError(capabilityResult)) {
8691
this.messageCollector.addMessage(
8792
this.description,
93+
this.capability,
8894
renderFailedSingularConsequence(
8995
this.description,
9096
title,
@@ -95,6 +101,7 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
95101
}
96102
this.messageCollector.addMessage(
97103
this.description,
104+
this.capability,
98105
renderRoomSetResult(capabilityResult.ok, {
99106
summary: (
100107
<fragment>
@@ -121,6 +128,7 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
121128
if (isError(capabilityResult)) {
122129
this.messageCollector.addMessage(
123130
this.description,
131+
this.capability,
124132
renderFailedSingularConsequence(
125133
this.description,
126134
title,
@@ -131,6 +139,7 @@ class StandardServerConsequencesRenderer implements ServerConsequences {
131139
}
132140
this.messageCollector.addMessage(
133141
this.description,
142+
this.capability,
134143
renderRoomSetResult(capabilityResult.ok, {
135144
summary: (
136145
<fragment>
@@ -154,6 +163,7 @@ describeCapabilityRenderer<ServerConsequences, Draupnir>({
154163
capability
155164
);
156165
},
166+
isDefaultForInterface: true,
157167
});
158168

159169
describeCapabilityContextGlue<Draupnir, ServerACLConsequencesContext>({
@@ -169,3 +179,16 @@ describeCapabilityContextGlue<Draupnir, ServerACLConsequencesContext>({
169179
});
170180
},
171181
});
182+
183+
describeCapabilityContextGlue<Draupnir, ServerACLConsequencesContext>({
184+
name: "SimulatedServerConsequences",
185+
glueMethod: function (
186+
protectionDescription,
187+
draupnir,
188+
capabilityProvider
189+
): Capability {
190+
return capabilityProvider.factory(protectionDescription, {
191+
protectedRoomsSet: draupnir.protectedRoomsSet,
192+
} as ServerACLConsequencesContext);
193+
},
194+
});

src/capabilities/StandardEventConsequencesRenderer.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class StandardEventConsequencesRenderer implements EventConsequences {
5757
if (isError(capabilityResult)) {
5858
this.messageCollector.addOneliner(
5959
this.description,
60+
this.capability,
6061
renderFailedSingularConsequence(
6162
this.description,
6263
title,
@@ -65,7 +66,7 @@ class StandardEventConsequencesRenderer implements EventConsequences {
6566
);
6667
return capabilityResult;
6768
}
68-
this.messageCollector.addOneliner(this.description, title);
69+
this.messageCollector.addOneliner(this.description, this.capability, title);
6970
return capabilityResult;
7071
}
7172
}
@@ -81,6 +82,7 @@ describeCapabilityRenderer<EventConsequences, Draupnir>({
8182
capability
8283
);
8384
},
85+
isDefaultForInterface: true,
8486
});
8587

8688
describeCapabilityContextGlue<Draupnir, { eventRedacter: RoomEventRedacter }>({

src/capabilities/StandardUserConsequencesRenderer.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
127127
if (isError(capabilityResult)) {
128128
this.messageCollector.addMessage(
129129
this.description,
130+
this.capability,
130131
renderFailedSingularConsequence(
131132
this.description,
132133
title,
@@ -135,7 +136,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
135136
);
136137
return capabilityResult;
137138
}
138-
this.messageCollector.addOneliner(this.description, title);
139+
this.messageCollector.addOneliner(this.description, this.capability, title);
139140
return Ok(undefined);
140141
}
141142
public async consequenceForUsersInRoomSet(
@@ -149,6 +150,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
149150
);
150151
this.messageCollector.addMessage(
151152
this.description,
153+
this.capability,
152154
renderFailedSingularConsequence(
153155
this.description,
154156
title,
@@ -163,6 +165,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
163165
}
164166
this.messageCollector.addMessage(
165167
this.description,
168+
this.capability,
166169
renderResultForUserInSetMap(usersInSetMap, {
167170
ingword: "Banning",
168171
nnedword: "banned",
@@ -188,6 +191,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
188191
);
189192
this.messageCollector.addMessage(
190193
this.description,
194+
this.capability,
191195
renderFailedSingularConsequence(
192196
this.description,
193197
title,
@@ -202,6 +206,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
202206
}
203207
this.messageCollector.addMessage(
204208
this.description,
209+
this.capability,
205210
renderResultForUsersInRoom(resultMap, {
206211
summary: (
207212
<fragment>
@@ -233,6 +238,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
233238
);
234239
this.messageCollector.addMessage(
235240
this.description,
241+
this.capability,
236242
renderFailedSingularConsequence(
237243
this.description,
238244
title,
@@ -247,6 +253,7 @@ class StandardUserConsequencesRenderer implements UserConsequences {
247253
}
248254
this.messageCollector.addMessage(
249255
this.description,
256+
this.capability,
250257
renderRoomSetResultForUser(usersInSetMap, userID, "unbanned", {
251258
description: this.description,
252259
})
@@ -266,6 +273,7 @@ describeCapabilityRenderer<UserConsequences, Draupnir>({
266273
capability
267274
);
268275
},
276+
isDefaultForInterface: true,
269277
});
270278

271279
describeCapabilityContextGlue<Draupnir, StandardUserConsequencesContext>({
@@ -282,3 +290,16 @@ describeCapabilityContextGlue<Draupnir, StandardUserConsequencesContext>({
282290
});
283291
},
284292
});
293+
294+
describeCapabilityContextGlue<Draupnir, StandardUserConsequencesContext>({
295+
name: "SimulatedUserConsequences",
296+
glueMethod: function (
297+
protectionDescription,
298+
draupnir,
299+
capabilityProvider
300+
): Capability {
301+
return capabilityProvider.factory(protectionDescription, {
302+
setMembership: draupnir.protectedRoomsSet.setRoomMembership,
303+
} as StandardUserConsequencesContext);
304+
},
305+
});

src/commands/DraupnirCommands.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { DraupnirImportCommand } from "./ImportCommand";
2222
import { DraupnirKickCommand } from "./KickCommand";
2323
import {
2424
DraupnirListProtectionsCommand,
25+
DraupnirProtectionsCapabilityResetCommand,
2526
DraupnirProtectionsConfigAddCommand,
2627
DraupnirProtectionsConfigRemoveCommand,
2728
DraupnirProtectionsConfigResetCommand,
@@ -75,6 +76,11 @@ const DraupnirCommands = new StandardCommandTable("draupnir")
7576
"protections",
7677
"capability",
7778
])
79+
.internCommand(DraupnirProtectionsCapabilityResetCommand, [
80+
"protections",
81+
"capability",
82+
"reset",
83+
])
7884
.internCommand(DraupnirProtectionsEnableCommand, ["protections", "enable"])
7985
.internCommand(DraupnirProtectionsDisableCommand, ["protections", "disable"])
8086
.internCommand(DraupnirProtectionsConfigAddCommand, [

0 commit comments

Comments
 (0)