diff --git a/package.json b/package.json index eb29606..0ca8549 100644 --- a/package.json +++ b/package.json @@ -11,12 +11,14 @@ "dependencies": { "@types/escape-html": "^1.0.1", "@types/ioredis": "^4.28.8", + "@types/json-bigint": "^1.0.4", "@types/styled-components": "^5.1.10", "axios": "^0.21.1", "escape-html": "^1.0.3", "framer-motion": "^4.1.17", "image-to-base64": "^2.2.0", "ioredis": "^4.28.5", + "json-bigint": "^1.0.0", "next": "12.2.5", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/pages/api/[...id].ts b/pages/api/[...id].ts index 4810697..2c92fcb 100644 --- a/pages/api/[...id].ts +++ b/pages/api/[...id].ts @@ -3,6 +3,7 @@ import axios from "axios"; import renderCard from "../../src/renderCard"; import { isSnowflake } from "../../src/snowflake"; import redis from "../../src/redis"; +import JSONbig from "json-bigint"; type Data = { id?: string | string[]; @@ -20,8 +21,24 @@ type Parameters = { animated?: string; }; +const convertBigIntToString = (obj: { [key: string]: any }): { [key: string]: any } => { + const result: { [key: string]: any } = Array.isArray(obj) ? [] : {}; + + for (const key in obj) { + if (typeof obj[key] === "bigint") { + result[key] = obj[key].toString(); + } else if (typeof obj[key] === "object" && obj[key] !== null) { + result[key] = convertBigIntToString(obj[key]); + } else { + result[key] = obj[key]; + } + } + + return result; +}; + export default async function handler(req: NextApiRequest, res: NextApiResponse) { - let getUser; + let getUser: any = {}; if (!req.query.id) return res.send({ @@ -37,7 +54,9 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse< }); try { - getUser = await axios(`https://api.lanyard.rest/v1/users/${userId}`); + getUser.data = await fetch(`https://api.lanyard.rest/v1/users/${userId}`) + .then(res => res.text()) + .then(res => convertBigIntToString(JSONbig.parse(res))); } catch (error: any) { if (error.response.data && error.response.data.error.message) return res diff --git a/src/LanyardTypes.ts b/src/LanyardTypes.ts index ae96cb3..d09ef5c 100644 --- a/src/LanyardTypes.ts +++ b/src/LanyardTypes.ts @@ -37,6 +37,14 @@ export interface DiscordUser { avatar: string; global_name: string; display_name: string; + clan: ClanTag | null; +} + +export interface ClanTag { + tag: string; + badge: string; + identity_enabled: boolean; + identity_guild_id: number; } export interface Activity { diff --git a/src/renderCard.tsx b/src/renderCard.tsx index a8c1480..b8ce6fd 100644 --- a/src/renderCard.tsx +++ b/src/renderCard.tsx @@ -9,6 +9,7 @@ import escape from "escape-html"; type Parameters = { theme?: string; bg?: string; + clanbg?: string; animated?: string; hideDiscrim?: string; hideStatus?: string; @@ -17,6 +18,7 @@ type Parameters = { hideProfile?: string; hideActivity?: string; hideSpotify?: string; + hideClanTag?: string; ignoreAppId?: string; showDisplayName?: string; borderRadius?: string; @@ -71,12 +73,13 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< let hideProfile = parseBool(params.hideProfile); let hideActivity = params.hideActivity ?? "false"; let hideSpotify = parseBool(params.hideSpotify); + let hideClanTag = parseBool(params.hideClanTag); let ignoreAppId = parseAppId(params.ignoreAppId); let hideDiscrim = parseBool(params.hideDiscrim); let showDisplayName = parseBool(params.showDisplayName); - if (parseBool(params.hideDiscrim) || body.data.discord_user.discriminator === "0") hideDiscrim = true; + if (!body.data.discord_user.clan) hideClanTag = true; if (data.activities[0]?.emoji?.animated) statusExtension = "gif"; if (data.discord_user.avatar && data.discord_user.avatar.startsWith("a_")) avatarExtension = "gif"; if (params.animated === "false") avatarExtension = "webp"; @@ -85,6 +88,8 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< theme = "light"; } if (params.bg) backgroundColor = params.bg; + let clanBackgroundColor: string = theme === "light" ? "#e0dede" : "#111214"; + if (params.clanbg) clanBackgroundColor = params.clanbg; if (params.idleMessage) idleMessage = params.idleMessage; if (params.borderRadius) borderRadius = params.borderRadius; @@ -103,6 +108,13 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< ); } + let clanBadge: string; + if (data.discord_user.clan) { + clanBadge = await encodeBase64( + `https://cdn.discordapp.com/clan-badges/${data.discord_user.clan.identity_guild_id}/${data.discord_user.clan.badge}.png?size=16` + ); + } + switch (data.discord_status) { case "online": avatarBorderColor = "#43B581"; @@ -230,6 +242,26 @@ const renderCard = async (body: LanyardTypes.Root, params: Parameters): Promise< } + ${hideClanTag ? "" : ` + + +

${escape(data.discord_user.clan!.tag)}

+
+ `} + ${hideBadges ? "" : flags.map(v => `