WIP: port fronters embed to CV2
Some checks failed
Build and push Docker image / .net docker build (push) Has been cancelled
.net checks / run .net tests (push) Has been cancelled
.net checks / dotnet-format (push) Has been cancelled
Build and push Rust service Docker images / rust docker build (push) Has been cancelled
rust checks / cargo fmt (push) Has been cancelled

This commit is contained in:
asleepyskye 2025-09-22 08:18:10 -04:00
parent 651ac6ba5c
commit 9495b95afa
7 changed files with 239 additions and 2 deletions

View file

@ -594,6 +594,8 @@ public partial class CommandTree
return ctx.Execute<Config>(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<Config>(null, m => m.CardShowColorHex(ctx));
if (ctx.MatchMultiple(new[] { "fronter", "front" }, new[] { "list" }, new[] { "format" }) || ctx.Match("fronterlistformat", "frontlistformat", "flf"))
return ctx.Execute<Config>(null, m => m.FronterListFormat(ctx));
if (ctx.MatchMultiple(new[] { "name" }, new[] { "format" }) || ctx.Match("nameformat", "nf"))
return ctx.Execute<Config>(null, m => m.NameFormat(ctx));
if (ctx.MatchMultiple(new[] { "member", "group" }, new[] { "limit" }) || ctx.Match("limit"))

View file

@ -9,6 +9,7 @@ using NodaTime.TimeZones;
using PluralKit.Core;
namespace PluralKit.Bot;
public class Config
{
private record PaginatedConfigItem(string Key, string Description, string? CurrentValue, string DefaultValue);
@ -130,6 +131,13 @@ public class Config
"disabled"
));
items.Add(new(
"fronter list format",
"Whether to show the fronter list as full or short.",
ctx.Config.FronterListFormat.ToUserString(),
"short"
));
items.Add(new(
"Proxy Switch",
"Switching behavior when proxy tags are used",
@ -591,6 +599,24 @@ public class Config
await ctx.Reply($"Showing color codes on system/member/group cards is now {EnabledDisabled(newVal)}.");
}
public async Task FronterListFormat(Context ctx)
{
var badInputError = "Valid list format settings are `short` or `full`.";
if (ctx.Match("full", "f"))
{
await ctx.Repository.UpdateSystemConfig(ctx.System.Id, new() { FronterListFormat = SystemConfig.ListFormat.Full });
await ctx.Reply($"Fronter lists are now formatted as `full`");
}
else if (ctx.Match("short", "s"))
{
await ctx.Repository.UpdateSystemConfig(ctx.System.Id, new() { FronterListFormat = SystemConfig.ListFormat.Short });
await ctx.Reply($"Fronter lists are now formatted as `short`");
}
else throw new PKError(badInputError);
}
public async Task ProxySwitch(Context ctx)
{
if (!ctx.HasNext())

View file

@ -23,7 +23,12 @@ public class SystemFront
var sw = await ctx.Repository.GetLatestSwitch(system.Id);
if (sw == null) throw Errors.NoRegisteredSwitches;
await ctx.Reply(embed: await _embeds.CreateFronterEmbed(sw, ctx.Zone, ctx.LookupContextFor(system.Id)));
if (ctx.MatchFlag("show-embed", "se"))
{
await ctx.Reply(text: EmbedService.LEGACY_EMBED_WARNING, embed: await _embeds.CreateFronterEmbed(sw, ctx.Zone, ctx.LookupContextFor(system.Id)));
return;
}
await ctx.Reply(components: await _embeds.CreateFronterMessageComponents(ctx, system, sw, ctx.LookupContextFor(system.Id)));
}
public async Task SystemFrontHistory(Context ctx, PKSystem system)

View file

@ -766,6 +766,185 @@ public class EmbedService
.Build();
}
public async Task<MessageComponent[]> CreateFronterMessageComponents(Context cctx, PKSystem system, PKSwitch sw, LookupContext ctx)
{
var formatType = cctx.Config.FronterListFormat;
if (cctx.MatchFlag("short")) formatType = SystemConfig.ListFormat.Short;
if (cctx.MatchFlag("full")) formatType = SystemConfig.ListFormat.Full;
if (formatType == SystemConfig.ListFormat.Full)
{
return await CreateFronterList(cctx, system, sw, ctx);
}
return await CreateFronterListShort(cctx, system, sw, ctx);
}
public async Task<MessageComponent[]> CreateFronterListShort(Context cctx, PKSystem system, PKSwitch sw, LookupContext ctx)
{
var systemGuildSettings = await _repo.GetSystemGuild(cctx.Guild.Id, system.Id);
var members = await _db.Execute(c => _repo.GetSwitchMembers(c, sw.Id).ToListAsync().AsTask());
var memberStr = "*(no fronter)*";
if (members.Count > 0)
{
memberStr = "";
foreach (var item in members.Select((value, i) => new { i, value }))
{
memberStr += item.i == 0 ? "" : ", ";
if (memberStr.Length < 900)
memberStr += item.value.NameFor(ctx);
else
{
memberStr += $"*({members.Count - item.i} not shown)*";
break;
}
}
}
return [
new MessageComponent(){
Type = ComponentType.Text,
Content = $"## Current fronter(s) in {systemGuildSettings.DisplayName ?? system.NameFor(ctx) ?? $"`{system.Hid}`"}"
},
new MessageComponent(){
Type = ComponentType.Container,
AccentColor = members.FirstOrDefault()?.Color?.ToDiscordColor(),
Components = [
new MessageComponent(){
Type = ComponentType.Text,
Content = $"**Current fronters:** \n{memberStr}"
},
new MessageComponent(){
Type = ComponentType.Separator,
},
new MessageComponent()
{
Type = ComponentType.Text,
Content = $"**Since:** <t:{sw.Timestamp.ToUnixTimeSeconds()}> (<t:{sw.Timestamp.ToUnixTimeSeconds()}:R>)"
}
]
},
];
}
public async Task<MessageComponent[]> CreateFronterList(Context cctx, PKSystem system, PKSwitch sw, LookupContext ctx)
{
var systemGuildSettings = await _repo.GetSystemGuild(cctx.Guild.Id, system.Id);
var members = await _db.Execute(c => _repo.GetSwitchMembers(c, sw.Id).ToListAsync().AsTask());
var memberStr = "*(no fronter)*";
var memberList = new List<MessageComponent>();
if (members.Count > 0)
{
memberStr = "";
foreach (var item in members.Select((value, i) => new { i, value }))
{
if (item.i < 5)
{
var guildSettings = cctx.Guild != null ? await _repo.GetMemberGuild(cctx.Guild.Id, item.value.Id) : null;
var avatar = guildSettings?.AvatarUrl ?? item.value.AvatarFor(ctx) ?? systemGuildSettings.AvatarUrl ?? system.AvatarFor(ctx);
var pronouns = item.value.PronounsFor(ctx);
var displayName = (guildSettings?.DisplayName) ?? item.value.DisplayName;
var headerText = "";
if (!displayName.EmptyOrNull() && item.value.NamePrivacy.CanAccess(ctx))
{
headerText += $"**Display name:** {displayName}\n";
}
if (!pronouns.EmptyOrNull())
{
headerText += $"**Pronouns:** {item.value.PronounsFor(ctx)}\n";
}
headerText += $"[View on dashboard]({_coreConfig.DashboardBaseUrl}/profile/m/{item.value.Hid})";
var nameItem = new MessageComponent()
{
Type = ComponentType.Text,
Content = $"### {item.value.NameFor(ctx)}\n{headerText}"
};
if (!avatar.EmptyOrNull())
{
memberList.Add(new MessageComponent()
{
Type = ComponentType.Section,
Components = [nameItem],
Accessory = new MessageComponent()
{
Type = ComponentType.Thumbnail,
Media = new ComponentMedia()
{
Url = avatar.TryGetCleanCdnUrl()
}
}
});
}
else
{
memberList.Add(nameItem);
}
memberList.Add(new MessageComponent()
{
Type = ComponentType.Separator,
});
}
else
{
memberStr += item.i == 5 ? "+ " : ", ";
if (memberStr.Length < 900)
memberStr += item.value.NameFor(ctx);
else
{
memberStr += $"*({members.Count - item.i} not shown)*";
break;
}
}
}
if (memberStr.Length > 0)
{
memberList.Add(new MessageComponent()
{
Type = ComponentType.Text,
Content = $"{memberStr}"
});
memberList.Add(new MessageComponent()
{
Type = ComponentType.Separator,
});
}
}
else
{
memberList.Add(new MessageComponent()
{
Type = ComponentType.Text,
Content = "*(no fronter)*"
});
memberList.Add(new MessageComponent()
{
Type = ComponentType.Separator
});
}
memberList.Add(new MessageComponent()
{
Type = ComponentType.Text,
Content = $"**Since:** <t:{sw.Timestamp.ToUnixTimeSeconds()}> (<t:{sw.Timestamp.ToUnixTimeSeconds()}:R>)"
});
return [
new MessageComponent(){
Type = ComponentType.Text,
Content = $"## Current fronter(s) in {systemGuildSettings.DisplayName ?? system.NameFor(ctx) ?? $"`{system.Hid}`"}"
},
new MessageComponent(){
Type = ComponentType.Container,
AccentColor = members.FirstOrDefault()?.Color?.ToDiscordColor(),
Components = [
.. memberList.ToArray()
]
}
];
}
public async Task<MessageComponent[]> CreateMessageInfoMessageComponents(FullMessage msg, bool showContent, SystemConfig? ccfg = null)
{
var channel = await _cache.GetOrFetchChannel(_rest, msg.Message.Guild ?? 0, msg.Message.Channel);

View file

@ -25,6 +25,7 @@ public class SystemConfigPatch: PatchObject
public Partial<bool> CardShowColorHex { get; set; }
public Partial<string?> NameFormat { get; set; }
public Partial<SystemConfig.HidPadFormat> HidListPadding { get; set; }
public Partial<SystemConfig.ListFormat> FronterListFormat { get; set; }
public Partial<SystemConfig.ProxySwitchAction> ProxySwitch { get; set; }
public override Query Apply(Query q) => q.ApplyPatch(wrapper => wrapper
@ -43,6 +44,7 @@ public class SystemConfigPatch: PatchObject
.With("hid_display_caps", HidDisplayCaps)
.With("hid_list_padding", HidListPadding)
.With("card_show_color_hex", CardShowColorHex)
.With("fronter_list_format", FronterListFormat)
.With("proxy_switch", ProxySwitch)
.With("name_format", NameFormat)
);
@ -112,6 +114,9 @@ public class SystemConfigPatch: PatchObject
if (CardShowColorHex.IsPresent)
o.Add("card_show_color_hex", CardShowColorHex.Value);
if (FronterListFormat.IsPresent)
o.Add("fronter_list_format", FronterListFormat.Value.ToUserString());
if (ProxySwitch.IsPresent)
o.Add("proxy_switch", ProxySwitch.Value.ToUserString());
@ -158,6 +163,13 @@ public class SystemConfigPatch: PatchObject
if (o.ContainsKey("card_show_color_hex"))
patch.CardShowColorHex = o.Value<bool>("card_show_color_hex");
if (o.ContainsKey("fronter_list_format"))
patch.FronterListFormat = o.Value<string>("fronter_list_format") switch
{
"full" => SystemConfig.ListFormat.Full,
_ => SystemConfig.ListFormat.Short,
};
if (o.ContainsKey("proxy_switch"))
patch.ProxySwitch = o.Value<string>("proxy_switch") switch
{

View file

@ -26,6 +26,7 @@ public class SystemConfig
public bool CardShowColorHex { get; }
public HidPadFormat HidListPadding { get; }
public ProxySwitchAction ProxySwitch { get; }
public ListFormat FronterListFormat { get; }
public string NameFormat { get; }
public enum HidPadFormat
@ -40,6 +41,11 @@ public class SystemConfig
New = 1,
Add = 2,
}
public enum ListFormat
{
Short = 0,
Full = 1,
}
}
public static class SystemConfigExt
@ -62,6 +68,7 @@ public static class SystemConfigExt
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("fronter_list_format", cfg.FronterListFormat.ToUserString());
o.Add("proxy_switch", cfg.ProxySwitch.ToUserString());
o.Add("name_format", cfg.NameFormat);
@ -77,5 +84,5 @@ public static class SystemConfigExt
}
public static string ToUserString(this SystemConfig.ProxySwitchAction val) => val.ToString().ToLower();
public static string ToUserString(this SystemConfig.ListFormat val) => val.ToString().ToLower();
}

View file

@ -0,0 +1,6 @@
-- database version 54
-- add config option for list format
alter table system_config add column fronter_list_format text default 'short';
update info set schema_version = 54;