about summary refs log tree commit diff
path: root/MatrixContentFilter/Commands/BanCommand.cs
blob: 0ae38e2ce8963ad428f846be681e51da3f747f4b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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; }
    }
}