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 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()) .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 userIds, GenericRoom room) { for (int i = 0; i < 10; i++) { } } }