using System.Collections.Frozen; using ArcaneLibs.Extensions; using LibMatrix; using LibMatrix.EventTypes.Spec.State.RoomInfo; using LibMatrix.Filters; using LibMatrix.Helpers; using LibMatrix.RoomTypes; using LibMatrix.Utilities.Bot.Interfaces; using MiniUtils.Classes; using MiniUtils.Services; namespace MiniUtils.Commands; public class KickACLedCommand(IgnoreListManager ignoreListManager) : ICommand { public string Name => "kick acled users"; public string[]? Aliases => []; public string Description => "Kick all users targetted by server ACLs"; public bool Unlisted => false; public async Task Invoke(CommandContext ctx) { if (ctx.Args is ["banned"]) await RedactUsers(ctx, await ctx.Room.GetMemberIdsListAsync("ban")); else if (ctx.Args is [.. var senders]) { var sendersSet = senders.ToFrozenSet(); await RedactUsers(ctx, sendersSet); } } private async Task RedactUsers(CommandContext ctx, FrozenSet senders) { var count = 0; var subCount = 0; List 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; // 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 acls = await ctx.Room.GetStateOrNullAsync(RoomServerAclEventContent.EventId); if (acls == null) { await ctx.Room.SendMessageEventAsync(new MessageBuilder().WithBody("No ACLs found.").Build()); return; } await foreach (var resp in ctx.Room.GetMembersEnumerableAsync()) { var serverName = resp.StateKey!.Split(':',2)[1]; if (acls.DenyRegexes?.Any(x => x.IsMatch(serverName)) ?? false) { Console.WriteLine("Kicking {0} from {1} due to ACL match: {2}", resp.StateKey, ctx.Room.RoomId, acls.DenyRegexes.First(x => x.IsMatch(serverName))); } } await Task.WhenAll(tasks); await ctx.Room.SendMessageEventAsync(new MessageBuilder().WithBody($"{Emojis.Recycle} {count}").Build()); } }