From e4842100f1a16413b790279956a1c85dd6aad64d Mon Sep 17 00:00:00 2001 From: Hexagonn Date: Sat, 28 Sep 2024 15:48:49 +0700 Subject: [PATCH] feat: avatar decoration --- src/LanyardTypes.ts | 7 +++++++ src/renderCard.tsx | 48 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/LanyardTypes.ts b/src/LanyardTypes.ts index d09ef5c..4ea793c 100644 --- a/src/LanyardTypes.ts +++ b/src/LanyardTypes.ts @@ -38,6 +38,7 @@ export interface DiscordUser { global_name: string; display_name: string; clan: ClanTag | null; + avatar_decoration_data: AvatarDecoration | null; } export interface ClanTag { @@ -47,6 +48,12 @@ export interface ClanTag { identity_guild_id: number; } +export interface AvatarDecoration { + sku_id: string; + asset: string; + expires_at: number; +} + export interface Activity { type: number; state: string; diff --git a/src/renderCard.tsx b/src/renderCard.tsx index c187204..e3a20b9 100644 --- a/src/renderCard.tsx +++ b/src/renderCard.tsx @@ -19,6 +19,7 @@ type Parameters = { hideActivity?: string; hideSpotify?: string; hideClan?: string; + hideDecoration?: string; ignoreAppId?: string; showDisplayName?: string; borderRadius?: string; @@ -74,10 +75,12 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< let hideActivity = params.hideActivity ?? "false"; let hideSpotify = parseBool(params.hideSpotify); let hideClan = parseBool(params.hideClan); + let hideDecoration = parseBool(params.hideDecoration); let ignoreAppId = parseAppId(params.ignoreAppId); let hideDiscrim = parseBool(params.hideDiscrim); let showDisplayName = parseBool(params.showDisplayName); + if (!data.discord_user.avatar_decoration_data || params.hideDecoration) hideDecoration = true; if (parseBool(params.hideDiscrim) || body.data.discord_user.discriminator === "0") hideDiscrim = true; if (!body.data.discord_user.clan) hideClan = true; if (data.activities[0]?.emoji?.animated) statusExtension = "gif"; @@ -115,6 +118,13 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ); } + let avatarDecoration: string; + if (data.discord_user.avatar_decoration_data) { + avatarDecoration = await encodeBase64( + `https://cdn.discordapp.com/avatar-decoration-presets/${data.discord_user.avatar_decoration_data.asset}.png?size=64&passthrough=true` + ); + } + switch (data.discord_status) { case "online": avatarBorderColor = "#43B581"; @@ -165,6 +175,19 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< return ` + + +
+ ${hideDecoration || !data.discord_user.avatar_decoration_data ? "" : ` + + `} +