From ece884f83a6dc6837fcb83e7afc72e2409b8276b Mon Sep 17 00:00:00 2001 From: rladenson Date: Mon, 18 Nov 2024 18:45:13 -0700 Subject: [PATCH] feat: add raw and plaintext formats to member avatar, proxy avatar, and guild avatar --- .../Context/ContextArgumentsExt.cs | 9 ++++++ .../CommandSystem/Context/ContextAvatarExt.cs | 4 +++ PluralKit.Bot/Commands/MemberAvatar.cs | 28 +++++++++++++++---- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs b/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs index 1a958c8e..982eec77 100644 --- a/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs +++ b/PluralKit.Bot/CommandSystem/Context/ContextArgumentsExt.cs @@ -98,6 +98,15 @@ public static class ContextArgumentsExt return ReplyFormat.Standard; } + public static ReplyFormat PeekMatchFormat(this Context ctx) + { + int ptr1 = ctx.Parameters._ptr; + int ptr2 = ctx.Parameters._ptr; + if (ctx.PeekMatch(ref ptr1, new[] { "r", "raw" }) || ctx.MatchFlag("r", "raw")) return ReplyFormat.Raw; + if (ctx.PeekMatch(ref ptr2, new[] { "pt", "plaintext" }) || ctx.MatchFlag("pt", "plaintext")) return ReplyFormat.Plaintext; + return ReplyFormat.Standard; + } + public static bool MatchToggle(this Context ctx, bool? defaultValue = null) { var value = ctx.MatchToggleOrNull(defaultValue); diff --git a/PluralKit.Bot/CommandSystem/Context/ContextAvatarExt.cs b/PluralKit.Bot/CommandSystem/Context/ContextAvatarExt.cs index ca2ff912..3501b53b 100644 --- a/PluralKit.Bot/CommandSystem/Context/ContextAvatarExt.cs +++ b/PluralKit.Bot/CommandSystem/Context/ContextAvatarExt.cs @@ -15,6 +15,10 @@ public static class ContextAvatarExt return new ParsedImage { Url = url, Source = AvatarSource.User, SourceUser = user }; } + // If we have raw or plaintext, don't try to parse as a URL + if (ctx.PeekMatchFormat() != ReplyFormat.Standard) + return null; + // If we have a positional argument, try to parse it as a URL var arg = ctx.RemainderOrNull(); if (arg != null) diff --git a/PluralKit.Bot/Commands/MemberAvatar.cs b/PluralKit.Bot/Commands/MemberAvatar.cs index 66c17de1..b81c4754 100644 --- a/PluralKit.Bot/Commands/MemberAvatar.cs +++ b/PluralKit.Bot/Commands/MemberAvatar.cs @@ -86,12 +86,28 @@ public class MemberAvatar if (location == MemberAvatarLocation.Server) field += $" (for {ctx.Guild.Name})"; - var eb = new EmbedBuilder() - .Title($"{target.NameFor(ctx)}'s {field}") - .Image(new Embed.EmbedImage(currentValue?.TryGetCleanCdnUrl())); - if (target.System == ctx.System?.Id) - eb.Description($"To clear, use `pk;member {target.Reference(ctx)} {location.Command()} clear`."); - await ctx.Reply(embed: eb.Build()); + var format = ctx.MatchFormat(); + if (format == ReplyFormat.Raw) + { + await ctx.Reply($"`{currentValue?.TryGetCleanCdnUrl()}`"); + } + else if (format == ReplyFormat.Plaintext) + { + var eb = new EmbedBuilder() + .Description($"Showing {field} link for member {target.NameFor(ctx)} (`{target.DisplayHid(ctx.Config)}`)"); + await ctx.Reply($"<{currentValue?.TryGetCleanCdnUrl()}>", embed: eb.Build()); + return; + } + else if (format == ReplyFormat.Standard) + { + var eb = new EmbedBuilder() + .Title($"{target.NameFor(ctx)}'s {field}") + .Image(new Embed.EmbedImage(currentValue?.TryGetCleanCdnUrl())); + if (target.System == ctx.System?.Id) + eb.Description($"To clear, use `pk;member {target.Reference(ctx)} {location.Command()} clear`."); + await ctx.Reply(embed: eb.Build()); + } + else throw new PKError("Format Not Recognized"); } public async Task ServerAvatar(Context ctx, PKMember target)