using LibMatrix.Helpers; using LibMatrix.RoomTypes; using LibMatrix.Utilities.Bot.Interfaces; using MatrixContentFilter.Services; using MatrixContentFilter.Services.AsyncActionQueues; namespace MatrixContentFilter.Commands; public class BanCommand( ConfigurationService filterConfigService, AsyncMessageQueue msgQueue, InfoCacheService infoCache, ConfigurationService cfgService, AbstractAsyncActionQueue actionQueue ) : ICommand { public string Name { get; } = "ban"; public string[]? Aliases { get; } = []; public string Description { get; } = "Ban user (see --help)"; public bool Unlisted { get; } = false; public async Task Invoke(CommandContext ctx) { bool HasMoreArgs(int index) => ctx.Args.Length > index + 1; if (ctx.Args.Contains("--help") || ctx.Args.Length == 0) { await SendHelp(ctx.Room); return; } BanCommandArgs args = new() { UserId = null, Reason = null }; // if (ctx.Args.Contains("--redact")) { // var index = Array.IndexOf(ctx.Args, "--redact"); // if (HasMoreArgs(index)) { // args.Redact = int.TryParse(ctx.Args[index + 1], out var redact) ? redact : 500; // } // } for (int i = 0; i < ctx.Args.Length; i++) { if (ctx.Args[i].StartsWith("--")) { switch (ctx.Args[i]) { case "--redact": { if (HasMoreArgs(i)) { // args.Redact = int.TryParse(ctx.Args[i + 1], out var redact) ? redact : 500; if (int.TryParse(ctx.Args[i + 1], out var redact)) { args.Redact = redact; i++; } else args.Redact = 500; } break; } } } else if (args.UserId == null) { args.UserId = ctx.Args[i]; } else args.Reason += ctx.Args[i] + " "; } } private async Task SendHelp(GenericRoom room) { string[][] helpTable = [ ["--help", "", "Show this message"], ["--redact", "count ?? 500", "Redact last N events from user"], ["user_id", "required", "User ID to ban"], ["reason", "required", "Reason for ban"], ]; var msb = new MessageBuilder("m.notice") .WithTable(tb => { tb.WithTitle("Help for ban command", 3) .WithTitle("Basic usage: ban [options] user_id reason", 3) .WithRow(rb => rb.WithCell("Command") .WithCell("Arguments") .WithCell("Description") ); foreach (var row in helpTable) { tb.WithRow(rb => rb.WithCell(row[0]) .WithCell(row[1]) .WithCell(row[2]) ); } }); await room.SendMessageEventAsync(msb.Build()); } private struct BanCommandArgs { public string UserId { get; set; } public string? Reason { get; set; } public int? Redact { get; set; } } }