public async Task <Embed> CreateGroupEmbed(Context ctx, PKSystem system, PKGroup target) { await using var conn = await _db.Obtain(); var pctx = ctx.LookupContextFor(system); var memberCount = ctx.MatchPrivateFlag(pctx) ? await _repo.GetGroupMemberCount(conn, target.Id, PrivacyLevel.Public) : await _repo.GetGroupMemberCount(conn, target.Id); var nameField = target.Name; if (system.Name != null) { nameField = $"{nameField} ({system.Name})"; } var eb = new EmbedBuilder() .Author(new(nameField, IconUrl: DiscordUtils.WorkaroundForUrlBug(target.IconFor(pctx)))) .Footer(new($"System ID: {system.Hid} | Group ID: {target.Hid} | Created on {target.Created.FormatZoned(system)}")); if (target.DisplayName != null) { eb.Field(new("Display Name", target.DisplayName)); } if (target.ListPrivacy.CanAccess(pctx)) { if (memberCount == 0 && pctx == LookupContext.ByOwner) { // Only suggest the add command if this is actually the owner lol eb.Field(new("Members (0)", $"Add one with `pk;group {target.Reference()} add <member>`!", true)); } else { eb.Field(new($"Members ({memberCount})", $"(see `pk;group {target.Reference()} list`)", true)); } } if (target.DescriptionFor(pctx) is { } desc) { eb.Field(new("Description", desc)); } if (target.IconFor(pctx) is {} icon) { eb.Thumbnail(new(icon)); } return(eb.Build()); }
public async Task <Embed> CreateGroupEmbed(Context ctx, PKSystem system, PKGroup target) { var pctx = ctx.LookupContextFor(system.Id); var countctx = LookupContext.ByNonOwner; if (ctx.MatchFlag("a", "all")) { if (system.Id == ctx.System.Id) { countctx = LookupContext.ByOwner; } else { throw Errors.LookupNotAllowed; } } var memberCount = await _repo.GetGroupMemberCount(target.Id, countctx == LookupContext.ByOwner?null : PrivacyLevel.Public); var nameField = target.NamePrivacy.Get(pctx, target.Name, target.DisplayName ?? target.Name); if (system.Name != null) { nameField = $"{nameField} ({system.Name})"; } uint color; try { color = target.Color?.ToDiscordColor() ?? DiscordUtils.Gray; } catch (ArgumentException) { // There's no API for group colors yet, but defaulting to a blank color regardless color = DiscordUtils.Gray; } var eb = new EmbedBuilder() .Author(new Embed.EmbedAuthor(nameField, IconUrl: target.IconFor(pctx), Url: $"https://dash.pluralkit.me/profile/g/{target.Hid}")) .Color(color); eb.Footer(new Embed.EmbedFooter($"System ID: {system.Hid} | Group ID: {target.Hid}{(target.MetadataPrivacy.CanAccess(pctx) ? $" | Created on {target.Created.FormatZoned(ctx.Zone)}" : "")}")); if (target.DescriptionPrivacy.CanAccess(pctx)) { eb.Image(new Embed.EmbedImage(target.BannerImage)); } if (target.NamePrivacy.CanAccess(pctx) && target.DisplayName != null) { eb.Field(new Embed.Field("Display Name", target.DisplayName, true)); } if (!target.Color.EmptyOrNull()) { eb.Field(new Embed.Field("Color", $"#{target.Color}", true)); } if (target.ListPrivacy.CanAccess(pctx)) { 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(ctx)} add <member>`!")); } else { var name = pctx == LookupContext.ByOwner ? target.Reference(ctx) : target.Hid; eb.Field(new Embed.Field($"Members ({memberCount})", $"(see `pk;group {name} list`)")); } } if (target.DescriptionFor(pctx) is { } desc) { eb.Field(new Embed.Field("Description", desc)); } if (target.IconFor(pctx) is { } icon) { eb.Thumbnail(new Embed.EmbedThumbnail(icon.TryGetCleanCdnUrl())); } return(eb.Build()); }