From ac845d7b5a813253c93d2e6495d0a1699eee6bb3 Mon Sep 17 00:00:00 2001 From: Iris System Date: Fri, 5 Sep 2025 14:35:22 +1200 Subject: [PATCH] feat(bot): add toggle for color codes on cv2 cards --- Cargo.toml | 2 +- PluralKit.Bot/CommandMeta/CommandTree.cs | 2 ++ PluralKit.Bot/Commands/Config.cs | 21 +++++++++++++++++++ PluralKit.Bot/Services/EmbedService.cs | 12 +++++++++-- .../Models/Patch/SystemConfigPatch.cs | 8 +++++++ PluralKit.Core/Models/SystemConfig.cs | 2 ++ crates/migrate/data/migrations/53.sql | 6 ++++++ 7 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 crates/migrate/data/migrations/53.sql diff --git a/Cargo.toml b/Cargo.toml index 270d00a6..444bcee6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ reqwest = { version = "0.12.7" , default-features = false, features = ["rustls-t sentry = { version = "0.36.0", default-features = false, features = ["backtrace", "contexts", "panic", "debug-images", "reqwest", "rustls"] } # replace native-tls with rustls serde = { version = "1.0.196", features = ["derive"] } serde_json = "1.0.117" -sqlx = { version = "0.8.2", features = ["runtime-tokio", "postgres", "time", "macros", "uuid"] } +sqlx = { version = "0.8.2", features = ["runtime-tokio", "postgres", "time", "chrono", "macros", "uuid"] } tokio = { version = "1.36.0", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3.16", features = ["env-filter", "json"] } diff --git a/PluralKit.Bot/CommandMeta/CommandTree.cs b/PluralKit.Bot/CommandMeta/CommandTree.cs index 8d111ef4..67379fe1 100644 --- a/PluralKit.Bot/CommandMeta/CommandTree.cs +++ b/PluralKit.Bot/CommandMeta/CommandTree.cs @@ -592,6 +592,8 @@ public partial class CommandTree return ctx.Execute(null, m => m.HidDisplayCaps(ctx)); if (ctx.MatchMultiple(new[] { "pad" }, new[] { "id", "ids" }) || ctx.MatchMultiple(new[] { "id" }, new[] { "pad", "padding" }) || ctx.Match("idpad", "padid", "padids")) return ctx.Execute(null, m => m.HidListPadding(ctx)); + if (ctx.MatchMultiple(new[] { "show" }, new[] { "color", "colour", "colors", "colours" }) || ctx.Match("showcolor", "showcolour", "showcolors", "showcolours", "colorcode", "colorhex")) + return ctx.Execute(null, m => m.CardShowColorHex(ctx)); if (ctx.MatchMultiple(new[] { "name" }, new[] { "format" }) || ctx.Match("nameformat", "nf")) return ctx.Execute(null, m => m.NameFormat(ctx)); if (ctx.MatchMultiple(new[] { "member", "group" }, new[] { "limit" }) || ctx.Match("limit")) diff --git a/PluralKit.Bot/Commands/Config.cs b/PluralKit.Bot/Commands/Config.cs index 1b8efab1..1feb7c37 100644 --- a/PluralKit.Bot/Commands/Config.cs +++ b/PluralKit.Bot/Commands/Config.cs @@ -123,6 +123,13 @@ public class Config "off" )); + items.Add(new( + "show color", + "Whether to show color codes in system/member/group cards", + EnabledDisabled(ctx.Config.CardShowColorHex), + "disabled" + )); + items.Add(new( "Proxy Switch", "Switching behavior when proxy tags are used", @@ -570,6 +577,20 @@ public class Config else throw new PKError(badInputError); } + public async Task CardShowColorHex(Context ctx) + { + if (!ctx.HasNext()) + { + var msg = $"Showing color codes on system/member/group cards is currently **{EnabledDisabled(ctx.Config.CardShowColorHex)}**."; + await ctx.Reply(msg); + return; + } + + var newVal = ctx.MatchToggle(false); + await ctx.Repository.UpdateSystemConfig(ctx.System.Id, new() { CardShowColorHex = newVal }); + await ctx.Reply($"Showing color codes on system/member/group cards is now {EnabledDisabled(newVal)}."); + } + public async Task ProxySwitch(Context ctx) { if (!ctx.HasNext()) diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index 5a229ad6..39e85a37 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -75,12 +75,15 @@ public class EmbedService if (system.Tag != null) headerText += $"\n**Tag:** {system.Tag.EscapeMarkdown()}"; + if (cctx.Config.CardShowColorHex && !system.Color.EmptyOrNull()) + headerText += $"\n**Color:** #{system.Color}"; + if (cctx.Guild != null) { if (guildSettings.Tag != null && guildSettings.TagEnabled) - headerText += $"**Tag (in server '{cctx.Guild.Name}'):** {guildSettings.Tag.EscapeMarkdown()}"; + headerText += $"\n**Tag (in server '{cctx.Guild.Name}'):** {guildSettings.Tag.EscapeMarkdown()}"; if (!guildSettings.TagEnabled) - headerText += $"**Tag (in server '{cctx.Guild.Name}'):** *(tag is disabled in this server)*"; + headerText += $"\n**Tag (in server '{cctx.Guild.Name}'):** *(tag is disabled in this server)*"; } if (system.MemberListPrivacy.CanAccess(ctx)) @@ -358,6 +361,8 @@ public class EmbedService headerText += $"\n**Display name:** {member.DisplayName.Truncate(1024)}"; if (guild != null && guildDisplayName != null) headerText += $"\n**Server nickname (for '{guild.Name}'):** {guildDisplayName.Truncate(1024)}"; + if (ccfg.CardShowColorHex && !member.Color.EmptyOrNull()) + headerText += $"\n**Color:** #{member.Color}"; if (member.PronounsFor(ctx) is { } pronouns && !string.IsNullOrWhiteSpace(pronouns)) headerText += $"\n**Pronouns:** {pronouns}"; if (member.BirthdayFor(ctx) != null) @@ -577,6 +582,9 @@ public class EmbedService if (target.NamePrivacy.CanAccess(pctx) && target.DisplayName != null) headerText += $"\n**Display name:** {target.DisplayName}"; + if (ctx.Config.CardShowColorHex && !target.Color.EmptyOrNull()) + headerText += $"\n**Color:** #{target.Color}"; + if (target.ListPrivacy.CanAccess(pctx)) { headerText += $"\n**Members:** {memberCount}"; diff --git a/PluralKit.Core/Models/Patch/SystemConfigPatch.cs b/PluralKit.Core/Models/Patch/SystemConfigPatch.cs index d3d80428..c29cfae8 100644 --- a/PluralKit.Core/Models/Patch/SystemConfigPatch.cs +++ b/PluralKit.Core/Models/Patch/SystemConfigPatch.cs @@ -22,6 +22,7 @@ public class SystemConfigPatch: PatchObject public Partial ProxyErrorMessageEnabled { get; set; } public Partial HidDisplaySplit { get; set; } public Partial HidDisplayCaps { get; set; } + public Partial CardShowColorHex { get; set; } public Partial NameFormat { get; set; } public Partial HidListPadding { get; set; } public Partial ProxySwitch { get; set; } @@ -41,6 +42,7 @@ public class SystemConfigPatch: PatchObject .With("hid_display_split", HidDisplaySplit) .With("hid_display_caps", HidDisplayCaps) .With("hid_list_padding", HidListPadding) + .With("card_show_color_hex", CardShowColorHex) .With("proxy_switch", ProxySwitch) .With("name_format", NameFormat) ); @@ -107,6 +109,9 @@ public class SystemConfigPatch: PatchObject if (HidListPadding.IsPresent) o.Add("hid_list_padding", HidListPadding.Value.ToUserString()); + if (CardShowColorHex.IsPresent) + o.Add("card_show_color_hex", CardShowColorHex.Value); + if (ProxySwitch.IsPresent) o.Add("proxy_switch", ProxySwitch.Value.ToUserString()); @@ -150,6 +155,9 @@ public class SystemConfigPatch: PatchObject if (o.ContainsKey("hid_display_caps")) patch.HidDisplayCaps = o.Value("hid_display_caps"); + if (o.ContainsKey("card_show_color_hex")) + patch.CardShowColorHex = o.Value("card_show_color_hex"); + if (o.ContainsKey("proxy_switch")) patch.ProxySwitch = o.Value("proxy_switch") switch { diff --git a/PluralKit.Core/Models/SystemConfig.cs b/PluralKit.Core/Models/SystemConfig.cs index b4148211..dac7965f 100644 --- a/PluralKit.Core/Models/SystemConfig.cs +++ b/PluralKit.Core/Models/SystemConfig.cs @@ -23,6 +23,7 @@ public class SystemConfig public bool ProxyErrorMessageEnabled { get; } public bool HidDisplaySplit { get; } public bool HidDisplayCaps { get; } + public bool CardShowColorHex { get; } public HidPadFormat HidListPadding { get; } public ProxySwitchAction ProxySwitch { get; } public string NameFormat { get; } @@ -60,6 +61,7 @@ public static class SystemConfigExt o.Add("hid_display_split", cfg.HidDisplaySplit); o.Add("hid_display_caps", cfg.HidDisplayCaps); o.Add("hid_list_padding", cfg.HidListPadding.ToUserString()); + o.Add("card_show_color_hex", cfg.CardShowColorHex); o.Add("proxy_switch", cfg.ProxySwitch.ToUserString()); o.Add("name_format", cfg.NameFormat); diff --git a/crates/migrate/data/migrations/53.sql b/crates/migrate/data/migrations/53.sql new file mode 100644 index 00000000..3bfa3582 --- /dev/null +++ b/crates/migrate/data/migrations/53.sql @@ -0,0 +1,6 @@ +-- database version 53 +-- add toggle for showing color codes on cv2 cards + +alter table system_config add column card_show_color_hex bool default false; + +update info set schema_version = 53; \ No newline at end of file