diff --git a/pages/api/[...id].ts b/pages/api/[...id].ts index 72d015d..46700f2 100644 --- a/pages/api/[...id].ts +++ b/pages/api/[...id].ts @@ -12,6 +12,7 @@ type Parameters = { theme?: string; bg?: string; hideStatus?: string; + hideTimestamp?: string; hideDiscrim?: string; borderRadius?: string; animated?: string; diff --git a/src/renderCard.tsx b/src/renderCard.tsx index 51bf89c..04d03ef 100644 --- a/src/renderCard.tsx +++ b/src/renderCard.tsx @@ -13,9 +13,33 @@ type Parameters = { animated?: string; hideDiscrim?: string; hideStatus?: string; + hideTimestamp?: string; borderRadius?: string; }; +const elapsedTime = (timestamp: any) => { + let startTime = timestamp; + let endTime = Number(new Date()); + let difference = (endTime - startTime) / 1000; + + // we only calculate them, but we don't display them. + // this fixes a bug in the Discord API that does not send the correct timestamp to presence. + let daysDifference = Math.floor(difference / 60 / 60 / 24); + difference -= daysDifference * 60 * 60 * 24; + + let hoursDifference = Math.floor(difference / 60 / 60); + difference -= hoursDifference * 60 * 60; + + let minutesDifference = Math.floor(difference / 60); + difference -= minutesDifference * 60; + + let secondsDifference = Math.floor(difference); + + return `${hoursDifference >= 1 ? ("0" + hoursDifference).slice(-2) + ":" : ""}${("0" + minutesDifference).slice( + -2 + )}:${("0" + secondsDifference).slice(-2)}`; +}; + const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise => { let avatarBorderColor: string = "#747F8D", userStatus: string = "", @@ -26,17 +50,14 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< theme = "dark", discrim = "show", hideStatus = "false", + hideTimestamp = "false", borderRadius = "10px"; if (body.data.activities[0]?.emoji?.animated) statusExtension = "gif"; if (body.data.discord_user.avatar && body.data.discord_user.avatar.startsWith("a_")) avatarExtension = "gif"; - if ( - body.data.activities.length > 0 && - body.data.activities[Object.keys(body.data.activities).length - 1].type === 0 - ) - activity = body.data.activities[Object.keys(body.data.activities).length - 1]; if (params.animated === "false") avatarExtension = "webp"; if (params.hideStatus === "true") hideStatus = "true"; + if (params.hideTimestamp === "true") hideTimestamp = "true"; if (params.hideDiscrim === "true") discrim = "hide"; if (params.theme === "light") { backgroundColor = "#eee"; @@ -48,7 +69,9 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< let avatar: String; if (body.data.discord_user.avatar) { avatar = await encodeBase64( - `https://cdn.discordapp.com/avatars/${body.data.discord_user.id}/${body.data.discord_user.avatar}.${avatarExtension}?size=${avatarExtension === "gif" ? "128" : "256"}` + `https://cdn.discordapp.com/avatars/${body.data.discord_user.id}/${ + body.data.discord_user.avatar + }.${avatarExtension}?size=${avatarExtension === "gif" ? "128" : "256"}` ); } else { let lastDigit = Number(body.data.discord_user.discriminator.substr(-1)); @@ -94,6 +117,15 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< if (body.data.activities[0] && body.data.activities[0].state && body.data.activities[0].type === 4) userStatus = body.data.activities[0].state; + if (body.data.activities[0] && body.data.activities[0].state && body.data.activities[0].type === 4) + userStatus = body.data.activities[0].state; + + // filter only type 0 + const activities = body.data.activities.filter(activity => activity.type === 0); + + // take the highest one + activity = Array.isArray(activities) ? activities[0] : activities; + return ` @@ -169,10 +201,10 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< .map( v => ` ` @@ -196,12 +228,12 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ? ` ` @@ -230,7 +262,7 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< padding-top: 18px; ">
@@ -239,20 +271,20 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ? ` ` : ` @@ -263,7 +295,7 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ? ` -

PLAYING A GAME...

${activity.details}

` : `` } + ${ + activity.state + ? ` +

${activity.state}${ + activity.party && activity.party.size + ? ` (${activity.party.size[0]} of ${activity.party.size[1]})` + : "" + }

` + : `` + } + ${ + activity.timestamps && activity.timestamps.start && hideTimestamp !== "true" + ? ` +

${elapsedTime(new Date(activity.timestamps.start).getTime())} elapsed

` + : `` + }
` @@ -326,10 +391,10 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< padding-top: 18px; "> @@ -341,11 +406,11 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ">

LISTENING TO SPOTIFY...

+ }; margin-bottom: 15px;">LISTENING TO SPOTIFY...

${escape(body.data.spotify.song)}

By ${escape(body.data.spotify.artist)}

@@ -376,7 +441,7 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< align-items: center; ">