1 files changed, 48 insertions, 0 deletions
diff --git a/MiniUtils.CSync/Worker.cs b/MiniUtils.CSync/Worker.cs
new file mode 100644
index 0000000..b2f8d58
--- /dev/null
+++ b/MiniUtils.CSync/Worker.cs
@@ -0,0 +1,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++) {
+
+ }
+ }
+}
\ No newline at end of file
|