From 375758206e7ce09b87991da8e654d9b0596bea81 Mon Sep 17 00:00:00 2001 From: spiral Date: Sat, 5 Feb 2022 09:26:14 -0500 Subject: [PATCH] fix: show correct name in entityReference when base name is private --- PluralKit.Bot/Commands/GroupMember.cs | 4 +- PluralKit.Bot/Commands/Groups.cs | 36 +++++++------ PluralKit.Bot/Commands/MemberAvatar.cs | 6 +-- PluralKit.Bot/Commands/MemberEdit.cs | 72 +++++++++++++------------- PluralKit.Bot/Commands/MemberProxy.cs | 6 +-- PluralKit.Bot/Errors.cs | 8 +-- PluralKit.Bot/Services/EmbedService.cs | 4 +- PluralKit.Bot/Utils/ModelUtils.cs | 4 +- 8 files changed, 72 insertions(+), 68 deletions(-) diff --git a/PluralKit.Bot/Commands/GroupMember.cs b/PluralKit.Bot/Commands/GroupMember.cs index cdbcfce1..dd3b3e74 100644 --- a/PluralKit.Bot/Commands/GroupMember.cs +++ b/PluralKit.Bot/Commands/GroupMember.cs @@ -71,10 +71,10 @@ public class GroupMember if (pctx == LookupContext.ByOwner) { msg += - $"\n\nTo add this member to one or more groups, use `pk;m {target.Reference()} group add [group 2] [group 3...]`"; + $"\n\nTo add this member to one or more groups, use `pk;m {target.Reference(ctx)} group add [group 2] [group 3...]`"; if (groups.Count > 0) msg += - $"\nTo remove this member from one or more groups, use `pk;m {target.Reference()} group remove [group 2] [group 3...]`"; + $"\nTo remove this member from one or more groups, use `pk;m {target.Reference(ctx)} group remove [group 2] [group 3...]`"; } await ctx.Reply(msg, new EmbedBuilder().Title($"{target.Name}'s groups").Description(description).Build()); diff --git a/PluralKit.Bot/Commands/Groups.cs b/PluralKit.Bot/Commands/Groups.cs index c2dbb493..cc19f016 100644 --- a/PluralKit.Bot/Commands/Groups.cs +++ b/PluralKit.Bot/Commands/Groups.cs @@ -81,16 +81,18 @@ public class Groups EventData = dispatchData }); + var reference = newGroup.Reference(ctx); + var eb = new EmbedBuilder() .Description( $"Your new group, **{groupName}**, has been created, with the group ID **`{newGroup.Hid}`**.\nBelow are a couple of useful commands:") - .Field(new Embed.Field("View the group card", $"> pk;group **{newGroup.Reference()}**")) + .Field(new Embed.Field("View the group card", $"> pk;group **{reference}**")) .Field(new Embed.Field("Add members to the group", - $"> pk;group **{newGroup.Reference()}** add **MemberName**\n> pk;group **{newGroup.Reference()}** add **Member1** **Member2** **Member3** (and so on...)")) + $"> pk;group **{reference}** add **MemberName**\n> pk;group **{reference}** add **Member1** **Member2** **Member3** (and so on...)")) .Field(new Embed.Field("Set the description", - $"> pk;group **{newGroup.Reference()}** description **This is my new group, and here is the description!**")) + $"> pk;group **{reference}** description **This is my new group, and here is the description!**")) .Field(new Embed.Field("Set the group icon", - $"> pk;group **{newGroup.Reference()}** icon\n*(with an image attached)*")); + $"> pk;group **{reference}** icon\n*(with an image attached)*")); await ctx.Reply($"{Emojis.Success} Group created!", eb.Build()); if (existingGroupCount >= Limits.WarnThreshold(groupLimit)) @@ -128,7 +130,7 @@ public class Groups var noDisplayNameSetMessage = "This group does not have a display name set."; if (ctx.System?.Id == target.System) noDisplayNameSetMessage += - $" To set one, type `pk;group {target.Reference()} displayname `."; + $" To set one, type `pk;group {target.Reference(ctx)} displayname `."; // No perms check, display name isn't covered by member privacy @@ -153,11 +155,13 @@ public class Groups .Field(new Embed.Field("Name", target.Name)) .Field(new Embed.Field("Display Name", target.DisplayName)); + var reference = target.Reference(ctx); + if (ctx.System?.Id == target.System) eb.Description( - $"To change display name, type `pk;group {target.Reference()} displayname `." - + $"To clear it, type `pk;group {target.Reference()} displayname -clear`." - + $"To print the raw display name, type `pk;group {target.Reference()} displayname -raw`."); + $"To change display name, type `pk;group {reference} displayname `." + + $"To clear it, type `pk;group {reference} displayname -clear`." + + $"To print the raw display name, type `pk;group {reference} displayname -raw`."); await ctx.Reply(embed: eb.Build()); } @@ -194,7 +198,7 @@ public class Groups var noDescriptionSetMessage = "This group does not have a description set."; if (ctx.System?.Id == target.System) noDescriptionSetMessage += - $" To set one, type `pk;group {target.Reference()} description `."; + $" To set one, type `pk;group {target.Reference(ctx)} description `."; if (ctx.MatchRaw()) { @@ -214,9 +218,9 @@ public class Groups .Title("Group description") .Description(target.Description) .Field(new Embed.Field("\u200B", - $"To print the description with formatting, type `pk;group {target.Reference()} description -raw`." + $"To print the description with formatting, type `pk;group {target.Reference(ctx)} description -raw`." + (ctx.System?.Id == target.System - ? $" To clear it, type `pk;group {target.Reference()} description -clear`." + ? $" To clear it, type `pk;group {target.Reference(ctx)} description -clear`." : ""))) .Build()); return; @@ -289,7 +293,7 @@ public class Groups .Image(new Embed.EmbedImage(target.Icon.TryGetCleanCdnUrl())); if (target.System == ctx.System?.Id) - eb.Description($"To clear, use `pk;group {target.Reference()} icon -clear`."); + eb.Description($"To clear, use `pk;group {target.Reference(ctx)} icon -clear`."); await ctx.Reply(embed: eb.Build()); } @@ -353,7 +357,7 @@ public class Groups .Image(new Embed.EmbedImage(target.BannerImage)); if (target.System == ctx.System?.Id) - eb.Description($"To clear, use `pk;group {target.Reference()} banner clear`."); + eb.Description($"To clear, use `pk;group {target.Reference(ctx)} banner clear`."); await ctx.Reply(embed: eb.Build()); } @@ -389,7 +393,7 @@ public class Groups if (target.Color == null) if (ctx.System?.Id == target.System) await ctx.Reply( - $"This group does not have a color set. To set one, type `pk;group {target.Reference()} color `."); + $"This group does not have a color set. To set one, type `pk;group {target.Reference(ctx)} color `."); else await ctx.Reply("This group does not have a color set."); else @@ -399,7 +403,7 @@ public class Groups .Thumbnail(new Embed.EmbedThumbnail($"https://fakeimg.pl/256x256/{target.Color}/?text=%20")) .Description($"This group's color is **#{target.Color}**." + (ctx.System?.Id == target.System - ? $" To clear it, type `pk;group {target.Reference()} color -clear`." + ? $" To clear it, type `pk;group {target.Reference(ctx)} color -clear`." : "")) .Build()); } @@ -481,7 +485,7 @@ public class Groups .Field(new Embed.Field("Metadata (creation date)", target.MetadataPrivacy.Explanation())) .Field(new Embed.Field("Visibility", target.Visibility.Explanation())) .Description( - $"To edit privacy settings, use the command:\n> pk;group **{target.Reference()}** privacy **** ****\n\n- `subject` is one of `name`, `description`, `icon`, `members`, `metadata`, `visibility`, or `all`\n- `level` is either `public` or `private`.") + $"To edit privacy settings, use the command:\n> pk;group **{target.Reference(ctx)}** privacy **** ****\n\n- `subject` is one of `name`, `description`, `icon`, `members`, `metadata`, `visibility`, or `all`\n- `level` is either `public` or `private`.") .Build()); return; } diff --git a/PluralKit.Bot/Commands/MemberAvatar.cs b/PluralKit.Bot/Commands/MemberAvatar.cs index c79de009..612ef816 100644 --- a/PluralKit.Bot/Commands/MemberAvatar.cs +++ b/PluralKit.Bot/Commands/MemberAvatar.cs @@ -30,7 +30,7 @@ public class MemberAvatar { if (mgs?.AvatarUrl != null) await ctx.Reply( - $"{Emojis.Success} Member avatar cleared. Note that this member has a server-specific avatar set here, type `pk;member {target.Reference()} serveravatar clear` if you wish to clear that too."); + $"{Emojis.Success} Member avatar cleared. Note that this member has a server-specific avatar set here, type `pk;member {target.Reference(ctx)} serveravatar clear` if you wish to clear that too."); else await ctx.Reply($"{Emojis.Success} Member avatar cleared."); } @@ -57,7 +57,7 @@ public class MemberAvatar if (location == AvatarLocation.Server) throw new PKError( - $"This member does not have a server avatar set. Type `pk;member {target.Reference()} avatar` to see their global avatar."); + $"This member does not have a server avatar set. Type `pk;member {target.Reference(ctx)} avatar` to see their global avatar."); } var field = location == AvatarLocation.Server ? $"server avatar (for {ctx.Guild.Name})" : "avatar"; @@ -67,7 +67,7 @@ public class MemberAvatar .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()} {cmd} clear`."); + eb.Description($"To clear, use `pk;member {target.Reference(ctx)} {cmd} clear`."); await ctx.Reply(embed: eb.Build()); } diff --git a/PluralKit.Bot/Commands/MemberEdit.cs b/PluralKit.Bot/Commands/MemberEdit.cs index 417419b8..af9cfbad 100644 --- a/PluralKit.Bot/Commands/MemberEdit.cs +++ b/PluralKit.Bot/Commands/MemberEdit.cs @@ -66,7 +66,7 @@ public class MemberEdit var noDescriptionSetMessage = "This member does not have a description set."; if (ctx.System?.Id == target.System) noDescriptionSetMessage += - $" To set one, type `pk;member {target.Reference()} description `."; + $" To set one, type `pk;member {target.Reference(ctx)} description `."; if (ctx.MatchRaw()) { @@ -86,9 +86,9 @@ public class MemberEdit .Title("Member description") .Description(target.Description) .Field(new Embed.Field("\u200B", - $"To print the description with formatting, type `pk;member {target.Reference()} description -raw`." + $"To print the description with formatting, type `pk;member {target.Reference(ctx)} description -raw`." + (ctx.System?.Id == target.System - ? $" To clear it, type `pk;member {target.Reference()} description -clear`." + ? $" To clear it, type `pk;member {target.Reference(ctx)} description -clear`." : ""))) .Build()); return; @@ -119,7 +119,7 @@ public class MemberEdit { var noPronounsSetMessage = "This member does not have pronouns set."; if (ctx.System?.Id == target.System) - noPronounsSetMessage += $"To set some, type `pk;member {target.Reference()} pronouns `."; + noPronounsSetMessage += $"To set some, type `pk;member {target.Reference(ctx)} pronouns `."; ctx.CheckSystemPrivacy(target.System, target.PronounPrivacy); @@ -138,9 +138,9 @@ public class MemberEdit await ctx.Reply(noPronounsSetMessage); else await ctx.Reply( - $"**{target.NameFor(ctx)}**'s pronouns are **{target.Pronouns}**.\nTo print the pronouns with formatting, type `pk;member {target.Reference()} pronouns -raw`." + $"**{target.NameFor(ctx)}**'s pronouns are **{target.Pronouns}**.\nTo print the pronouns with formatting, type `pk;member {target.Reference(ctx)} pronouns -raw`." + (ctx.System?.Id == target.System - ? $" To clear them, type `pk;member {target.Reference()} pronouns -clear`." + ? $" To clear them, type `pk;member {target.Reference(ctx)} pronouns -clear`." : "")); return; } @@ -243,7 +243,7 @@ public class MemberEdit if (target.Color == null) if (ctx.System?.Id == target.System) await ctx.Reply( - $"This member does not have a color set. To set one, type `pk;member {target.Reference()} color `."); + $"This member does not have a color set. To set one, type `pk;member {target.Reference(ctx)} color `."); else await ctx.Reply("This member does not have a color set."); else @@ -253,7 +253,7 @@ public class MemberEdit .Thumbnail(new Embed.EmbedThumbnail($"https://fakeimg.pl/256x256/{target.Color}/?text=%20")) .Description($"This member's color is **#{target.Color}**." + (ctx.System?.Id == target.System - ? $" To clear it, type `pk;member {target.Reference()} color -clear`." + ? $" To clear it, type `pk;member {target.Reference(ctx)} color -clear`." : "")) .Build()); } @@ -293,12 +293,12 @@ public class MemberEdit if (target.Birthday == null) await ctx.Reply("This member does not have a birthdate set." + (ctx.System?.Id == target.System - ? $" To set one, type `pk;member {target.Reference()} birthdate `." + ? $" To set one, type `pk;member {target.Reference(ctx)} birthdate `." : "")); else await ctx.Reply($"This member's birthdate is **{target.BirthdayString}**." + (ctx.System?.Id == target.System - ? $" To clear it, type `pk;member {target.Reference()} birthdate -clear`." + ? $" To clear it, type `pk;member {target.Reference(ctx)} birthdate -clear`." : "")); } else @@ -322,6 +322,7 @@ public class MemberEdit } } + private string boldIf(string str, bool condition) => condition ? $"**{str}**" : str; private async Task CreateMemberNameInfoEmbed(Context ctx, PKMember target) { var lcx = ctx.LookupContextFor(target.System); @@ -335,28 +336,25 @@ public class MemberEdit .Footer(new Embed.EmbedFooter( $"Member ID: {target.Hid} | Active name in bold. Server name overrides display name, which overrides base name.")); - if (target.DisplayName == null && memberGuildConfig?.DisplayName == null) - eb.Field(new Embed.Field("Name", $"**{target.NameFor(ctx)}**")); - else - eb.Field(new Embed.Field("Name", target.NameFor(ctx))); + var showDisplayName = target.NamePrivacy.CanAccess(lcx); - if (target.NamePrivacy.CanAccess(lcx)) - { - if (target.DisplayName != null && memberGuildConfig?.DisplayName == null) - eb.Field(new Embed.Field("Display Name", $"**{target.DisplayName}**")); - else - eb.Field(new Embed.Field("Display Name", target.DisplayName ?? "*(none)*")); - } + eb.Field(new Embed.Field("Name", boldIf( + target.NameFor(ctx), + (!showDisplayName || target.DisplayName == null) && memberGuildConfig?.DisplayName == null + ))); + + if (showDisplayName) + eb.Field(new Embed.Field("Display name", target.DisplayName != null + ? boldIf(target.DisplayName, memberGuildConfig?.DisplayName == null) + : "*(none)*" + )); if (ctx.Guild != null) - { - if (memberGuildConfig?.DisplayName != null) - eb.Field(new Embed.Field($"Server Name (in {ctx.Guild.Name})", - $"**{memberGuildConfig.DisplayName}**")); - else - eb.Field(new Embed.Field($"Server Name (in {ctx.Guild.Name})", - memberGuildConfig?.DisplayName ?? "*(none)*")); - } + eb.Field(new Embed.Field($"Server Name (in {ctx.Guild.Name})", + memberGuildConfig?.DisplayName != null + ? $"**{memberGuildConfig.DisplayName}**" + : "*(none)*" + )); return eb; } @@ -380,7 +378,7 @@ public class MemberEdit var noDisplayNameSetMessage = "This member does not have a display name set."; if (ctx.System?.Id == target.System) noDisplayNameSetMessage += - $" To set one, type `pk;member {target.Reference()} displayname `."; + $" To set one, type `pk;member {target.Reference(ctx)} displayname `."; // No perms check, display name isn't covered by member privacy @@ -396,11 +394,12 @@ public class MemberEdit if (!ctx.HasNext(false)) { var eb = await CreateMemberNameInfoEmbed(ctx, target); + var reference = target.Reference(ctx); if (ctx.System?.Id == target.System) eb.Description( - $"To change display name, type `pk;member {target.Reference()} displayname `." - + $"To clear it, type `pk;member {target.Reference()} displayname -clear`." - + $"To print the raw display name, type `pk;member {target.Reference()} displayname -raw`."); + $"To change display name, type `pk;member {reference} displayname `." + + $"To clear it, type `pk;member {reference} displayname -clear`." + + $"To print the raw display name, type `pk;member {reference} displayname -raw`."); await ctx.Reply(embed: eb.Build()); return; } @@ -437,7 +436,7 @@ public class MemberEdit var noServerNameSetMessage = "This member does not have a server name set."; if (ctx.System?.Id == target.System) noServerNameSetMessage += - $" To set one, type `pk;member {target.Reference()} servername `."; + $" To set one, type `pk;member {target.Reference(ctx)} servername `."; // No perms check, display name isn't covered by member privacy var memberGuildConfig = await ctx.Repository.GetMemberGuild(ctx.Guild.Id, target.Id); @@ -454,9 +453,10 @@ public class MemberEdit if (!ctx.HasNext(false)) { var eb = await CreateMemberNameInfoEmbed(ctx, target); + var reference = target.Reference(ctx); if (ctx.System?.Id == target.System) eb.Description( - $"To change server name, type `pk;member {target.Reference()} servername `.\nTo clear it, type `pk;member {target.Reference()} servername -clear`.\nTo print the raw server name, type `pk;member {target.Reference()} servername -raw`."); + $"To change server name, type `pk;member {reference} servername `.\nTo clear it, type `pk;member {reference} servername -clear`.\nTo print the raw server name, type `pk;member {reference} servername -raw`."); await ctx.Reply(embed: eb.Build()); return; } @@ -658,7 +658,7 @@ public class MemberEdit if (subject == MemberPrivacySubject.Avatar && level == PrivacyLevel.Private && guildSettings?.AvatarUrl == null) await ctx.Reply( - $"{Emojis.Warn} This member does not have a server avatar set, so *proxying* will **still show the member avatar**. If you want to hide your avatar when proxying here, set a server avatar: `pk;member {target.Reference()} serveravatar`"); + $"{Emojis.Warn} This member does not have a server avatar set, so *proxying* will **still show the member avatar**. If you want to hide your avatar when proxying here, set a server avatar: `pk;member {target.Reference(ctx)} serveravatar`"); } if (ctx.Match("all") || newValueFromCommand != null) diff --git a/PluralKit.Bot/Commands/MemberProxy.cs b/PluralKit.Bot/Commands/MemberProxy.cs index 1e1edb9e..0619adca 100644 --- a/PluralKit.Bot/Commands/MemberProxy.cs +++ b/PluralKit.Bot/Commands/MemberProxy.cs @@ -64,7 +64,7 @@ public class MemberProxy throw new PKSyntaxError("You must pass an example proxy to add (eg. `[text]` or `J:text`)."); var tagToAdd = ParseProxyTags(ctx.RemainderOrNull(false)); - if (tagToAdd.IsEmpty) throw Errors.EmptyProxyTags(target); + if (tagToAdd.IsEmpty) throw Errors.EmptyProxyTags(target, ctx); if (target.ProxyTags.Contains(tagToAdd)) throw Errors.ProxyTagAlreadyExists(tagToAdd, target); if (tagToAdd.ProxyString.Length > Limits.MaxProxyTagLength) @@ -88,7 +88,7 @@ public class MemberProxy throw new PKSyntaxError("You must pass a proxy tag to remove (eg. `[text]` or `J:text`)."); var tagToRemove = ParseProxyTags(ctx.RemainderOrNull(false)); - if (tagToRemove.IsEmpty) throw Errors.EmptyProxyTags(target); + if (tagToRemove.IsEmpty) throw Errors.EmptyProxyTags(target, ctx); if (!target.ProxyTags.Contains(tagToRemove)) throw Errors.ProxyTagDoesNotExist(tagToRemove, target); @@ -103,7 +103,7 @@ public class MemberProxy else { var requestedTag = ParseProxyTags(ctx.RemainderOrNull(false)); - if (requestedTag.IsEmpty) throw Errors.EmptyProxyTags(target); + if (requestedTag.IsEmpty) throw Errors.EmptyProxyTags(target, ctx); // This is mostly a legacy command, so it's gonna warn if there's // already more than one proxy tag. diff --git a/PluralKit.Bot/Errors.cs b/PluralKit.Bot/Errors.cs index cec1208b..ee46cb49 100644 --- a/PluralKit.Bot/Errors.cs +++ b/PluralKit.Bot/Errors.cs @@ -170,11 +170,11 @@ public static class Errors public static PKError ProxyTagDoesNotExist(ProxyTag tagToRemove, PKMember member) => new( $"That member does not have the proxy tag {tagToRemove.ProxyString.AsCode()}. The member currently has these tags: {member.ProxyTagsString()}"); - public static PKError LegacyAlreadyHasProxyTag(ProxyTag requested, PKMember member) => new( - $"This member already has more than one proxy tag set: {member.ProxyTagsString()}\nConsider using the {$"pk;member {member.Reference()} proxy add {requested.ProxyString}".AsCode()} command instead."); + public static PKError LegacyAlreadyHasProxyTag(ProxyTag requested, PKMember member, Context ctx) => new( + $"This member already has more than one proxy tag set: {member.ProxyTagsString()}\nConsider using the {$"pk;member {member.Reference(ctx)} proxy add {requested.ProxyString}".AsCode()} command instead."); - public static PKError EmptyProxyTags(PKMember member) => new( - $"The example proxy `text` is equivalent to having no proxy tags at all, since there are no symbols or brackets on either end. If you'd like to clear your proxy tags, use `pk;member {member.Reference()} proxy clear`."); + public static PKError EmptyProxyTags(PKMember member, Context ctx) => new( + $"The example proxy `text` is equivalent to having no proxy tags at all, since there are no symbols or brackets on either end. If you'd like to clear your proxy tags, use `pk;member {member.Reference(ctx)} proxy clear`."); public static PKError GenericCancelled() => new("Operation cancelled."); diff --git a/PluralKit.Bot/Services/EmbedService.cs b/PluralKit.Bot/Services/EmbedService.cs index c101cade..d57e3763 100644 --- a/PluralKit.Bot/Services/EmbedService.cs +++ b/PluralKit.Bot/Services/EmbedService.cs @@ -279,11 +279,11 @@ public class EmbedService if (memberCount == 0 && pctx == LookupContext.ByOwner) // Only suggest the add command if this is actually the owner lol eb.Field(new Embed.Field("Members (0)", - $"Add one with `pk;group {target.Reference()} add `!")); + $"Add one with `pk;group {target.Reference(ctx)} add `!")); else { var name = pctx == LookupContext.ByOwner - ? target.Reference() + ? target.Reference(ctx) : target.Hid; eb.Field(new Embed.Field($"Members ({memberCount})", $"(see `pk;group {name} list`)")); } diff --git a/PluralKit.Bot/Utils/ModelUtils.cs b/PluralKit.Bot/Utils/ModelUtils.cs index fa7a750b..8944598e 100644 --- a/PluralKit.Bot/Utils/ModelUtils.cs +++ b/PluralKit.Bot/Utils/ModelUtils.cs @@ -21,8 +21,8 @@ public static class ModelUtils public static string DisplayName(this PKMember member) => member.DisplayName ?? member.Name; - public static string Reference(this PKMember member) => EntityReference(member.Hid, member.Name); - public static string Reference(this PKGroup group) => EntityReference(group.Hid, group.Name); + public static string Reference(this PKMember member, Context ctx) => EntityReference(member.Hid, member.NameFor(ctx)); + public static string Reference(this PKGroup group, Context ctx) => EntityReference(group.Hid, group.NameFor(ctx)); private static string EntityReference(string hid, string name) {