1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
using LibMatrix.EventTypes.Spec;
using LibMatrix.Helpers;
using LibMatrix.Homeservers;
using LibMatrix.RoomTypes;
using LibMatrix.Services;
using MediaModeratorPoC.AccountData;
using MediaModeratorPoC.StateEventTypes;
using Microsoft.Extensions.Logging;
namespace MediaModeratorPoC;
public class PolicyEngine(AuthenticatedHomeserverGeneric hs, ILogger<MediaModBot> logger, MediaModBotConfiguration configuration,
HomeserverResolverService hsResolver) {
public List<PolicyList> ActivePolicyLists { get; set; } = new();
private GenericRoom? _logRoom;
private GenericRoom? _controlRoom;
public async Task ReloadActivePolicyLists() {
// first time init
if (_logRoom is null || _controlRoom is null) {
var botData = await hs.GetAccountDataAsync<BotData>("gay.rory.modbot_data");
_logRoom ??= hs.GetRoom(botData.LogRoom ?? botData.ControlRoom);
_controlRoom ??= hs.GetRoom(botData.ControlRoom);
}
await _controlRoom?.SendMessageEventAsync(MessageFormatter.FormatSuccess("Reloading policy lists!"))!;
await _logRoom?.SendMessageEventAsync(
new RoomMessageEventContent(
body: "Reloading policy lists!",
messageType: "m.text"))!;
await _controlRoom?.SendMessageEventAsync(MessageFormatter.FormatSuccess("0/? policy lists loaded"))!;
var policyLists = new List<PolicyList>();
var policyListAccountData = await hs.GetAccountDataAsync<Dictionary<string, PolicyList>>("gay.rory.modbot.policy_lists");
foreach (var (roomId, policyList) in policyListAccountData) {
_logRoom?.SendMessageEventAsync(
new RoomMessageEventContent(
body: $"Loading policy list {MessageFormatter.HtmlFormatMention(roomId)}!",
messageType: "m.text"));
var room = hs.GetRoom(roomId);
policyList.Room = room;
var stateEvents = room.GetFullStateAsync();
await foreach (var stateEvent in stateEvents) {
if (stateEvent != null && stateEvent.GetType.IsAssignableTo(typeof(BasePolicy))) {
policyList.Policies.Add(stateEvent);
}
}
//html table of policy count by type
var policyCount = policyList.Policies.GroupBy(x => x.Type).ToDictionary(x => x.Key, x => x.Count());
var policyCountTable = policyCount.Aggregate(
"<table><tr><th>Policy Type</th><th>Count</th></tr>",
(current, policy) => current + $"<tr><td>{policy.Key}</td><td>{policy.Value}</td></tr>");
policyCountTable += "</table>";
var policyCountTablePlainText = policyCount.Aggregate(
"Policy Type | Count\n",
(current, policy) => current + $"{policy.Key,-16} | {policy.Value}\n");
await _logRoom?.SendMessageEventAsync(
new RoomMessageEventContent() {
MessageType = "org.matrix.custom.html",
Body = $"Policy count for {roomId}:\n{policyCountTablePlainText}",
FormattedBody = $"Policy count for {MessageFormatter.HtmlFormatMention(roomId)}:\n{policyCountTable}",
})!;
await _logRoom?.SendMessageEventAsync(
new RoomMessageEventContent(
body: $"Loaded {policyList.Policies.Count} policies for {MessageFormatter.HtmlFormatMention(roomId)}!",
messageType: "m.text"))!;
policyLists.Add(policyList);
var progressMsgContent = MessageFormatter.FormatSuccess($"{policyLists.Count}/{policyListAccountData.Count} policy lists loaded");
//edit old message
progressMsgContent.RelatesTo = new() {
};
_controlRoom?.SendMessageEventAsync(progressMsgContent);
}
ActivePolicyLists = policyLists;
}
}
|