about summary refs log tree commit diff
path: root/MiniUtils/Commands/RedactCommand.cs
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-11-10 03:05:18 +0100
committerRory& <root@rory.gay>2025-11-10 03:05:18 +0100
commitd272c5b6f50e3f66a430fe4a6bbb3188f9adb1c8 (patch)
tree328d96076fe8c6fe6081f9083fcb3a498c41a683 /MiniUtils/Commands/RedactCommand.cs
parentMore stuff (diff)
downloadMiniUtils-d272c5b6f50e3f66a430fe4a6bbb3188f9adb1c8.tar.xz
MiniUtils changes, add uick ban sync hack bot HEAD master
Diffstat (limited to 'MiniUtils/Commands/RedactCommand.cs')
-rw-r--r--MiniUtils/Commands/RedactCommand.cs83
1 files changed, 56 insertions, 27 deletions
diff --git a/MiniUtils/Commands/RedactCommand.cs b/MiniUtils/Commands/RedactCommand.cs

index e84191e..8aa65fc 100644 --- a/MiniUtils/Commands/RedactCommand.cs +++ b/MiniUtils/Commands/RedactCommand.cs
@@ -1,6 +1,7 @@ using System.Collections.Frozen; using ArcaneLibs.Extensions; using LibMatrix; +using LibMatrix.EventTypes.Spec; using LibMatrix.EventTypes.Spec.State.RoomInfo; using LibMatrix.Filters; using LibMatrix.Helpers; @@ -30,55 +31,83 @@ public class RedactCommand(IgnoreListManager ignoreListManager) : ICommand { } private async Task RedactUsers(CommandContext ctx, FrozenSet<string> senders) { - var filter = new SyncFilter.EventFilter(senders: senders.ToList(), notTypes: ["m.room.redaction"]); await ignoreListManager.MoveList(false, senders); var count = 0; - List<Task> tasks = []; - await foreach (var resp in ctx.Room.GetManyMessagesAsync(filter: filter.ToJson(false, ignoreNull: true), chunkSize: 1000)) { - foreach (var chunk in resp.Chunk.Chunk(49)) { - foreach (var evt in chunk) { - if (!senders.Contains(evt.Sender!)) continue; - if(!await IsRedactionNeeded(ctx.Room, evt.EventId!, evt)) continue; - tasks.Add(RedactEvent(ctx.Room, evt.EventId!)); - count++; - } - - if (tasks.Count > 0) { - await ctx.Room.SendMessageEventAsync(new MessageBuilder() - .WithBody( - $"[{Emojis.Hourglass}] {Emojis.Recycle} {count} ({Emojis.Checkmark} {tasks.Count(t => t.IsCompletedSuccessfully)} {Emojis.Prohibited} {tasks.Count(t => t.IsFaulted)} {Emojis.Hourglass} {tasks.Count(t => t.Status == TaskStatus.Running)})") - .Build()); - // await Task.WhenAll(tasks); + // var subCount = 0; + // List<Task> tasks = []; + foreach (var senderChunk in senders.Chunk(10)) { + var filter = new SyncFilter.EventFilter(senders: senderChunk.ToList(), notTypes: ["m.room.redaction"]); + + await foreach (var resp in ctx.Room.GetManyMessagesAsync(filter: filter.ToJson(false, ignoreNull: true), chunkSize: 1000)) { + // foreach (var chunk in resp.Chunk.Chunk(49)) { + // foreach (var evt in chunk) { + // if (!senders.Contains(evt.Sender!)) continue; + // if (!await IsRedactionNeeded(ctx.Room, evt.EventId!, evt)) continue; + // tasks.Add(RedactEvent(ctx.Room, evt.EventId!)); + // count++; + // subCount++; + // } + // + // if (subCount >= 40) { + // await ctx.Room.SendMessageEventAsync(new MessageBuilder() + // .WithBody( + // $"[{Emojis.Hourglass}] {Emojis.Recycle} {count} ({Emojis.Checkmark} {tasks.Count(t => t.IsCompletedSuccessfully)} {Emojis.Prohibited} {tasks.Count(t => t.IsFaulted)} {Emojis.Hourglass} {tasks.Count(t => t.Status == TaskStatus.Running)})") + // .Build()); + // // await Task.WhenAll(tasks); + // subCount = 0; + // } + // } + var toRedactQueryTask = resp.Chunk + .Where(x => senders.Contains(x.Sender!)) + .Select(async x => (x, await IsRedactionNeeded(ctx.Room, x.EventId!, x))) + .ToList(); + var toRedact = (await Task.WhenAll(toRedactQueryTask)).Where(x => x.Item2).Select(x => x.x).ToList(); + foreach (var chunk in toRedact.Chunk(49)) { + var toSend = chunk.Select(x => new StateEvent() { + Type = RoomRedactionEventContent.EventId, + TypedContent = new RoomRedactionEventContent() { + Redacts = x.EventId + } + }).ToList(); + toSend.Add(new StateEvent() { + Type = RoomMessageEventContent.EventId, + TypedContent = + new MessageBuilder() + .WithBody( + $"[{Emojis.Hourglass}] {Emojis.Recycle} {count} ({Emojis.Checkmark} {count} {Emojis.Hourglass} {toSend.Count})") + .Build() + }); + count += toSend.Count - 1; + await ctx.Room.BulkSendEventsAsync(toSend); } } } - await Task.WhenAll(tasks); - + // await Task.WhenAll(tasks); + await ctx.Room.SendMessageEventAsync(new MessageBuilder().WithBody($"{Emojis.Recycle} {count}").Build()); // await ctx.Room.SendReactionAsync(ctx.MessageEvent.EventId!, $"{Emojis.Recycle} {count}"); } private async Task<bool> IsRedactionNeeded(GenericRoom roomId, string eventId, StateEventResponse? evt = null) { evt ??= await roomId.GetEventAsync(eventId); - + // Ignore room member state events if (evt is { StateKey: not null, Type: not RoomMemberEventContent.EventId }) return false; - + // Ignore redaction events if (evt is { Type: RoomRedactionEventContent.EventId }) return false; - + // Ignore empty events if (evt is { RawContent: null or { Count: 0 } }) return false; - + // Ignore redacted events if (evt.Unsigned?.ContainsKey("redacted_because") == true) return false; - - - throw new NotImplementedException("Redaction check not implemented"); + return true; + // throw new NotImplementedException("Redaction check not implemented"); } - + private async Task RedactEvent(GenericRoom room, string eventId) { bool success; do {