about summary refs log tree commit diff
path: root/MiniUtils.CSync/Worker.cs
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++) {
            
        }
    }
}