feat: proxy debug command
Co-authored-by: Spectralitree <72747870+Spectralitree@users.noreply.github.com>
This commit is contained in:
		@@ -84,6 +84,7 @@ namespace PluralKit.Bot
 | 
			
		||||
        public static Command Explain = new Command("explain", "explain", "Explains the basics of systems and proxying");
 | 
			
		||||
        public static Command Message = new Command("message", "message <id|link> [delete|author]", "Looks up a proxied message");
 | 
			
		||||
        public static Command MessageEdit = new Command("edit", "edit [link] <text>", "Edit a previously proxied message");
 | 
			
		||||
        public static Command ProxyCheck = new Command("proxycheck", "proxycheck [link]", "Checks why your message has not been proxied");
 | 
			
		||||
        public static Command LogChannel = new Command("log channel", "log channel <channel>", "Designates a channel to post proxied messages to");
 | 
			
		||||
        public static Command LogChannelClear = new Command("log channel", "log channel -clear", "Clears the currently set log channel");
 | 
			
		||||
        public static Command LogEnable = new Command("log enable", "log enable all|<channel> [channel 2] [channel 3...]", "Enables message logging in certain channels");
 | 
			
		||||
@@ -191,7 +192,10 @@ namespace PluralKit.Bot
 | 
			
		||||
                    return PrintCommandList(ctx, "channel blacklisting", BlacklistCommands);
 | 
			
		||||
                else return PrintCommandExpectedError(ctx, BlacklistCommands);
 | 
			
		||||
            if (ctx.Match("proxy"))
 | 
			
		||||
                return ctx.Execute<SystemEdit>(SystemProxy, m => m.SystemProxy(ctx));
 | 
			
		||||
                if (ctx.Match("debug"))
 | 
			
		||||
                    return ctx.Execute<Misc>(ProxyCheck, m => m.MessageProxyCheck(ctx));
 | 
			
		||||
                else
 | 
			
		||||
                    return ctx.Execute<SystemEdit>(SystemProxy, m => m.SystemProxy(ctx));
 | 
			
		||||
            if (ctx.Match("invite")) return ctx.Execute<Misc>(Invite, m => m.Invite(ctx));
 | 
			
		||||
            if (ctx.Match("mn")) return ctx.Execute<Fun>(null, m => m.Mn(ctx));
 | 
			
		||||
            if (ctx.Match("fire")) return ctx.Execute<Fun>(null, m => m.Fire(ctx));
 | 
			
		||||
@@ -202,6 +206,10 @@ namespace PluralKit.Bot
 | 
			
		||||
            if (ctx.Match("stats")) return ctx.Execute<Misc>(null, m => m.Stats(ctx));
 | 
			
		||||
            if (ctx.Match("permcheck"))
 | 
			
		||||
                return ctx.Execute<Misc>(PermCheck, m => m.PermCheckGuild(ctx));
 | 
			
		||||
            if (ctx.Match("proxycheck"))
 | 
			
		||||
                return ctx.Execute<Misc>(ProxyCheck, m => m.MessageProxyCheck(ctx));
 | 
			
		||||
            if (ctx.Match("debug"))
 | 
			
		||||
                return HandleDebugCommand(ctx);
 | 
			
		||||
            if (ctx.Match("admin"))
 | 
			
		||||
                return HandleAdminCommand(ctx);
 | 
			
		||||
            if (ctx.Match("random", "r"))
 | 
			
		||||
@@ -231,6 +239,20 @@ namespace PluralKit.Bot
 | 
			
		||||
                await ctx.Reply($"{Emojis.Error} Unknown command.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private async Task HandleDebugCommand(Context ctx)
 | 
			
		||||
        {
 | 
			
		||||
            var availableCommandsStr = "Available debug targets: `permissions`, `proxying`";
 | 
			
		||||
 | 
			
		||||
            if (ctx.Match("permissions", "perms", "permcheck"))
 | 
			
		||||
                await ctx.Execute<Misc>(PermCheck, m => m.PermCheckGuild(ctx));
 | 
			
		||||
            else if (ctx.Match("proxy", "proxying", "proxycheck"))
 | 
			
		||||
                await ctx.Execute<Misc>(ProxyCheck, m => m.MessageProxyCheck(ctx));
 | 
			
		||||
            else if (!ctx.HasNext())
 | 
			
		||||
                await ctx.Reply($"{Emojis.Error} You need to pass a command. {availableCommandsStr}");
 | 
			
		||||
            else
 | 
			
		||||
                await ctx.Reply($"{Emojis.Error} Unknown debug command {ctx.PeekArgument().AsCode()}. {availableCommandsStr}");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private async Task HandleSystemCommand(Context ctx)
 | 
			
		||||
        {
 | 
			
		||||
            // If we have no parameters, default to self-target
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ namespace PluralKit.Bot
 | 
			
		||||
            await using var conn = await _db.Obtain();
 | 
			
		||||
            FullMessage? msg = null;
 | 
			
		||||
 | 
			
		||||
            var referencedMessage = ctx.MatchMessage(false);
 | 
			
		||||
            var (referencedMessage, _) = ctx.MatchMessage(false);
 | 
			
		||||
            if (referencedMessage != null)
 | 
			
		||||
            {
 | 
			
		||||
                msg = await _repo.GetMessage(conn, referencedMessage.Value);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ using Myriad.Cache;
 | 
			
		||||
using Myriad.Extensions;
 | 
			
		||||
using Myriad.Gateway;
 | 
			
		||||
using Myriad.Rest;
 | 
			
		||||
using Myriad.Rest.Exceptions;
 | 
			
		||||
using Myriad.Rest.Types.Requests;
 | 
			
		||||
using Myriad.Types;
 | 
			
		||||
 | 
			
		||||
@@ -34,8 +35,11 @@ namespace PluralKit.Bot {
 | 
			
		||||
        private readonly DiscordApiClient _rest;
 | 
			
		||||
        private readonly Cluster _cluster;
 | 
			
		||||
        private readonly Bot _bot;
 | 
			
		||||
        private readonly ProxyService _proxy;
 | 
			
		||||
        private readonly ProxyMatcher _matcher;
 | 
			
		||||
 | 
			
		||||
        public Misc(BotConfig botConfig, IMetrics metrics, CpuStatService cpu, ShardInfoService shards, EmbedService embeds, ModelRepository repo, IDatabase db, IDiscordCache cache, DiscordApiClient rest, Bot bot, Cluster cluster)
 | 
			
		||||
        public Misc(BotConfig botConfig, IMetrics metrics, CpuStatService cpu, ShardInfoService shards, EmbedService embeds, ModelRepository repo,
 | 
			
		||||
                                IDatabase db, IDiscordCache cache, DiscordApiClient rest, Bot bot, Cluster cluster, ProxyService proxy, ProxyMatcher matcher)
 | 
			
		||||
        {
 | 
			
		||||
            _botConfig = botConfig;
 | 
			
		||||
            _metrics = metrics;
 | 
			
		||||
@@ -48,6 +52,8 @@ namespace PluralKit.Bot {
 | 
			
		||||
            _rest = rest;
 | 
			
		||||
            _bot = bot;
 | 
			
		||||
            _cluster = cluster;
 | 
			
		||||
            _proxy = proxy;
 | 
			
		||||
            _matcher = matcher;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public async Task Invite(Context ctx)
 | 
			
		||||
@@ -218,7 +224,7 @@ namespace PluralKit.Bot {
 | 
			
		||||
        
 | 
			
		||||
        public async Task GetMessage(Context ctx)
 | 
			
		||||
        {
 | 
			
		||||
            var messageId = ctx.MatchMessage(true);
 | 
			
		||||
            var (messageId, _) = ctx.MatchMessage(true);
 | 
			
		||||
            if (messageId == null)
 | 
			
		||||
            {
 | 
			
		||||
                if (!ctx.HasNext())
 | 
			
		||||
@@ -250,5 +256,69 @@ namespace PluralKit.Bot {
 | 
			
		||||
 | 
			
		||||
            await ctx.Reply(embed: await _embeds.CreateMessageInfoEmbed(message));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task MessageProxyCheck(Context ctx)
 | 
			
		||||
        {
 | 
			
		||||
            if (!ctx.HasNext() && ctx.Message.MessageReference == null)
 | 
			
		||||
                throw new PKError("You need to specify a message.");
 | 
			
		||||
            
 | 
			
		||||
            var failedToGetMessage = "Could not find a valid message to check, was not able to fetch the message, or the message was not sent by you.";
 | 
			
		||||
 | 
			
		||||
            var (messageId, channelId) = ctx.MatchMessage(false);
 | 
			
		||||
            if (messageId == null || channelId == null)
 | 
			
		||||
                throw new PKError(failedToGetMessage);
 | 
			
		||||
 | 
			
		||||
            await using var conn = await _db.Obtain();
 | 
			
		||||
 | 
			
		||||
            var proxiedMsg = await _repo.GetMessage(conn, messageId.Value);
 | 
			
		||||
            if (proxiedMsg != null)
 | 
			
		||||
            {
 | 
			
		||||
                await ctx.Reply($"{Emojis.Success} This message was proxied successfully.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // get the message info
 | 
			
		||||
            var msg = ctx.Message;
 | 
			
		||||
            try 
 | 
			
		||||
            {
 | 
			
		||||
                msg = await _rest.GetMessage(channelId.Value, messageId.Value);
 | 
			
		||||
            }
 | 
			
		||||
            catch (ForbiddenException)
 | 
			
		||||
            {
 | 
			
		||||
                throw new PKError(failedToGetMessage);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // if user is fetching a message in a different channel sent by someone else, throw a generic error message
 | 
			
		||||
            if (msg == null || (msg.Author.Id != ctx.Author.Id && msg.ChannelId != ctx.Channel.Id))
 | 
			
		||||
                throw new PKError(failedToGetMessage);
 | 
			
		||||
 | 
			
		||||
            if ((_botConfig.Prefixes ?? BotConfig.DefaultPrefixes).Any(p => msg.Content.StartsWith(p)))
 | 
			
		||||
                throw new PKError("This message starts with the bot's prefix, and was parsed as a command.");
 | 
			
		||||
            if (msg.WebhookId != null)
 | 
			
		||||
                throw new PKError("You cannot check messages sent by a webhook.");
 | 
			
		||||
            if (msg.Author.Id != ctx.Author.Id)
 | 
			
		||||
                throw new PKError("You can only check your own messages.");
 | 
			
		||||
 | 
			
		||||
            // get the channel info
 | 
			
		||||
            var channel = _cache.GetChannel(channelId.Value);
 | 
			
		||||
            if (channel == null)
 | 
			
		||||
                throw new PKError("Unable to get the channel associated with this message.");
 | 
			
		||||
 | 
			
		||||
            // using channel.GuildId here since _rest.GetMessage() doesn't return the GuildId
 | 
			
		||||
            var context = await _repo.GetMessageContext(conn, msg.Author.Id, channel.GuildId.Value, msg.ChannelId);
 | 
			
		||||
            var members = (await _repo.GetProxyMembers(conn, msg.Author.Id, channel.GuildId.Value)).ToList();
 | 
			
		||||
 | 
			
		||||
            // Run everything through the checks, catch the ProxyCheckFailedException, and reply with the error message.
 | 
			
		||||
            try 
 | 
			
		||||
            { 
 | 
			
		||||
                _proxy.ShouldProxy(channel, msg, context);
 | 
			
		||||
                _matcher.TryMatch(context, members, out var match, msg.Content, msg.Attachments.Length > 0, context.AllowAutoproxy);
 | 
			
		||||
 | 
			
		||||
                await ctx.Reply("I'm not sure why this message was not proxied, sorry.");
 | 
			
		||||
            } catch (ProxyService.ProxyChecksFailedException e)
 | 
			
		||||
            {
 | 
			
		||||
                await ctx.Reply($"{e.Message}");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user