blob: b2f8d5884a4bfeec3bbf24c362fb4f457e504bcb (
plain) (
blame)
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
|
using LibMatrix;
using LibMatrix.EventTypes.Spec.State.Policy;
using LibMatrix.EventTypes.Spec.State.RoomInfo;
using LibMatrix.Helpers;
using LibMatrix.Homeservers;
using LibMatrix.RoomTypes;
using MiniUtils.Classes;
namespace MiniUtils.CSync;
public class Worker(ILogger<Worker> logger, AuthenticatedHomeserverGeneric hs) : BackgroundService {
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
while (!stoppingToken.IsCancellationRequested) {
var cme = hs.GetRoom("!fTjMjIzNKEsFlUIiru:neko.dev");
var targetRoom = hs.GetRoom("!kiP76YI0AlDqXjcKj2nM_Bq30GCgGWehndSt3iyA85E");
var policies = (await cme.GetFullStateAsListAsync()).Where(x => x is { Type: UserPolicyRuleEventContent.EventId, RawContent.Count: > 1 })
.Select(x => x.ContentAs<UserPolicyRuleEventContent>())
.ToList();
var members = await targetRoom.GetMemberIdsListAsync(membership: "join");
var intersected = members.Where(x => policies.Any(p => p!.Entity == x)).ToList();
logger.LogInformation("Found {count} members matching policies", intersected.Count);
if (intersected.Count > 0) {
await targetRoom.BulkSendEventsAsync(intersected.Select(x => new StateEvent() {
Type = RoomMemberEventContent.EventId,
StateKey = x,
TypedContent = new RoomMemberEventContent() {
Membership = "ban",
Reason = "spam"
}
}));
await targetRoom.SendMessageEventAsync(new MessageBuilder()
.WithBody($"[Pagination helper - {Emojis.Wastebasket}] Banned {intersected.Count} users")
.Build());
// await RedactEventsAsync()
}
await Task.Delay(5000, stoppingToken);
}
}
private async Task RedactEventsAsync(List<string> userIds, GenericRoom room) {
for (int i = 0; i < 10; i++) {
}
}
}
|