kira-arts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../Src/index.ts","../Src/@Types/common.ts","../Src/Utils/error.utils.ts","../Src/Utils/fetch.utils.ts","../Src/Utils/badges.utils.ts","../Src/client.ts","../Src/Utils/cache.utils.ts","../Src/Utils/validations.utils.ts","../Src/Utils/canvasShared.utils.ts","../Src/Utils/profileImage.output.utils.ts","../Src/Utils/ProfileImage/badges.ts","../Src/Utils/fonts.utils.ts","../Src/Utils/strings.utils.ts","../Public/ProfileImage.files.json","../Src/Utils/ProfileImage/constants.ts","../Src/Utils/ProfileImage/frame.ts","../Src/Utils/ProfileImage/avatar.ts","../Src/Utils/ProfileImage/textAvatar.ts","../Src/Utils/ProfileImage/xpBar.ts","../Src/Utils/output.utils.ts","../Src/Utils/themes.utils.ts","../Src/Cards/profileImage.ts","../Src/Utils/LeaderboardImage/constants.ts","../Src/Utils/LeaderboardImage/colorUtils.ts","../Src/Utils/LeaderboardImage/dimensions.ts","../Src/Utils/LeaderboardImage/background.ts","../Src/Utils/LeaderboardImage/header.ts","../Src/Utils/LeaderboardImage/row.ts","../Src/Utils/LeaderboardImage/index.ts","../Src/Utils/leaderboardImage.output.utils.ts","../Src/Cards/leaderboardImage.ts","../Src/Utils/MemberEeventCard/constants.ts","../Src/Utils/MemberEeventCard/dimensions.ts","../Src/Utils/MemberEeventCard/render.ts","../Src/Utils/MemberEeventCard/textEffects.ts","../Src/Utils/MemberEeventCard/pills.ts","../Src/Utils/memberEventCard.output.utils.ts","../Src/Cards/memberEvent.ts","../Src/Cards/welcomeImage.ts","../Src/Cards/leaveImage.ts","../Src/Utils/LevelUpCard/constants.ts","../Src/Utils/LevelUpCard/dimensions.ts","../Src/Utils/ShipCard/decorations.ts","../Src/Utils/LevelUpCard/render.ts","../Src/Utils/levelUpCard.output.utils.ts","../Src/Cards/levelUpImage.ts","../Src/Utils/achievementCard.utils.ts","../Src/Utils/achievementCard.output.utils.ts","../Src/Cards/achievementImage.ts","../Src/Utils/ShipCard/constants.ts","../Src/Utils/ShipCard/compatibility.ts","../Src/Utils/ShipCard/canvasSetup.ts","../Src/Utils/ShipCard/heartMeter.ts","../Src/Utils/ShipCard/avatar.ts","../Src/Utils/ShipCard/render.ts","../Src/Utils/shipCard.output.utils.ts","../Src/Cards/shipImage.ts","../Src/Utils/attachment.utils.ts"],"sourcesContent":["export { profileImage } from \"./Cards/profileImage\";\nexport { leaderboardImage } from \"./Cards/leaderboardImage\";\nexport { welcomeImage } from \"./Cards/welcomeImage\";\nexport { leaveImage } from \"./Cards/leaveImage\";\nexport { levelUpImage } from \"./Cards/levelUpImage\";\nexport { achievementImage } from \"./Cards/achievementImage\";\nexport { shipImage } from \"./Cards/shipImage\";\nexport { computeCompatibility, pickShipMessage } from \"./Utils/ShipCard/index\";\nexport { setClient } from \"./client\";\nexport { setCacheOptions, clearCache, getCacheSize } from \"./Utils/cache.utils\";\nexport { KiraError } from \"./Utils/error.utils\";\nexport { KiraErrorCode } from \"./@Types/index\";\nexport { toAttachment } from \"./Utils/attachment.utils\";\nexport { encodeCanvas, extensionForFormat } from \"./Utils/output.utils\";\nexport { THEMES, getThemePalette } from \"./Utils/themes.utils\";\nexport {\n loadImageSafe,\n hexToRgb,\n hexToRgba,\n drawGradientBorder,\n drawCoverImage,\n} from \"./Utils/canvasShared.utils\";\nexport {\n parseHex,\n decimalToHex,\n parseImg,\n parsePng,\n isString,\n isNumber,\n} from \"./Utils/validations.utils\";\nexport type { KiraCacheOptions } from \"./Utils/cache.utils\";\nexport type {\n ProfileOptions,\n RankOptions,\n PresenceStatus,\n BorderAlign,\n ColorValue,\n ColorInput,\n KiraUserData,\n KiraBadge,\n KiraNameplate,\n KiraServerTag,\n KiraNameplatePalette,\n LeaderboardEntry,\n LeaderboardOptions,\n MemberEventOptions,\n LevelUpOptions,\n AchievementOptions,\n AchievementRarity,\n ShipOptions,\n OutputFormat,\n OutputOptions,\n KiraThemeName,\n KiraThemePalette,\n} from \"./@Types/index\";\n","export type PresenceStatus =\r\n \"online\" | \"idle\" | \"offline\" | \"dnd\" | \"invisible\" | \"streaming\" | \"phone\";\r\n\r\nexport type BorderAlign = \"horizontal\" | \"vertical\";\r\n\r\nexport type ColorValue = string | number;\r\nexport type ColorInput = ColorValue | ColorValue[];\r\n\r\nexport type OutputFormat = \"png\" | \"jpeg\" | \"webp\";\r\n\r\nexport interface OutputOptions {\r\n format?: OutputFormat;\r\n quality?: number;\r\n}\r\n\r\nexport enum KiraErrorCode {\r\n Validation = \"VALIDATION\",\r\n Fetch = \"FETCH\",\r\n AssetLoad = \"ASSET_LOAD\",\r\n Render = \"RENDER\",\r\n Config = \"CONFIG\",\r\n}\r\n","import { KiraErrorCode } from \"../@Types/index\";\n\nexport { KiraErrorCode };\n\nexport class KiraError extends Error {\n public readonly code: KiraErrorCode;\n\n constructor(message?: string, code: KiraErrorCode = KiraErrorCode.Validation) {\n super(message);\n this.name = \"KiraError\";\n this.code = code;\n }\n}\n","import type { Client } from \"discord.js\";\nimport { createCanvas } from \"@napi-rs/canvas\";\n\nimport { KiraError } from \"./error.utils\";\nimport { getBadgesFromFlags, getGuildMemberInfo } from \"./badges.utils\";\nimport { getClient } from \"../client\";\nimport { buildCacheKey, getCached, setCached } from \"./cache.utils\";\nimport type { KiraUserData, RawUserProfileResponse } from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\nimport { decimalToHex } from \"./validations.utils\";\nimport { loadImageSafe } from \"./canvasShared.utils\";\n\nconst NAMEPLATE_CDN_BASE = \"https://cdn.discordapp.com/assets/collectibles\";\n\nconst MATH_SCRIPT_FALLBACK_MAP: Record<string, string> = {\n \"๐’œ\": \"A\",\n โ„ฌ: \"B\",\n \"๐’ž\": \"C\",\n \"๐’Ÿ\": \"D\",\n โ„ฐ: \"E\",\n โ„ฑ: \"F\",\n \"๐’ข\": \"G\",\n โ„‹: \"H\",\n โ„: \"I\",\n \"๐’ฅ\": \"J\",\n \"๐’ฆ\": \"K\",\n โ„’: \"L\",\n โ„ณ: \"M\",\n \"๐’ฉ\": \"N\",\n \"๐’ช\": \"O\",\n \"๐’ซ\": \"P\",\n \"๐’ฌ\": \"Q\",\n โ„›: \"R\",\n \"๐’ฎ\": \"S\",\n \"๐’ฏ\": \"T\",\n \"๐’ฐ\": \"U\",\n \"๐’ฑ\": \"V\",\n \"๐’ฒ\": \"W\",\n \"๐’ณ\": \"X\",\n \"๐’ด\": \"Y\",\n \"๐’ต\": \"Z\",\n \"๐’ถ\": \"a\",\n \"๐’ท\": \"b\",\n \"๐’ธ\": \"c\",\n \"๐’น\": \"d\",\n โ„ฏ: \"e\",\n \"๐’ป\": \"f\",\n โ„Š: \"g\",\n \"๐’ฝ\": \"h\",\n \"๐’พ\": \"i\",\n \"๐’ฟ\": \"j\",\n \"๐“€\": \"k\",\n \"๐“\": \"l\",\n \"๐“‚\": \"m\",\n \"๐“ƒ\": \"n\",\n \"๐‘œ\": \"o\",\n \"๐“…\": \"p\",\n \"๐“†\": \"q\",\n \"๐“‡\": \"r\",\n \"๐“ˆ\": \"s\",\n \"๐“‰\": \"t\",\n \"๐“Š\": \"u\",\n \"๐“‹\": \"v\",\n \"๐“Œ\": \"w\",\n \"๐“\": \"x\",\n \"๐“Ž\": \"y\",\n \"๐“\": \"z\",\n};\n\nfunction applyMathScriptFallback(value: string): string {\n let result = \"\";\n for (const char of value) {\n result += MATH_SCRIPT_FALLBACK_MAP[char] ?? char;\n }\n return result;\n}\n\nfunction normalizeDisplayText<T extends string | null>(value: T): T {\n if (typeof value !== \"string\") return value;\n try {\n const normalized = value.normalize(\"NFKC\");\n if (normalized !== value) return normalized as T;\n return applyMathScriptFallback(normalized) as T;\n } catch {\n return value;\n }\n}\n\nasync function computeBannerAverageColor(bannerUrl: string | null): Promise<string | null> {\n if (!bannerUrl) return null;\n\n const image = await loadImageSafe(bannerUrl, 1, 4000);\n\n if (!image) return null;\n\n try {\n const canvas = createCanvas(1, 1);\n const ctx = canvas.getContext(\"2d\");\n ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, 1, 1);\n const { data } = ctx.getImageData(0, 0, 1, 1);\n return (\n \"#\" +\n [data[0], data[1], data[2]].map((channel) => channel.toString(16).padStart(2, \"0\")).join(\"\")\n );\n } catch {\n return null;\n }\n}\n\nasync function fetchNitroThemeColors(\n client: Client,\n userId: string,\n fallbackAccent: string | null,\n): Promise<string[] | null> {\n try {\n const profile = (await client.rest.get(\n `/users/${userId}/profile?with_mutual_guilds=false&with_mutual_friends=false&with_mutual_friends_count=false`,\n )) as RawUserProfileResponse;\n\n const themeColors = profile.user_profile_customization?.theme_colors ?? profile.theme_colors;\n\n if (Array.isArray(themeColors) && themeColors.length >= 2) {\n return [decimalToHex(themeColors[0]), decimalToHex(themeColors[1])];\n }\n\n if (Array.isArray(themeColors) && themeColors.length === 1) {\n return [decimalToHex(themeColors[0])];\n }\n } catch (error: unknown) {\n if (process.env.KIRA_DEBUG) {\n const details =\n typeof error === \"object\" && error !== null && \"rawError\" in error\n ? (error as { rawError: unknown }).rawError\n : error instanceof Error\n ? error.message\n : error;\n\n console.warn(`[kira-arts] Nitro theme fetch failed for ${userId}:`, details);\n }\n }\n\n return fallbackAccent ? [fallbackAccent] : null;\n}\n\nexport async function fetchUserData(\n userId: string,\n guildId?: string,\n bypassCache = false,\n): Promise<KiraUserData> {\n const cacheKey = buildCacheKey(userId, guildId);\n\n if (!bypassCache) {\n const cached = getCached(cacheKey);\n if (cached) return cached;\n }\n\n const client = getClient();\n\n try {\n const user = await client.users.fetch(userId, { force: true });\n\n const nameplateData = user.collectibles?.nameplate ?? null;\n const primaryGuild = user.primaryGuild;\n const hasServerTag = Boolean(primaryGuild?.identityEnabled && primaryGuild?.tag);\n\n const badges = getBadgesFromFlags(user.flags);\n let roleColor: string | null = null;\n if (guildId) {\n const memberInfo = await getGuildMemberInfo(client, guildId, userId);\n if (memberInfo.boostBadge) badges.push(memberInfo.boostBadge);\n roleColor = memberInfo.roleColor;\n }\n\n const bannerUrl = user.bannerURL({ size: 128 }) ?? null;\n const accentFallback = user.hexAccentColor ?? (await computeBannerAverageColor(bannerUrl));\n const profileColors = await fetchNitroThemeColors(client, userId, accentFallback);\n\n const result: KiraUserData = {\n basicInfo: {\n id: user.id,\n username: normalizeDisplayText(user.username),\n globalName: normalizeDisplayText(user.globalName),\n discriminator: user.discriminator === \"0\" ? null : user.discriminator,\n bot: user.bot,\n verified: user.flags?.has(\"VerifiedBot\") ?? false,\n createdTimestamp: user.createdTimestamp,\n },\n assets: {\n avatarURL: user.avatarURL({ size: 512, extension: \"png\", forceStatic: true }),\n defaultAvatarURL: user.defaultAvatarURL,\n bannerURL: user.bannerURL({ size: 512 }) ?? null,\n badges,\n },\n decoration: {\n avatarFrame: user.avatarDecorationURL({ size: 256 }) ?? null,\n profileColors,\n roleColor,\n nameplate: nameplateData\n ? {\n imageURL: `${NAMEPLATE_CDN_BASE}/${nameplateData.asset}static.png`,\n palette: nameplateData.palette,\n }\n : null,\n serverTag: hasServerTag\n ? {\n text: normalizeDisplayText(primaryGuild!.tag as string),\n badgeURL: user.guildTagBadgeURL({ size: 64 }),\n }\n : null,\n },\n };\n\n setCached(cacheKey, result);\n return result;\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : undefined;\n\n throw new KiraError(message || \"Could not fetch user data\", KiraErrorCode.Fetch);\n }\n}\n","import type { Client, UserFlagsBitField, UserFlagsString } from \"discord.js\";\nimport type { KiraBadge } from \"../@Types/index\";\n\nconst ICON_BASE = \"https://raw.githubusercontent.com/kenndeclouv/badges-discord/main/assets\";\n\nconst BOOST_BADGE: KiraBadge = {\n name: \"Server Booster\",\n icon: `${ICON_BASE}/boosts/discordboost1.svg`,\n};\n\nexport interface KiraMemberInfo {\n boostBadge: KiraBadge | null;\n roleColor: string | null;\n}\n\nexport async function getGuildMemberInfo(\n client: Client,\n guildId: string,\n userId: string,\n): Promise<KiraMemberInfo> {\n try {\n const guild = client.guilds.cache.get(guildId) ?? (await client.guilds.fetch(guildId));\n const member = await guild.members.fetch(userId);\n const displayColor = member.displayHexColor;\n\n return {\n boostBadge: member.premiumSince ? BOOST_BADGE : null,\n roleColor: displayColor && displayColor !== \"#000000\" ? displayColor : null,\n };\n } catch {\n return { boostBadge: null, roleColor: null };\n }\n}\n\nconst FLAG_BADGES: Partial<Record<UserFlagsString, KiraBadge>> = {\n Staff: { name: \"Discord Staff\", icon: `${ICON_BASE}/discordstaff.svg` },\n Partner: { name: \"Partnered Server Owner\", icon: `${ICON_BASE}/discordpartner.svg` },\n CertifiedModerator: { name: \"Moderator Programs Alumni\", icon: `${ICON_BASE}/discordmod.svg` },\n Hypesquad: { name: \"HypeSquad Events\", icon: `${ICON_BASE}/hypesquadevents.svg` },\n BugHunterLevel2: { name: \"Discord Bug Hunter\", icon: `${ICON_BASE}/discordbughunter2.svg` },\n BugHunterLevel1: { name: \"Discord Bug Hunter\", icon: `${ICON_BASE}/discordbughunter1.svg` },\n HypeSquadOnlineHouse1: { name: \"HypeSquad Bravery\", icon: `${ICON_BASE}/hypesquadbravery.svg` },\n HypeSquadOnlineHouse2: {\n name: \"HypeSquad Brilliance\",\n icon: `${ICON_BASE}/hypesquadbrilliance.svg`,\n },\n HypeSquadOnlineHouse3: { name: \"HypeSquad Balance\", icon: `${ICON_BASE}/hypesquadbalance.svg` },\n VerifiedDeveloper: {\n name: \"Early Verified Bot Developer\",\n icon: `${ICON_BASE}/discordbotdev.svg`,\n },\n ActiveDeveloper: { name: \"Active Developer\", icon: `${ICON_BASE}/activedeveloper.svg` },\n VerifiedBot: { name: \"Verified Bot\", icon: `${ICON_BASE}/verifiedbot.svg` },\n PremiumEarlySupporter: {\n name: \"Early Supporter\",\n icon: `${ICON_BASE}/discordearlysupporter.svg`,\n },\n};\n\nconst DISPLAY_ORDER: UserFlagsString[] = [\n \"Staff\",\n \"Partner\",\n \"CertifiedModerator\",\n \"Hypesquad\",\n \"BugHunterLevel2\",\n \"BugHunterLevel1\",\n \"HypeSquadOnlineHouse1\",\n \"HypeSquadOnlineHouse2\",\n \"HypeSquadOnlineHouse3\",\n \"VerifiedDeveloper\",\n \"ActiveDeveloper\",\n \"VerifiedBot\",\n \"PremiumEarlySupporter\",\n];\n\nexport function getBadgesFromFlags(flags: UserFlagsBitField | null | undefined): KiraBadge[] {\n if (!flags) return [];\n\n const active = new Set(flags.toArray());\n\n return DISPLAY_ORDER.filter((flag) => active.has(flag))\n .map((flag) => FLAG_BADGES[flag])\n .filter((badge): badge is KiraBadge => Boolean(badge));\n}\n","import type { Client } from \"discord.js\";\nimport { KiraError } from \"./Utils/error.utils\";\nimport { KiraErrorCode } from \"./@Types/index\";\n\nlet registeredClient: Client | null = null;\n\nexport function setClient(client: Client): void {\n if (!client || typeof client.users?.fetch !== \"function\") {\n throw new KiraError(\n \"setClient() expects a valid discord.js Client instance\",\n KiraErrorCode.Config,\n );\n }\n\n registeredClient = client;\n}\n\nexport function getClient(): Client {\n if (!registeredClient) {\n throw new KiraError(\n \"No discord.js Client registered. Call setClient(client) once at startup before using kira-arts, e.g. setClient(client) right after client.login().\",\n KiraErrorCode.Config,\n );\n }\n\n return registeredClient;\n}\n","import type { KiraUserData } from \"../@Types/index\";\n\nexport interface KiraCacheOptions {\n enabled?: boolean;\n ttl?: number;\n}\n\ninterface CacheEntry {\n data: KiraUserData;\n expiresAt: number;\n}\n\nconst DEFAULT_TTL = 12 * 60 * 60 * 1000;\n\nlet cacheEnabled = true;\nlet cacheTtl = DEFAULT_TTL;\n\nconst store = new Map<string, CacheEntry>();\n\nexport function setCacheOptions(options: KiraCacheOptions): void {\n if (typeof options.enabled === \"boolean\") cacheEnabled = options.enabled;\n if (typeof options.ttl === \"number\" && options.ttl > 0) cacheTtl = options.ttl;\n}\n\nexport function buildCacheKey(userId: string, guildId?: string): string {\n return guildId ? `${userId}:${guildId}` : userId;\n}\n\nexport function getCached(key: string): KiraUserData | null {\n if (!cacheEnabled) return null;\n\n const entry = store.get(key);\n if (!entry) return null;\n\n if (Date.now() > entry.expiresAt) {\n store.delete(key);\n return null;\n }\n\n return entry.data;\n}\n\nexport function setCached(key: string, data: KiraUserData): void {\n if (!cacheEnabled) return;\n store.set(key, { data, expiresAt: Date.now() + cacheTtl });\n}\n\nexport function clearCache(userId?: string, guildId?: string): void {\n if (userId) {\n store.delete(buildCacheKey(userId, guildId));\n return;\n }\n store.clear();\n}\n\nexport function getCacheSize(): number {\n return store.size;\n}\n","import { KiraError } from \"./error.utils\";\n\nexport function parseImg(imgString: string): string {\n if (!imgString || typeof imgString !== \"string\") {\n throw new KiraError(\n `Invalid custom badge ('${imgString || undefined}') must be an image file 'png | jpg | jpeg | gif'`,\n );\n }\n\n const URL = imgString.split(\".\");\n const imgType = URL[URL.length - 1];\n const imgCheck = /(jpg|jpeg|png|gif)/gi.test(imgType);\n\n if (!imgCheck)\n throw new KiraError(\n `Invalid customBackground ('${imgString || undefined}') must be an image file 'png | jpg | jpeg | gif'`,\n );\n\n return imgString;\n}\n\nexport function parsePng(imgString: string): string {\n if (!imgString || typeof imgString !== \"string\") {\n throw new KiraError(`Invalid custom badge ('${imgString || undefined}') must be a png file`);\n }\n\n const URL = imgString.split(\".\");\n const imgType = URL[URL.length - 1];\n const imgCheck = /(png)/gi.test(imgType);\n\n if (!imgCheck)\n throw new KiraError(`Invalid custom badge ('${imgString || undefined}') must be a png file`);\n\n return imgString;\n}\n\nexport type ColorValue = string | number;\n\nexport function decimalToHex(decimal: number): string {\n if (!Number.isFinite(decimal) || decimal < 0 || decimal > 0xffffff) {\n throw new KiraError(`Invalid decimal color code (${decimal}), must be between 0 and 16777215`);\n }\n\n return \"#\" + Math.round(decimal).toString(16).padStart(6, \"0\");\n}\n\nexport function parseHex(input: ColorValue): string {\n const hexRegex = new RegExp(/^(#)?([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6})$/);\n\n if (typeof input === \"number\") return decimalToHex(input);\n\n let hexString = String(input ?? \"\").trim();\n\n if (hexRegex.test(hexString)) {\n if (!hexString.startsWith(\"#\")) hexString = \"#\" + hexString;\n\n return hexString;\n }\n\n if (/^\\d+$/.test(hexString)) return decimalToHex(Number(hexString));\n\n throw new KiraError(`Invalid Hex Code ('${input === \"\" ? undefined : input}')`);\n}\n\nexport function isString(param: unknown, type: string): string {\n if (typeof param !== \"string\")\n throw new KiraError(`Invalid ${type} (${param}), must be a string`);\n\n return param;\n}\n\nexport function isNumber(param: unknown, type: string): number {\n if (typeof param !== \"number\" || isNaN(param))\n throw new KiraError(`Invalid ${type} (${param}), must be a number`);\n\n return param;\n}\n","import type { Image, SKRSContext2D } from \"@napi-rs/canvas\";\nimport { loadImage } from \"@napi-rs/canvas\";\n\nimport type { ColorValue } from \"./validations.utils\";\nimport { parseHex } from \"./validations.utils\";\nimport type { ColorInput } from \"../@Types/common\";\n\nexport interface ColorResolutionSources {\n custom?: ColorInput;\n removeBorder?: boolean;\n useNitroTheme?: boolean;\n nitroColors?: string[] | null;\n useRoleColor?: boolean;\n roleColor?: string | null;\n fallback?: ColorValue[];\n}\n\nexport function resolveCardColors(sources: ColorResolutionSources): string[] {\n if (sources.removeBorder) return [];\n\n if (typeof sources.custom !== \"undefined\") {\n const list = Array.isArray(sources.custom) ? sources.custom : [sources.custom];\n return list.map((color) => parseHex(color));\n }\n\n if (sources.useNitroTheme && sources.nitroColors && sources.nitroColors.length > 0) {\n return sources.nitroColors.map((color) => parseHex(color));\n }\n\n if (sources.useRoleColor && sources.roleColor) {\n return [parseHex(sources.roleColor)];\n }\n\n return (sources.fallback ?? []).map((color) =>\n typeof color === \"string\" ? color : parseHex(color),\n );\n}\n\nexport async function loadImageSafe(\n url: string | undefined,\n attempts = 3,\n timeoutMs = 8000,\n): Promise<Image | undefined> {\n if (!url) return undefined;\n\n const isRemote = /^https?:\\/\\//i.test(url);\n if (!isRemote) {\n return loadImage(url).catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n\n console.warn(\"[arts] failed to load local image:\", url, message);\n\n return undefined;\n });\n }\n\n for (let attempt = 1; attempt <= attempts; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: { \"User-Agent\": \"Mozilla/5.0 (compatible; kira-arts/1.0)\" },\n });\n\n if (!response.ok) throw new Error(`HTTP ${response.status}`);\n\n const arrayBuffer = await response.arrayBuffer();\n return await loadImage(Buffer.from(arrayBuffer));\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n if (attempt === attempts) {\n console.warn(\"[arts] failed to load image after retries:\", url, message);\n\n return undefined;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 250 * attempt));\n } finally {\n clearTimeout(timer);\n }\n }\n\n return undefined;\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const normalized = parseHex(hex).replace(\"#\", \"\");\n const full =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const { r, g, b } = hexToRgb(hex);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\nexport function drawGradientBorder(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n colors: string[],\n cornerRadius: number,\n thickness = 5,\n): void {\n const grd = ctx.createLinearGradient(0, 0, width, height);\n for (let i = 0; i < colors.length; i++) {\n const stop = colors.length === 1 ? 0 : i / (colors.length - 1);\n grd.addColorStop(stop, parseHex(colors[i]));\n }\n\n ctx.save();\n ctx.lineWidth = thickness;\n ctx.strokeStyle = grd;\n ctx.beginPath();\n ctx.roundRect(thickness / 2, thickness / 2, width - thickness, height - thickness, [\n Math.max(0, cornerRadius - thickness / 2),\n ]);\n ctx.stroke();\n ctx.restore();\n}\n\nexport function drawCoverImage(\n ctx: SKRSContext2D,\n image: Image,\n x: number,\n y: number,\n w: number,\n h: number,\n): void {\n const scale = Math.max(w / image.width, h / image.height);\n const drawW = image.width * scale;\n const drawH = image.height * scale;\n const dx = x + (w - drawW) / 2;\n const dy = y + (h - drawH) / 2;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, w, h);\n ctx.clip();\n ctx.drawImage(image, dx, dy, drawW, drawH);\n ctx.restore();\n}\n","import { createCanvas } from \"@napi-rs/canvas\";\n\nimport {\n getBadges,\n genBase,\n genFrame,\n genTextAndAvatar,\n genAvatarFrame,\n genBorder,\n genBadges,\n genBotVerifBadge,\n genXpBar,\n genNameplate,\n addShadow,\n} from \"./ProfileImage/index\";\nimport { ensureFontsRegistered } from \"./fonts.utils\";\nimport { encodeCanvas } from \"./output.utils\";\nimport { resolveCardColors } from \"./canvasShared.utils\";\nimport type { ProfileOptions, KiraUserData } from \"../@Types/index\";\n\nensureFontsRegistered();\n\nexport async function genPng(data: KiraUserData, options: ProfileOptions): Promise<Buffer> {\n const { basicInfo, assets } = data;\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const userAvatar = (assets.avatarURL ?? assets.defaultAvatarURL) + \"?size=512\";\n const userBanner = assets.bannerURL ? assets.bannerURL + \"?size=512\" : null;\n const badges = await getBadges(data, options);\n\n if (options?.removeBorder) ctx.roundRect(9, 9, 867, 285, [26]);\n else ctx.roundRect(0, 0, 885, 303, [34]);\n ctx.clip();\n\n const cardBase = await genBase(options, userAvatar, userBanner);\n ctx.drawImage(cardBase, 0, 0);\n\n const cardFrame = await genFrame(badges, options);\n ctx.drawImage(cardFrame, 0, 0);\n\n if (!options?.removeNameplate && data?.decoration?.nameplate) {\n const nameplate = await genNameplate(data);\n ctx.drawImage(nameplate, 0, 0);\n }\n\n const {\n canvas: cardTextAndAvatar,\n verifBadgeX,\n verifBadgeY,\n } = await genTextAndAvatar(data, options, userAvatar);\n const textAvatarShadow = addShadow(cardTextAndAvatar);\n ctx.drawImage(textAvatarShadow, 0, 0);\n ctx.drawImage(cardTextAndAvatar, 0, 0);\n\n const usingAutoNitroColors =\n !options?.removeBorder &&\n typeof options?.borderColor === \"undefined\" &&\n !options?.disableProfileTheme &&\n Boolean(data?.decoration?.profileColors?.length);\n\n if (usingAutoNitroColors && !options?.borderAllign) options.borderAllign = \"vertical\";\n\n const borderColors = resolveCardColors({\n custom: options?.borderColor,\n removeBorder: options?.removeBorder,\n useNitroTheme: !options?.disableProfileTheme,\n nitroColors: data?.decoration?.profileColors,\n useRoleColor: options?.useRoleColor,\n roleColor: data?.decoration?.roleColor,\n });\n\n if (borderColors.length > 0) {\n const border = await genBorder(borderColors, options);\n ctx.drawImage(border, 0, 0);\n }\n\n if (basicInfo?.bot) {\n const botVerifBadge = await genBotVerifBadge(data, verifBadgeX, verifBadgeY);\n const shadowVerifBadge = addShadow(botVerifBadge);\n ctx.drawImage(shadowVerifBadge, 0, 0);\n ctx.drawImage(botVerifBadge, 0, 0);\n }\n\n if (!options?.removeBadges) {\n const cardBadges = await genBadges(badges);\n const badgesShadow = addShadow(cardBadges);\n ctx.drawImage(badgesShadow, 0, 0);\n ctx.drawImage(cardBadges, 0, 0);\n }\n\n if (options?.rankData) {\n const xpBar = genXpBar(options);\n ctx.drawImage(xpBar, 0, 0);\n }\n\n if (!options?.removeAvatarFrame && data?.decoration?.avatarFrame) {\n const avatarFrame = await genAvatarFrame(data, options);\n ctx.drawImage(avatarFrame, 0, 0);\n }\n\n return encodeCanvas(canvas, options?.output);\n}\n","import type { Canvas, Image } from \"@napi-rs/canvas\";\nimport { createCanvas, loadImage } from \"@napi-rs/canvas\";\n\nimport { truncateText } from \"../strings.utils\";\nimport { parsePng } from \"../validations.utils\";\nimport { KiraError } from \"../error.utils\";\nimport type { ProfileOptions, KiraUserData} from \"../../@Types/index\";\nimport { KiraErrorCode } from \"../../@Types/index\";\nimport { otherImgs, clydeID } from \"./constants\";\n\nexport interface CanvasBadge {\n canvas: Image;\n x: number;\n y: number;\n w: number;\n}\n\nexport async function getBadges(\n data: KiraUserData,\n options: ProfileOptions,\n): Promise<CanvasBadge[]> {\n const { assets } = data;\n\n const badges = [...(assets?.badges || [])];\n const canvasBadges: CanvasBadge[] = [];\n\n for (const badge of badges.reverse()) {\n const { name, icon } = badge;\n const canvas = await loadImage(icon).catch(() => undefined);\n if (!canvas) {\n throw new KiraError(\n `Could not load badge: (${name})\\nIf you think it is not a network problem, please report it in our discord: https://discord.gg/csedxqGQKP`,\n KiraErrorCode.AssetLoad,\n );\n }\n\n canvasBadges.push({ canvas, x: 0, y: 15, w: 60 });\n }\n\n if (options?.customBadges?.length) {\n if (options?.overwriteBadges) {\n canvasBadges.splice(0, badges.length);\n }\n\n for (let i = 0; i < options.customBadges.length; i++) {\n const canvas = await loadImage(parsePng(options.customBadges[i])).catch(() => undefined);\n\n if (!canvas) {\n const truncatedBadge = truncateText(options.customBadges[i], 30);\n\n throw new KiraError(\n `Could not load custom badge: (${truncatedBadge}), make sure that the image exists.`,\n KiraErrorCode.AssetLoad,\n );\n }\n\n canvasBadges.push({ canvas, x: 10, y: 22, w: 46 });\n }\n }\n\n return canvasBadges;\n}\n\nexport async function genBadges(badges: CanvasBadge[]): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n let x = 800;\n\n for (const badge of badges) {\n const { canvas: badgeCanvas, x: bX, y, w } = badge;\n const ratio = badgeCanvas.height / badgeCanvas.width;\n const drawH = w * ratio;\n\n ctx.drawImage(badgeCanvas, x + bX, y + (w - drawH) / 2, w, drawH);\n\n x -= 59;\n }\n\n return canvas;\n}\n\nexport async function genBotVerifBadge(\n data: KiraUserData,\n badgeX: number,\n badgeY: number,\n): Promise<Canvas> {\n const { basicInfo } = data;\n const { id, verified } = basicInfo;\n\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const isClyde = id === clydeID;\n\n const badgeName = isClyde ? \"botAI\" : verified ? \"botVerif\" : \"botNoVerif\";\n\n const botBadgeBase64 = otherImgs[badgeName];\n const botBagde = await loadImage(Buffer.from(botBadgeBase64, \"base64\"));\n\n ctx.drawImage(botBagde, badgeX, badgeY);\n\n return canvas;\n}\n","import { GlobalFonts } from \"@napi-rs/canvas\";\nimport path from \"path\";\n\nlet initialized = false;\n\nexport function ensureFontsRegistered(): void {\n if (initialized) return;\n initialized = true;\n\n const fontsDir = path.join(__dirname, \"..\", \"..\", \"Public\", \"fonts\");\n\n GlobalFonts.registerFromPath(`${fontsDir}/HelveticaBold.ttf`, \"Helvetica Bold\");\n GlobalFonts.registerFromPath(`${fontsDir}/Helvetica.ttf`, \"Helvetica\");\n\n const fallbackFonts: Array<[string, string]> = [\n [\"MPLUSRounded1c-Bold.ttf\", \"MPLUS Rounded\"],\n [\"NotoSans-Bold.ttf\", \"Noto Sans\"],\n [\"NotoSansSymbols-Regular.ttf\", \"Noto Sans Symbols\"],\n [\"NotoSansSC-Regular.ttf\", \"Noto Sans SC\"],\n [\"NotoSansJP-Regular.ttf\", \"Noto Sans JP\"],\n [\"NotoColorEmoji-Regular.ttf\", \"Noto Color Emoji\"],\n [\"NotoSansSymbols2-Regular.ttf\", \"Noto Sans Symbols 2\"],\n ];\n\n for (const [file, family] of fallbackFonts) {\n try {\n GlobalFonts.registerFromPath(`${fontsDir}/${file}`, family);\n } catch {\n // Si una fuente fallback no estรก disponible en el sistema, la ignoramos\n // intencionalmente: withFallback() ya incluye una cadena de fuentes\n // alternativas, asรญ que perder una no rompe el renderizado.\n }\n }\n\n (GlobalFonts as unknown as { loadSystemFonts: () => number }).loadSystemFonts();\n}\n\nconst FALLBACK_FAMILY_STACK =\n '\"Noto Sans JP\", \"Noto Sans SC\", \"Noto Sans\", \"Noto Sans Symbols\", \"Noto Sans Symbols 2\", \"MPLUS Rounded\", \"Noto Color Emoji\"';\n\nexport function withFallback(fontDeclaration: string): string {\n return `${fontDeclaration}, ${FALLBACK_FAMILY_STACK}`;\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { withFallback } from \"./fonts.utils\";\n\nexport interface ParsedUsername {\n username: string;\n newSize: number;\n textLength: number;\n}\n\nexport function parseUsername(\n username: string,\n ctx: SKRSContext2D,\n font: string,\n size: string | number,\n maxLength: number,\n): ParsedUsername {\n username = username && username.replace(/\\s/g, \"\") ? username : \"?????\";\n const usernameChars = username.split(\"\");\n\n let finalUsername = \"\";\n\n let newSize = +size;\n let textLength = 0;\n\n let finalized = false;\n\n while (!finalized) {\n const currentUsername = usernameChars.join(\"\");\n\n ctx.font = withFallback(`${newSize}px ${font}`);\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#FFFFFF\";\n\n const actualLength = ctx.measureText(currentUsername).width;\n\n if (actualLength >= maxLength) {\n if (newSize > 60) newSize -= 1;\n else usernameChars.pop();\n }\n\n if (actualLength <= maxLength) {\n finalUsername = currentUsername;\n textLength = actualLength;\n finalized = true;\n }\n }\n\n return {\n username: finalUsername,\n newSize,\n textLength,\n };\n}\n\nfunction getFirstDigitsAsDecimal(numString: string): string {\n const digits = ((numString.length - 1) % 3) + 1;\n if (numString.length < 4) {\n return numString;\n }\n\n const decimal = numString.slice(digits, digits + 1);\n return `${numString.slice(0, digits)}${\n decimal == \"0\" || decimal == \"00\" || digits == 3 ? \"\" : `.${decimal.replace(/0$/g, \"\")}`\n }`;\n}\n\nexport function abbreviateNumber(number: number | string): string {\n const numString = `${number}`;\n const letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\"].concat(\n new Array(letters.length).fill(\"AA\").map((_, i) => letters[i].repeat(2)),\n );\n\n const selectedAbbr = abbreviations[Math.floor((numString.length - 1) / 3)] ?? \"??\";\n return `${getFirstDigitsAsDecimal(numString)}${selectedAbbr}`;\n}\n\nexport function getDateOrString(\n dateInput: Date | string | undefined | null,\n createdTimestamp: number | string,\n localDateType: string = \"en\",\n): string {\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n };\n\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/;\n\n if (typeof dateInput === \"string\") {\n if (iso8601Regex.test(dateInput)) {\n const dateInstance = new Date(dateInput);\n return dateInstance.toLocaleDateString(localDateType, dateOptions);\n } else {\n return dateInput;\n }\n } else if (dateInput instanceof Date) {\n return dateInput.toLocaleDateString(localDateType, dateOptions);\n } else {\n return new Date(+createdTimestamp).toLocaleDateString(localDateType, dateOptions);\n }\n}\n\nexport function truncateText(text: string, limit: number = 25, fromEnd: boolean = false): string {\n if (text.length > limit) {\n if (fromEnd) {\n return \"...\" + text.slice(-limit);\n } else {\n return text.slice(0, limit) + \"...\";\n }\n } else {\n return text;\n }\n}\n","{\n \"otherImgs\": {\n \"botAI\": \"iVBORw0KGgoAAAANSUhEUgAAAEwAAAAkCAYAAAAjMNwcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAydpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMS1jMDAxIDc5LjE0NjI4OTk3NzcsIDIwMjMvMDYvMjUtMjM6NTc6MTQgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5NjkwMEI1RjZBMjgxMUVFOTgwREFERDFFQTZENzRCMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5NjkwMEI2MDZBMjgxMUVFOTgwREFERDFFQTZENzRCMyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjk2OTAwQjVENkEyODExRUU5ODBEQUREMUVBNkQ3NEIzIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjk2OTAwQjVFNkEyODExRUU5ODBEQUREMUVBNkQ3NEIzIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+tQOfMQAABBxJREFUeNrsmntIU1Ecx7+bpvmYTZfmylR0aq3oLT2tqMwekLEgqeiJ1R+9IQvqj/qjIKmIKP9IjCIyqEBb9M76o+xBYpFEr7HUskzLWs1yarbOuW7Xe7drrnZ1s+5XfnDOuQ8Pn3t+j3N3ZSjdDo56E1tHLJ1YArFA/J/6TsxATE/sELGP9gMyDjAK6TgxJSRxZSK2zAYPcttgBrECCZaglDY2c+zAVMSOcOBJchZlc4Kyoo21xHpJTDoUZbRWbl9qklxSOgUWL3FwWQPkkjv+kQK6JNBvjJz8zxDz7ex/sD5yEg70nQadQoOJrwuBxjpR7luSsIpt36wvx9bq6789Py9qDoYGRLL9ZEOuFwILScTBvqlMM0URiybtesx4rcfNuodu3XZR2EiMUkS3BZbAPh0Co7C417hTX3SOfHrCEreQN9RD5oM0zlP+Wy1XDuL1g338kRU+ocsKsk7Rfc0y+Mv5C7jQ9Axbqy65GUSCMFWZ6DScpojrvsB2R83E6KAo3lhV0xfoKs64fe/s8HGC4wxEArP7AQuKwbaI8U7D/Y0ngZ/Nbt9+bq+BbPto7QPUtzR2CNN7gcn9YE1a6TS88u0VoKFahIcRi8TACLab+bkM10wvBGF2C2APElY4jRXXVyKvpliU++eFDmHbzMr6VoECs5EdY2ASqF4B7CoJ4gbtJsAvVPD44eh0JDvErTdNJqQYjok22VnKJLZtX1n5n0p5bsmF6jFgU1QjMD1EA01PFSzaDUx9xUvrJM2v6Z3sdF10+VnA+kOUidLaS+3XtovjriyuW2aohnoYWEgSbsTo2C4tFayaJdjZL611QOYLc9wCp8syqy4Tl6kUbaI6RTzPHenKEoJHazIK12NboyFkAkLa0ScFYwPUiPQNdjpW9NVIMtgdEWcZBJ2qzdXMLRZkq1N/C5cLtEuBlZFMJGuowV0So8YG87cW1E0d1WxtQSotIURUVuhwXp+65hb1pPaBUbhvLwI/vnko6FtqMO5lLnLrOn5qfobjJG41izrJ+Uqt25A98rZidWUhTporcCt2nuDxfbX3SIApF3eG/hG8TXNBXRn2fH4ieKo+ejabGDJJotr7odizwKhuf3pEXLQaj2LmYViguu0Vi/kVsqouij7B7DB+1qOwSr4+FTz3nnkwG+uYmozARmOtFxSuDe8x/HkO9n+4z3St5G/qq1Od4gKLVcN42bE9WI7ZkqnJwsd4V6W/+c0FbHpXBLkxHyCZS2wlh2h5tRe33hKSYxHLLXTFEv3l2wpJnn29868D+yJhcD16U2BGiYPLek6BnZc4uCw9BZYjuaVLooxyKDD6sdhqppyS1J4om6WUlT1LnqZ7VrR+PCaJL5ONjd6xrDiH1s80dxF7TLfc/zEki43BbhuTc/YDvwQYAOqbIjln7aR5AAAAAElFTkSuQmCC\",\n \"botNoVerif\": \"iVBORw0KGgoAAAANSUhEUgAAAD0AAAAkCAYAAAA6uzK6AAAACXBIWXMAAAsTAAALEwEAmpwYAAADtklEQVRogd2az2/TZhjHP04c2oBSCmgH1DGmDsiKRVuVlYaO0MLCD6FJEwjEjxtIoO3EYZO4ILF/YMft0Gm3jTIhMQESQgMhoGgLVFSUqkBRqRhQ9QCUX+JXEzc7OPZrp3bipIkNfKQcHL9f6/m+ft73eRJbymQy7Nz3Ahu+ArYDq4CPgYjdoHeMF8AD4BJwFDiTO6C7K4JsI1wMdAGdlYyuQkSAhuxnL3Ae+A64ZR4UyBHFgV7eT8N2dAJXgNXmL82mPwNOArO9i8kTIsAJtAwGrKZ/48MzrDMb+Fk/0E2vBjp8Ccc71pFNc930Vv9i8ZTtIEyv8zEQL1kLwvQCHwPxkoWAUadnFauOtYgSf2tY5enzjONYJRokMktyPJ/sS1dEa0MYsG1OChJrkdn/bdg4PnLsDcdPpxzH79hcxaL6oOP5/UCyN8Vfpya4NzpZNq0Tuc2JK9qWW+dqabSkubMQaw3x44GZKFFng+XSlhRt0zKrrFGR+aQu4Gqmk70pLl8VKVn/aYBE5wzC1RLhaondu6r44dCrsmvNFG36m40hwtVT19iqNpnDxyYK6h8+nrSsw2QfjNydNJZL3fwgSjTI4JBaVq2ZotPbnMrnLgqTX7aFir2UQe5m1KS4T/FStEWZrq2RaFSE6aMnJhh/oqX03DmBktajHxRlelNC3M3rg2mePs9wbUDMdHtraRtaIm7V9Q/mT8/paouKsqVJDL8xpJkduKGyNvvDbeWKEL/+/jbvNRqWyOzaIo4/mhcg1iomc3hEdVyT09GacW1aiQapmy/S98I/mulkX5p9bzLGDpqIy5ztcW4YFtUHHevu6JjKT7+8rojWjGvT5tTVU1unfyBtzHhrSyivaTuGR1Ru3k5z6mwqb2dXLq1r082m2tyoyHR32f9l1qjI1NZIjgGcPP3WVWkrt9aMq40sEZeZO8f9ntfRPv0OrZK4ik75XAwbHVPp65+avg1LZGO9xVeG8vbiflPQdG2NZGk7e/5N2RpSoioHv58JaJ2R27bUDwrmbEe7bGk79V07l8Eh1WhUADasKb1DqzQFTX/RPLUhceL2sKiRzcve3XUtZZ9wFFcn3mO6uyKSfqdf+hqJd7wGkd73fQzES/4DYbrHx0C85BwI03/4GIiX/AnC9AXgon+xeMIZsh7NJWsP8MyXcCrPI7RHtoDV9B3ga2Dc64gqzDiwGc0fMLU5uQSsQHuY/SFwHoih+TKwa5vuAGuA9cA2tNcvFlDCUxAfeIlWfvXXL/62G/Q/ynk4UBWNnikAAAAASUVORK5CYII=\",\n \"botVerif\": \"iVBORw0KGgoAAAANSUhEUgAAAFgAAAAkCAYAAAANdf2OAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGUlEQVRoge2aa2wUVRiGn92dbXdLIIXKD1IF27TUMukllUqpFpTUcEmwxEuIGE1KIlEgoQmoQCRcRH6gVKJIIo0xQqMGEm6NpYnERDCyClZKaWltrUrTkCiFBkNvu7Prj2F2Znc67eytS5Y+SX/szPnOfn3POe/5zmktPp+Pl9f8h4ZUYD3wHCACKUwwFv1AG1AH7Af6lBdCUMOlwBEgbZwSSxRSgKJ7P+uB14B6AKum0XLkEZgQNzLSgNPIevoFTgW+AGzxySnhsCHrmaoIvJaJmRtt0oC1isAV8cwkgalQBM6KaxqJS7Yi8LS4ppG4TLWO3SY6rFiWNF5fdV8RXAfHhIolSaxckUxersBnXw7yz01vSPElRWqabZ0SfXd8hm3FHBuTJ1kM37saPTGJNcJy7yRnnHGE5M0R2Frl9H+WJDh0eJBzF9ym4kuKBDa8ocZ/c3yQUw3Gse9tTiErc/Rq03XRzYn6Ya73BA50JLFGxNQinA4Lb61zBjyz2WDmw+a/dt7jgYtsTk7ki66k2M6Od1IQc0Iv+0ONjalFbKlyYrcHPvul0UPtsSHTfRTkBaaYLwrMTLeamkGui25+/lVd1pmPWil/Ogmnw4LTYaFyVTKbtvdHPVZLzARe9UIy2UHL7eYtLwc+HzDdR8USO06H3hOfmifw1fHhMeP/7fUG+KarEbr+8votJ32GDTHHRku7FNVYLTGxiOxMG8sX66uGvZ8M4DZnvUCgHXx/ThX0yXn2kZqbInijKhDN20Q4sVEXOMkOuzbrbzhrjw3RbXJjAEidYiFfVAU+dnqYW7fl+GlTrWH5ZzyIusDbNunFvdYh8e13Yy9pLcvK1Vl6pcVD3x0fl5vVGVRaHJ67lZcFxjW1jL7EI40NKcstG5xMf8jKnv0D3OzVz8bVrzjIygjy3V4vez4aezMIpqhATa21XRa2uVVi0QL52fwn7NTUjr5Z5s4WWPW8+nl6mpWSYnXgOrskQw+NJFaLaYEXzLf7l2z1rkl88OkAza3qjJpbKPDsQr03flwziCfE+lzMsZE+Qx2oH36SO3A1elgz6PPv5OVlAmfPG3eelWkzrGt7bkjsO2i84UYSq8WURRSIAm9WOvyf7XbYWuVk5YpkQK5tN6516uIOHx2io8v8ElTQLn/FHhSaNDZRXBT6ZtfZJVHXMMTufQOjngijFWtqBjv12gHy/ULGLCupU/TjdKXVw5mzofmuQqGm9s0XBb4+NHnEdvmiQOoUi+EvW9cwZKqci3asFlMz2HXJw6btd2nv1M/GAlFg1iOB3UgSfHjAfL2rpbxMYFoId1ALS8flOiVsTGfXc8PLjr39vP6qg0Vloy/N96v7cYd+LwKA+JiaUs8NicYmfUe5swW/P5bNt496NxFvQh7+miODXOuQWLfaMeL7+rPDXOsI3XdBrn21R+PzF9wjiifmSLy7US4H02fYTB+d40FYdfCPLjdv77zLn9cDhbzaJnHkqPl7hmAWlgoBR2OlegimpV3yHzoAFj8T/sku1oR90Oju8bJ1d79/I/P5oNpk6WLE3EL94cKI3zX7QWHe/evDUbkPrliaxN/dXi5fDdN4E5ioDP2pM5GXM4nKuP1N7kFFEfhWXLNIXG4rAv8R1zQSl05F4JPxzCKBOakIfBDojWcmCUgvcFARuA+oBMI7gk0QjISsZ5+2iqgDXkTz39kThEUf8BKynroy7SSQAWwDLgGRHc0eHAaA34CdyPqdUF78DyvRxMINRXPNAAAAAElFTkSuQmCC\",\n \"frame\": \"iVBORw0KGgoAAAANSUhEUgAAA3UAAAEvCAYAAADihOiYAAABN2lDQ1BBZG9iZSBSR0IgKDE5OTgpAAAokZWPv0rDUBSHvxtFxaFWCOLgcCdRUGzVwYxJW4ogWKtDkq1JQ5ViEm6uf/oQjm4dXNx9AidHwUHxCXwDxamDQ4QMBYvf9J3fORzOAaNi152GUYbzWKt205Gu58vZF2aYAoBOmKV2q3UAECdxxBjf7wiA10277jTG+38yH6ZKAyNguxtlIYgK0L/SqQYxBMygn2oQD4CpTto1EE9AqZf7G1AKcv8ASsr1fBBfgNlzPR+MOcAMcl8BTB1da4Bakg7UWe9Uy6plWdLuJkEkjweZjs4zuR+HiUoT1dFRF8jvA2AxH2w3HblWtay99X/+PRHX82Vun0cIQCw9F1lBeKEuf1UYO5PrYsdwGQ7vYXpUZLs3cLcBC7dFtlqF8hY8Dn8AwMZP/fNTP8gAAAAJcEhZcwAACxMAAAsTAQCanBgAAAXAaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA3LjEtYzAwMCA3OS43YTdhMjM2LCAyMDIxLzA4LzEyLTAwOjI1OjIwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMi0wNC0yOVQxOToyODowMi0wNTowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjItMDQtMjlUMjA6MTk6MzEtMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjItMDQtMjlUMjA6MTk6MzEtMDU6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZTUwMDE2ZGYtZDZjNS1lYTQ5LWE4MWEtNGEzZGM5YzE4NWJjIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY1NDcxQjFDQzgxQzExRUNCRjBEOTkzMEY5NTU3MTIwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NjU0NzFCMUNDODFDMTFFQ0JGMEQ5OTMwRjk1NTcxMjAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjU0NzFCMTlDODFDMTFFQ0JGMEQ5OTMwRjk1NTcxMjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjU0NzFCMUFDODFDMTFFQ0JGMEQ5OTMwRjk1NTcxMjAiLz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZTUwMDE2ZGYtZDZjNS1lYTQ5LWE4MWEtNGEzZGM5YzE4NWJjIiBzdEV2dDp3aGVuPSIyMDIyLTA0LTI5VDIwOjE5OjMxLTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRm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\"\n },\n \"statusImgs\": {\n \"dnd\": \"iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3MzBGNUZCRjkyRTcxMUVEOERFOEY2OUQ5Nzg3MzEwOSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MzBGNUZDMDkyRTcxMUVEOERFOEY2OUQ5Nzg3MzEwOSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjczMEY1RkJEOTJFNzExRUQ4REU4RjY5RDk3ODczMTA5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjczMEY1RkJFOTJFNzExRUQ4REU4RjY5RDk3ODczMTA5Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ptCIzAAAAy1JREFUeNrsms9LVFEUx68hOqRT0B+QaWo/cFFYCxdBuu8HA0FWEFS0b1mGkWhRi/oHok2WaRD0A2yl7VpkJEhS9sv8AwJziJnBqO9hzlCLudP7ce679+k98N28N++e83lzf5zz7q37feCgWo+2Qa1T8+Ae3IN7cA++lqw+AR+7oV6oG9oJbYWaoc3QMpSHlqD30BtoGpo3HVSdoQSmBToLnYC2R3j+M/QAugstpgG8HboMnRTqTavQfWgY+uTiGM9AV6E56LTgEKrn9ua4/YxL4B3QK2hQMrAqL3aQ/XS4AE6T1mtoT0KTMfmZYb/WwHPQJM/OSdom9puzAd4HjUGNlpbhRvbflyQ4jbHHUIPlHKSB4+hMApze9LiF7q0ziuNhlEk1LPglaK9j2SfFc9FkAtPO62lGuWdFqCtMkhPmHx9yFLoyBIdMdPU26JjjBRfF1yoNfi6hSi5uenteGrw/JWV2vyT4LmhbSsBbuP4XAf9fdvSMf5OlVcKgsuzneYD6QQS8u8Y9qr0P81eTvOF/M89+DrFfne2TAt+huU5vfsRSlx7hnlbNOqXA2zTXb1kez7drjHMR8C2a6zOWwXX+s1LguipsxTL4So16XQS8pNJlP6TAv8fpUgatOU5PDAL+Jc6yYdD2a64vSYEvaK5fsAyu8/9BClw3e1IiMWAJeoD9R15tgoBP17hHOxxPOE1sMgzbxH6esl+dvZT8ArMYNDGwbN+CFlRBy9KxlCxlgeMMCn5HlTfwXLZfHKcoOG3bPnIcfILjFAUno027oqPQFNeVMA+EAadPtzccBb8JfTQFTnYdeusYNMVzLexDYcEL0HFVPrvigi1zPAXT4JUUNudA1VbiOBaiPBx1m3gKOmURvsT+p6I2EOdgAC1vR4LWv8L19tG4y2vcoyAvuDydTQh6lv1Nxm1I4vAPLSM9qrxpZ2qdL3L7PWGXLZPgldmeEgjaqr0nmN6ucntd3H5B6k2aOtlIFdIZnoBaIzz/FRpVKTrZWM1oL4u2fipnWam83aj+nmX9yeXkv2dZ35kOKomt33mVwKFcW2M8debBPbgH9+Ae3IOvAfsjwAD7bpEEX3YuqAAAAABJRU5ErkJggg==\",\n \"idle\": \"iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2RTVCOEFCOTkyRTcxMUVEOTM3RERBMUE4RjdBMUM4MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2RTVCOEFCQTkyRTcxMUVEOTM3RERBMUE4RjdBMUM4MCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjZFNUI4QUI3OTJFNzExRUQ5MzdEREExQThGN0ExQzgwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjZFNUI4QUI4OTJFNzExRUQ5MzdEREExQThGN0ExQzgwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WA4qawAAAwpJREFUeNrsmj1oFEEUxyd+RsFECaaNEQ0iEfwstItFbARFEBUE0UKIgtiJjWKw0UpFr1Fs/IhGsI1aJDaawlMDmuBd/C4V1FPQyxrR/2NeETTn7ey+ud3ZzIMfhLudt/NLsjszb6bu9001JWOaUl7ci3txL+7FvbjrMSPBe28DF8EP8B68AI/BABixffO6hCcwB8H5ST5/Ba6Dy+BtFsUpboAdFb4bB9fASfAya8/4IfDlP4/iHvAMnAD1WRL/AM5UuYaEj4FBsDRLb/UcCEJctxLkQUdWxD+CeyGvbQB9PCpkYhy/a3DtbNADNmZB/Inh9bPAbdDmuvhohDaNPBzWuyxeithuFTg6VefqR8ASV8UbY7Sll123q+JxJybbQauL4qsFVpr7XRTvFMixyzXxhWCTQJ4WsNwl8QM8IZGIDlfE6a99WDDfWlfEz4H5gvnapMT3WpSm0tNO4ZwtUuIX4i4BKwTlPGsh7zwp8TmgF3QJdq6Lc063IN4gJR5wB3O8Bm6O0almzpGzJE3xVUr804Sf6XksKF3/ajLoTBO3KVh4pv+Ob2EuClNefgA2TPL5T6WrJlQyegReg8/83QKwGKzjGVmn4DhdLQYr9Pef+W21KFZINBNsZtIUBal/9bxja/O8lPiAY+L3pcRpA++dI9LUz2HJKWuPI+Kh+xlW/JLSG3hpjl/cT1Fx2ra9lXLxXu5nqDDZJqYq5nOlC3tpizGwQhnU5k2WpbQ/fSqlf+3TynBDwvRgAO1YPFS6iJ+WeMoTrLJJI9NCRJnn2qWUSJe4P2XThlEqMEVeSwcJSwfcj2KUxlFLT/1gd4LyAd+/P2qCODU3Gt62hF3/Cq+3t8YdXuMWG+8oXdUcqpH0EN+vL24iiSorDSPrld60G7M4TnfzfUYlEkqVl+mtehy0gyuC09txztfO+ctSv0lbB/wWgX38AmqN0P4NuKocP9lIe1l0SGcNWKZ03Xuu0vvhNA5/5+XkxLOsw7Y7VYtDvCOqBodyk3rGnQsv7sW9uBf34l48A/FHgAEA3wORBIONQMEAAAAASUVORK5CYII=\",\n \"invisible\": \"iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2OUE0QkE5MzkyRTcxMUVEOTRDMkI1MjkwRTA0RDVCNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2OUE0QkE5NDkyRTcxMUVEOTRDMkI1MjkwRTA0RDVCNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY5QTRCQTkxOTJFNzExRUQ5NEMyQjUyOTBFMDRENUI3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY5QTRCQTkyOTJFNzExRUQ5NEMyQjUyOTBFMDRENUI3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+5VhQjAAAA+9JREFUeNrsWl1LFGEUnkpWCVOoi+jLb63Ei0ITQgv0DyRCkBFJFN11URdGgRtuUGhQfyAiCrIPqEu70iAjUCNBlPI7k6ILA2uJdVXoHPZZiljsPTNnZladAw+CM+8555l9553nPe/ZcKH1lrUebaO1Ti0gHhAPiAfEA+JryTI8iFFOqCNUEvYR8gjZhFzCPCFKmCF8ILwj9BBGVivxfMJZwklC8Qr35QK7CIcJZ/D/CcIjwj3C9GqY6iWE+4RxQut/SK9kxRg/Bn8l6Uo8i9BGGCI0K86kDPgbgv+sdCJeSnhLCGsmluLBhhGnNB2I86LVTzjg0WLMcQYQ1zfijYQuLE5eWg7iNvpBvJ7QScj06TOcifj1XhLnd+w5IeSzBgkhjzIviPOTfuLD9F5JBzy2s6hKiV8lHHSY7DLhM2ESf5cc+uN8rrhJnEVEi83k5gh3CEcgV/MgUpLy9Siuz9n0f1kqciTEIzam1CLhOqGAcInQS4j9c88C4TWuF+D+RRuvYMQN4kWE48JkvhJqIDyihmOiuL8G4yXG+RVqEz8nlKGzhFqIGzvWj9diVihvz2sTbxIkEIe4mHS4aE3AT1wwpkmT+H68e6bW4eCXTvXLdwi3w+VaxCXqiFflduVvdbtwta/TIl4pCPpAsJCZWhR+Ta1Ki/heQdAXLik0id8yLeJFhgFZgfW5RLxPoPDytYhvNQz4DWLEDVuAfxPbokXcdBf2w+UNian/HC3icc2ADgsQag/IhPh3w4DbXSxMZMK/if3UIm6qwFgyVrtEvFogmWe0iI8KEmxwibjE70ct4gOCoM3YX2taNvya2oAW8R5B0G0oCmhaC/ya2ist4nyA90mYaJUS6UPCB8l5DmtuSzsFwUOQmIUOSbNilFZzjfM0JX7XkhUFdxPeOPjleVwv/JjaMvJUJc5FgWfC5HeAfJtgwcvG/b0YL7GnyFOVOFvYhhYPYdw04baVKEdlpRAntbg+jfulQojzuiYZIKmjjaMoELYxdXlVvgjwlPxiJSqpHH+n5fxYmas0Y5IB0gOFm4T3DpPcRNiDxStPgTTnc0M6SEqca+InrETvSjrYPPKJuU08KWGl1U83LFnNHbUz2O4xcTfhlI/k44jfbdeBk8YA/rwd86AAkWq/3WDj86pGnO0lxMagR6QHEa/LqSON5h/+jHCPWsRyt+YWQZwxDYda7V4xCIgKwkPL+Zl30pbgrwL+Y1pPUrvBj0XOaSvRLsLHvVM2/UxhfCn8jWtPIbdaOpPSk8FnWXwMlexl5br3ZutPL+svbCf/7mUddnux8KKJd8TyoCnX76m+aiwgHhAPiAfEA+IB8TVgvwUYAD4Gvbi4ORocAAAAAElFTkSuQmCC\",\n \"online\": \"iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo2NThGMDEwODkyRTcxMUVEQTY1MDhDRDFERjZDQUE5NCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2NThGMDEwOTkyRTcxMUVEQTY1MDhDRDFERjZDQUE5NCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjY1OEYwMTA2OTJFNzExRURBNjUwOENEMURGNkNBQTk0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjY1OEYwMTA3OTJFNzExRURBNjUwOENEMURGNkNBQTk0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+tV936QAAAsVJREFUeNrsm99LVEEUx2dDVgk16A9wS12z8KGwFx/dfyBZiDKkHpL+BKMgI4Oi/oaQIFJT8NWetLce2kgQpR+m5R8QWBHrYtD3cM+SDwp77z0zd47Ogc/jzJzP5d6ZMzuzOfPyijmKccwc0QjiQTyIB/EgfpiiycEY58Ag6Ae9oAO0ghNgG/wGW+AjeA+WwJrtpHKWCpgCuAmuga4E7b+CKTAJvml41bvBc7AO7iWUNtyO2n/h/rp9FW8BD8AKuCH4CTVxfyvcf4tP4kXwFoxLJrbPgx3ncYo+iNOk9Q6cdzQZ0zgVHjcz8TJY4NnZZbTzuOUsxEtgGjRntAw38/gll+L0jc2DfMY1SJ7z6HEhTk/6VQav90FBecwkmVTjit8FFzyrPimfOzbFqYgY87T0vh23yIkjPmFxnZaY7CZsiHeCy55vuCi/09Lio452cmnL21vS4sNKttnDkuJnwSkl4gXe/4uIl4yuGJQS71cmflFK/Iwy8R4p8U5l4gUp8ZPKxNukxPPKxNulxGvKxH9Kif9QJv5LSnxDmfiWlPhnZeKfpMQrysQrUuJLysTfSInTAd53JdKU56rktnRaiXjDeTYq/gzsei79l/MUFadj2znPxWc5T1FxCjq02/FUmvK6H6dBHHE6837iqfhTE52lWxGneAw+eCZN+TyK2yiueBVcNdHdFR9im/Op2havl7BlD3ZtNc4jUUmd9Jh4EYxkKF/j8ReTdpDmYgAtb5ca3f8K77eH0i6vaa+CvDbRr5rLjqSXebyFtB1JXP6hZWTARId2ttb5He5/IO6yZVO8PttTAdEHXgiWt7vcXx/3X5V6ktIX/KjIuW6i6yIPwWbCfja5fZH7W5d+hXIO/pNCZ1l0DFW/y0q/ex83/++y/uHt5N67rKu2k3Jx9LtmHFzKzfpVVxNBPIgH8SAexIP4IYh/AgwAUZF3I1xau4QAAAAASUVORK5CYII=\",\n \"phone\": \"iVBORw0KGgoAAAANSUhEUgAAACkAAAA+CAYAAAC2szLVAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4QkI3RjFBQTkzQUUxMUVEQjYwRkNCMjA5OTlGRUI1RCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4QkI3RjFBQjkzQUUxMUVEQjYwRkNCMjA5OTlGRUI1RCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjhCQjdGMUE4OTNBRTExRURCNjBGQ0IyMDk5OUZFQjVEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjhCQjdGMUE5OTNBRTExRURCNjBGQ0IyMDk5OUZFQjVEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8++UgzsQAAA8dJREFUeNrsmsuPDEEcx7/9m269s2tY70dCsgfxOtiseB4kIqw4sA4iToiLvfgDXEREXASJCyKckTghuBIn8YjEI8LKkgjWWvuanZnuKr/qHmzYx+xUdfVE/JLqzPSmf/WZ36uq91cO7qwHhnIABUBhMtDbuAkNA7shMs0AFvNwYEe64YgnCL37COVZTPtcQCkLCGKAu2sYrh4o8RDeJRSy+0ECqYpAJ+ry7ZDiFkiCINz4D/kpDyLATIDUhbAQQw03IfydKPpw0TsfkLjMl3WKGpJQE6K8GXrXUfKaiAGbEXj7IsCaE2byC+cIVGyPvtSqCKeVUKxbm3qijC2DbEk0obYlVFmSqXFIKMiw1iHdUe6f5PHB4mrzu4wDe3m0jA/pOEcg5aB1kzmRTRbz3C1/unskWVR+wDagksaRYnLsB23AjjMHmVCSJGDlkEmBVqiTklBqWhclqdyUDrIxie6zZHOyan8cWXObhvXJSnxpxjElnqkGEs3cC81IMIZKltm3ruFQBmuqm9Yqkp4lE9yZG34LlfGoWcjhcAZBKRFAw6CUGKBBUEoU0BAoJQ5oAJSsAGqCkjVAjWfJKmCVOsg6YBW6KBXACeqk1AAnoJtSBaxwjtEgX1kD/Bv0W2X7SSlP8/WT9T1ZDLqh0k3vwX97P/kf0oSIsjrhxKP2XsQYyis+Rei+gBtk+cYWBG7WRKdN35Kx1Z5DyM3I9qv28x74A23w800MfgKOTNmSCtALXoOCFSh4wS8XR01U+QmhOMwh8A6uPJ+iJR3VltwORwTsZv6s/seuuhzqjTHDP8JXPfQLDHpbx6LVWzJgiPqB+8h1vYzgcl9jwJ5ZQF0/ML2T73Uj6p8X6k+ga+5WuMIypEoIQY+iUwc/55auSp74JELPvLj5qywYum90EkgjJhVkhiIgWY5FBeSWEJ1G6M8NDyZHF9Kp2pJBZiOXmdj1CtBTbUpRtiwNq5VytU7063VpCctR8nZg5kdg6heg9FMVU2ZEDK1iknBML7sFPuuVIfcK18eVmDSk3D9CVDgX+bpMD9INn2ktYX7eR9eCh+idfZSTZmnZOw0csjtZ7z3+ekCzluccXGvbhaDuatXnMFTZCcv5p1wr6X0EyUXIyGpb8joIPdOuoeS+jItwNUlO8fEYNeLjOguMASoP57oPEXLfuSj3beMJQpM7FyM7qkx4Hn7fDcKct8Dkrg5ef1dxWem0f1hgtGwJzsAtHET/DK6TRS7GwSRVhB8jxBKOgeMc+q1lt9mWPBvpCYfeKVB4J1okOM5/CDAAGWZFCtyn42oAAAAASUVORK5CYII=\",\n \"streaming\": \"iVBORw0KGgoAAAANSUhEUgAAAD4AAAA+CAYAAABzwahEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5Ljk4ZDc5NDIsIDIwMjIvMDMvMjEtMTE6NDA6NTkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1RkRGQUY4RTkyRTcxMUVEOTAwNEM4Qzk3MjIyQTAzRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1RkRGQUY4RjkyRTcxMUVEOTAwNEM4Qzk3MjIyQTAzRSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjVGREZBRjhDOTJFNzExRUQ5MDA0QzhDOTcyMjJBMDNFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjVGREZBRjhEOTJFNzExRUQ5MDA0QzhDOTcyMjJBMDNFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+4FcVmgAAA6ZJREFUeNrsmktsjFEUx2+laUtQERuRFG2nqC7I2NjprFhhEqLSECoWrNQrXiPGKwQ7EgkikRiPhOXY0FpZGFGpFi1as2AjoghjUo//yZyGhYzvce6937TfSX6bZr5zz//rvd8959xb1hY9r8aijVNj1ELhofBQeCg8FD6arNzAGI2gGUTBXFADJoJqMAS+gCx4Dh6BDtBbqsJngjawFtQV+V01MwMsBhv476/AVXAJDJbCVK8Hl8FLcOA/ootZHT/fz/7qgyq8ChwC3WC94EwqZ3/d7L8qSMIj4AFISAb2jxeb4HEiQRBOH62HYIGhjzGNk+FxrQmPgzR/nEzaZB43bkN4DKRApaVtuJLHj5kUTmvsFqiwnINUcBwNJoTTm75uYXoXywOuefmouhW+FywMWPZJ8ezRKZySiF0BTb13u01y3AhPephSy0zk3bwEkzqE14JVHgK6w1NxB/ioWTzFN1ta+CYfaWgenObd4BwY1lhwbZYW3iIQ2HuwlWdApybxLZLC54FZgsE95ZQzzlWcdDncKCU8pum/cxvMBzu5GSFlzVLCoxo/SLT+T3H2RU2HnwI+F0kJn2NgO3rHHRsK+r5PXw1SwmsNJiKPeapSyyrrY52LCJ9qOAv7xZUXNSb3e1j/k6SE26rCvoGjvNRS/EKc1usiwvOW8/C3PPXbHf7+k5TwD5aFTwdXwBmHv/8sJfy1JcHjwT7QB1pBmcPnslLC+yyIXq0KJytHVOHUxY29kBKeMdxUoCMk6vLUePSRkRLeYWgdX+Sgl/j01SklnBoJbzQJpq1yO3gGNir/fX6Ks0eyLE1pEL2Sg6RcXap56ThOp8IvCDYQqGy8qwqtYcnDwB8cp6hwOra96TOwaeAseKKp1L3BcYoKJ6NDu+8eAqKW0DZVOPLdovScyVNcB9084EY4dUtOuAxoKf+HKeuaonFXOMkvVotwsuNcOjq1tHLYCvJZyh5z+5Bb4TmwRhXurgTBhjienG7hIylsPABVW57j8JRSe00Y7nHhkLcoupXjUCaFK97eljutfwWNxlvhd3v1myLSERE1CLsMie7i8dJ+HUlc/qFthO6oJT3u80736SSP0y/hUOq6V44TiCbulkilt8Psr4n956TepPQFP0py1qnCAeFhMODRzwA/H2F/0kdN2q50DnKKm+AEhnLzkbus1PeeoP7cZf3K5eTfd1l7dH8sTFzi7VVmLgdYneolY6HwUHgoPBQeCg+FjwL7LcAAc/CpEwrVegIAAAAASUVORK5CYII=\"\n }\n}\n","import filesJson from \"../../../Public/ProfileImage.files.json\";\n\nconst { otherImgs, statusImgs } = filesJson as {\n otherImgs: Record<string, string>;\n statusImgs: Record<string, string>;\n};\n\nexport { otherImgs, statusImgs };\nexport const alphaValue = 0.4;\nexport const clydeID = \"1081004946872352958\";\n","import type { Canvas } from \"@napi-rs/canvas\";\nimport { createCanvas, loadImage } from \"@napi-rs/canvas\";\n\nimport { parseHex, parseImg } from \"../validations.utils\";\nimport { KiraError } from \"../error.utils\";\nimport type { ProfileOptions } from \"../../@Types/index\";\nimport { otherImgs, alphaValue } from \"./constants\";\nimport type { CanvasBadge } from \"./badges\";\n\nexport async function genBase(\n options: ProfileOptions,\n avatarData: string,\n bannerData: string | null,\n): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n let isBannerLoaded = true;\n let cardBackground = await loadImage(\n options?.customBackground ? parseImg(options.customBackground) : (bannerData ?? avatarData),\n ).catch(() => undefined);\n\n if (!cardBackground) {\n cardBackground = await loadImage(avatarData).catch(() => undefined);\n isBannerLoaded = false;\n }\n\n const condAvatar = options?.customBackground\n ? true\n : !isBannerLoaded\n ? false\n : bannerData !== null;\n const wX = condAvatar ? 885 : 900;\n const wY = condAvatar ? 303 : wX;\n const cY = condAvatar ? 0 : -345;\n\n ctx.fillStyle = \"#18191c\";\n ctx.beginPath();\n ctx.fillRect(0, 0, 885, 303);\n ctx.fill();\n\n ctx.filter =\n (options?.moreBackgroundBlur\n ? \"blur(9px)\"\n : options?.disableBackgroundBlur\n ? \"blur(0px)\"\n : \"blur(3px)\") +\n (options?.backgroundBrightness ? ` brightness(${options.backgroundBrightness + 100}%)` : \"\");\n ctx.drawImage(cardBackground!, 0, cY, wX, wY);\n\n ctx.globalAlpha = 0.2;\n ctx.fillStyle = \"#2a2d33\";\n ctx.beginPath();\n ctx.fillRect(0, 0, 885, 303);\n ctx.fill();\n\n return canvas;\n}\n\nexport async function genFrame(badges: CanvasBadge[], options: ProfileOptions): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const cardFrame = await loadImage(Buffer.from(otherImgs.frame, \"base64\"));\n\n ctx.globalCompositeOperation = \"source-out\";\n ctx.globalAlpha = 0.5;\n ctx.drawImage(cardFrame, 0, 0, 885, 303);\n ctx.globalCompositeOperation = \"source-over\";\n\n ctx.globalAlpha = alphaValue;\n ctx.fillStyle = \"#000\";\n ctx.beginPath();\n ctx.roundRect(696, 248, 165, 33, [12]);\n ctx.fill();\n ctx.globalAlpha = 1;\n\n const badgesLength = badges.length;\n\n if (options?.badgesFrame && badgesLength > 0 && !options?.removeBadges) {\n ctx.fillStyle = \"#000\";\n ctx.globalAlpha = alphaValue;\n ctx.beginPath();\n ctx.roundRect(857 - badgesLength * 59, 15, 59 * badgesLength + 8, 61, [17]);\n ctx.fill();\n }\n\n return canvas;\n}\n\nexport async function genBorder(borderColors: string[], options: ProfileOptions): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n if (borderColors.length > 20)\n throw new KiraError(\n `Invalid borderColor length (${borderColors.length}) must be a maximum of 20 colors`,\n );\n\n const gradX = options.borderAllign == \"vertical\" ? 0 : 885;\n const gradY = options.borderAllign == \"vertical\" ? 303 : 0;\n\n const grd = ctx.createLinearGradient(0, 0, gradX, gradY);\n\n for (let i = 0; i < borderColors.length; i++) {\n const stop = borderColors.length === 1 ? 0 : i / (borderColors.length - 1);\n grd.addColorStop(stop, parseHex(borderColors[i]));\n }\n\n ctx.fillStyle = grd;\n ctx.beginPath();\n ctx.fillRect(0, 0, 885, 303);\n\n ctx.globalCompositeOperation = \"destination-out\";\n\n ctx.beginPath();\n ctx.roundRect(9, 9, 867, 285, [25]);\n ctx.fill();\n\n return canvas;\n}\n","import type { Canvas } from \"@napi-rs/canvas\";\nimport { createCanvas, loadImage } from \"@napi-rs/canvas\";\n\nimport { KiraError } from \"../error.utils\";\nimport type { ProfileOptions, KiraUserData } from \"../../@Types/index\";\nimport { statusImgs } from \"./constants\";\n\nexport async function genNameplate(data: KiraUserData): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const nameplate = data?.decoration?.nameplate;\n if (!nameplate) return canvas;\n\n const image = await loadImage(nameplate.imageURL).catch(() => undefined);\n if (!image) return canvas;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(280, 20, 585, 260, [20]);\n ctx.clip();\n ctx.globalAlpha = 0.5;\n ctx.drawImage(image, 280, 20, 585, 260);\n ctx.restore();\n\n return canvas;\n}\n\nexport async function genAvatarFrame(data: KiraUserData, options: ProfileOptions): Promise<Canvas> {\n let canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const frameUrl = data?.decoration?.avatarFrame;\n\n const avatarFrame = await loadImage(frameUrl!);\n ctx.drawImage(avatarFrame, 25, 18, 269, 269);\n\n if (options?.presenceStatus) {\n canvas = await cutAvatarStatus(canvas, options);\n }\n\n return canvas;\n}\n\nexport async function cutAvatarStatus(\n canvasToEdit: Canvas,\n options: ProfileOptions,\n): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const cX = options.presenceStatus == \"phone\" ? 224.5 : 212;\n const cY = options.presenceStatus == \"phone\" ? 202 : 204;\n\n ctx.drawImage(canvasToEdit, 0, 0);\n\n ctx.globalCompositeOperation = \"destination-out\";\n\n if (options.presenceStatus == \"phone\") ctx.roundRect(cX - 8, cY - 8, 57, 78, [10]);\n else ctx.roundRect(212, 204, 62, 62, [62]);\n ctx.fill();\n\n ctx.globalCompositeOperation = \"source-over\";\n\n return canvas;\n}\n\nexport async function genStatus(canvasToEdit: Canvas, options: ProfileOptions): Promise<Canvas> {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const validStatus = [\"idle\", \"dnd\", \"online\", \"invisible\", \"offline\", \"streaming\", \"phone\"];\n\n if (!validStatus.includes(options.presenceStatus as string))\n throw new KiraError(\n `Invalid presenceStatus ('${options.presenceStatus}') must be 'online' | 'idle' | 'offline' | 'dnd' | 'invisible' | 'streaming' | 'phone'`,\n );\n\n const statusString = options.presenceStatus == \"offline\" ? \"invisible\" : options.presenceStatus!;\n\n const status = await loadImage(Buffer.from(statusImgs[statusString], \"base64\"));\n\n const cX = options.presenceStatus == \"phone\" ? 224.5 : 212;\n const cY = options.presenceStatus == \"phone\" ? 202 : 204;\n\n ctx.drawImage(canvasToEdit, 0, 0);\n\n ctx.globalCompositeOperation = \"destination-out\";\n\n if (options.presenceStatus == \"phone\") ctx.roundRect(cX - 8, cY - 8, 57, 78, [10]);\n else ctx.roundRect(212, 204, 62, 62, [62]);\n ctx.fill();\n\n ctx.globalCompositeOperation = \"source-over\";\n\n ctx.drawImage(status, cX, cY);\n\n return canvas;\n}\n","import type { Canvas, SKRSContext2D } from \"@napi-rs/canvas\";\nimport { createCanvas, loadImage } from \"@napi-rs/canvas\";\n\nimport { parseUsername, getDateOrString } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport { parseHex, isString } from \"../validations.utils\";\nimport type { ProfileOptions, KiraUserData, KiraServerTag } from \"../../@Types/index\";\nimport { alphaValue, clydeID } from \"./constants\";\nimport { genStatus } from \"./avatar\";\n\nexport async function genTextAndAvatar(\n data: KiraUserData,\n options: ProfileOptions,\n avatarData: string,\n): Promise<{ canvas: Canvas; verifBadgeX: number; verifBadgeY: number }> {\n const { basicInfo } = data;\n const { globalName, username: rawUsername, discriminator, bot, createdTimestamp, id } = basicInfo;\n\n const isClyde = id === clydeID;\n const pixelLength = bot ? 470 : 555;\n\n let canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const fixedUsername = options?.customUsername || globalName || rawUsername;\n\n const { username, newSize } = parseUsername(\n fixedUsername,\n ctx,\n \"Helvetica Bold\",\n \"80\",\n pixelLength,\n );\n\n if (options?.customSubtitle && !options.rankData) {\n ctx.globalAlpha = alphaValue;\n ctx.fillStyle = \"#2a2d33\";\n ctx.beginPath();\n ctx.roundRect(304, 248, 380, 33, [12]);\n ctx.fill();\n ctx.globalAlpha = 1;\n\n ctx.font = withFallback(\"23px Helvetica\");\n ctx.textAlign = \"left\";\n ctx.fillStyle = options?.color ? options.color : \"#dadada\";\n ctx.fillText(`${options?.customSubtitle}`, 314, 273);\n }\n\n const createdDateString = getDateOrString(\n options?.customDate,\n createdTimestamp,\n options?.localDateType,\n );\n\n if (isClyde && !options?.customTag) {\n options.customTag = \"@clyde\";\n }\n\n const tag = options?.customTag\n ? isString(options.customTag, \"customTag\")\n : !discriminator\n ? `@${rawUsername}`\n : `#${discriminator}`;\n\n ctx.font = withFallback(`${newSize}px Helvetica Bold`);\n ctx.textAlign = \"left\";\n ctx.fillStyle = options?.usernameColor ? parseHex(options.usernameColor) : \"#FFFFFF\";\n ctx.fillText(username, 300, 155);\n\n const usernameWidth = ctx.measureText(username).width;\n let verifBadgeX = 300 + usernameWidth + 10;\n let verifBadgeY = 110;\n\n const useCompactTag = options?.compactTag ?? bot;\n\n if (useCompactTag) {\n const tagFontSize = Math.round(newSize * 0.32);\n const tagX = 300 + usernameWidth + 8;\n\n if (bot) {\n const pillHeight = 36;\n const gap = 6;\n const tagCapHeight = tagFontSize * 0.716;\n const usernameCenterY = 155 - newSize * 0.358;\n const blockHeight = pillHeight + gap + tagCapHeight;\n const blockTop = Math.round(usernameCenterY - blockHeight / 2);\n\n verifBadgeX = tagX;\n verifBadgeY = blockTop;\n\n const tagY = Math.round(blockTop + pillHeight + gap + tagCapHeight);\n\n ctx.font = withFallback(`${tagFontSize}px Helvetica Bold`);\n ctx.fillStyle = options?.tagColor ? parseHex(options.tagColor) : \"#dadada\";\n ctx.fillText(tag, tagX, tagY);\n\n if (!options?.removeServerTag && data?.decoration?.serverTag) {\n await genServerTag(\n ctx,\n data.decoration.serverTag,\n tagX + ctx.measureText(tag).width,\n tagY + 24,\n );\n }\n } else {\n const tagY = 155 - Math.round(newSize * 0.42);\n\n ctx.font = withFallback(`${tagFontSize}px Helvetica Bold`);\n ctx.fillStyle = options?.tagColor ? parseHex(options.tagColor) : \"#dadada\";\n ctx.fillText(tag, tagX, tagY);\n\n const tagWidth = ctx.measureText(tag).width;\n verifBadgeX = tagX + tagWidth + 10;\n\n if (!options?.removeServerTag && data?.decoration?.serverTag) {\n await genServerTag(ctx, data.decoration.serverTag, tagX + tagWidth, tagY + 24);\n }\n }\n } else if (!options?.rankData) {\n ctx.font = withFallback(\"60px Helvetica\");\n ctx.fillStyle = options?.tagColor ? parseHex(options.tagColor) : \"#dadada\";\n ctx.fillText(tag, 300, 215);\n\n if (!options?.removeServerTag && data?.decoration?.serverTag) {\n await genServerTag(ctx, data.decoration.serverTag, 300 + ctx.measureText(tag).width, 215);\n }\n }\n\n ctx.font = withFallback(\"23px Helvetica\");\n ctx.textAlign = \"center\";\n ctx.fillStyle = \"#dadada\";\n ctx.fillText(createdDateString, 775, 273);\n\n const cardAvatar = await loadImage(avatarData);\n\n const roundValue = options?.squareAvatar ? 30 : 225;\n\n ctx.beginPath();\n ctx.roundRect(47, 39, 225, 225, [roundValue]);\n ctx.clip();\n\n ctx.fillStyle = \"#292b2f\";\n ctx.beginPath();\n ctx.roundRect(47, 39, 225, 225, [roundValue]);\n ctx.fill();\n\n ctx.drawImage(cardAvatar, 47, 39, 225, 225);\n\n ctx.closePath();\n\n if (options?.presenceStatus) {\n canvas = await genStatus(canvas, options);\n }\n\n return { canvas, verifBadgeX, verifBadgeY };\n}\n\nasync function genServerTag(\n ctx: SKRSContext2D,\n serverTag: KiraServerTag,\n anchorX: number,\n baselineY: number,\n): Promise<void> {\n const { text, badgeURL } = serverTag;\n const label = text.toUpperCase();\n\n ctx.font = withFallback(\"20px Helvetica Bold\");\n const labelWidth = ctx.measureText(label).width;\n\n const badgeSize = badgeURL ? 18 : 0;\n const paddingX = 10;\n const gap = badgeURL ? 6 : 0;\n const pillHeight = 28;\n const pillWidth = paddingX * 2 + badgeSize + gap + labelWidth;\n\n const pillX = Math.max(10, Math.min(anchorX + 14, 885 - pillWidth - 10));\n const pillY = baselineY - pillHeight + 6;\n\n ctx.globalAlpha = alphaValue;\n ctx.fillStyle = \"#000\";\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, pillWidth, pillHeight, [10]);\n ctx.fill();\n ctx.globalAlpha = 1;\n\n let cursorX = pillX + paddingX;\n\n const badgeImage = badgeURL ? await loadImage(badgeURL).catch(() => undefined) : undefined;\n if (badgeImage) {\n ctx.drawImage(badgeImage, cursorX, pillY + (pillHeight - badgeSize) / 2, badgeSize, badgeSize);\n cursorX += badgeSize + gap;\n }\n\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#dadada\";\n ctx.fillText(label, cursorX, pillY + pillHeight / 2 + 7);\n}\n","import type { Canvas } from \"@napi-rs/canvas\";\nimport { createCanvas } from \"@napi-rs/canvas\";\n\nimport { abbreviateNumber } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport { parseHex, isNumber } from \"../validations.utils\";\nimport { resolveCardColors } from \"../canvasShared.utils\";\nimport { KiraError } from \"../error.utils\";\nimport type { ProfileOptions } from \"../../@Types/index\";\nimport { alphaValue } from \"./constants\";\n\nexport function genXpBar(options: ProfileOptions): Canvas {\n const { currentXp, requiredXp, level, rank, barColor, levelColor, autoColorRank } =\n options.rankData!;\n\n if (isNaN(currentXp) || isNaN(requiredXp) || isNaN(level)) {\n throw new KiraError(\"rankData options requires: currentXp, requiredXp and level properties\");\n }\n\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n\n const mY = 8;\n\n ctx.fillStyle = \"#000\";\n ctx.globalAlpha = alphaValue;\n ctx.beginPath();\n ctx.roundRect(304, 248, 380, 33, [12]);\n ctx.fill();\n ctx.globalAlpha = 1;\n\n const rankString = !isNaN(rank as number)\n ? `RANK #${abbreviateNumber(isNumber(rank, \"rankData:rank\"))}`\n : \"\";\n const lvlString = !isNaN(level)\n ? `Lvl ${abbreviateNumber(isNumber(level, \"rankData:level\"))}`\n : \"\";\n\n ctx.font = withFallback(\"21px Helvetica\");\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#dadada\";\n ctx.fillText(`${abbreviateNumber(currentXp)} / ${abbreviateNumber(requiredXp)} XP`, 314, 273);\n\n const rankColors: Record<string, string> = {\n gold: \"#F1C40F\",\n silver: \"#a1a4c9\",\n bronze: \"#AD8A56\",\n current: \"#dadada\",\n };\n\n const rankMapping: Record<string, string> = {\n \"RANK #1\": rankColors.gold,\n \"RANK #2\": rankColors.silver,\n \"RANK #3\": rankColors.bronze,\n };\n\n if (autoColorRank && Object.prototype.hasOwnProperty.call(rankMapping, rankString)) {\n rankColors.current = rankMapping[rankString];\n }\n\n ctx.font = withFallback(\"bold 21px Helvetica\");\n ctx.textAlign = \"right\";\n ctx.fillStyle = rankColors.current;\n ctx.fillText(`${rankString}`, 674 - ctx.measureText(lvlString).width - 10, 273);\n\n ctx.font = withFallback(\"bold 21px Helvetica\");\n ctx.textAlign = \"right\";\n ctx.fillStyle = levelColor ? parseHex(levelColor) : \"#dadada\";\n ctx.fillText(`${lvlString}`, 674, 273);\n\n ctx.globalAlpha = alphaValue;\n ctx.fillStyle = \"#000\";\n ctx.beginPath();\n ctx.roundRect(304, 187 - mY, 557, 36, [14]);\n ctx.fill();\n ctx.globalAlpha = 1;\n\n ctx.beginPath();\n ctx.roundRect(304, 187 - mY, 557, 36, [14]);\n ctx.clip();\n\n const barColors = resolveCardColors({ custom: barColor });\n\n if (barColors.length > 20)\n throw new KiraError(\n `Invalid barColor length (${barColors.length}) must be a maximum of 20 colors`,\n );\n\n const barWidth = Math.round((currentXp * 556) / requiredXp);\n\n const grd = ctx.createLinearGradient(304, 197, 860, 197);\n\n for (let i = 0; i < barColors.length; i++) {\n const stop = barColors.length === 1 ? 0 : i / (barColors.length - 1);\n grd.addColorStop(stop, parseHex(barColors[i]));\n }\n\n ctx.fillStyle = barColors.length ? grd : \"#fff\";\n ctx.beginPath();\n ctx.roundRect(304, 187 - mY, barWidth, 36, [14]);\n ctx.fill();\n\n return canvas;\n}\n\nexport function addShadow(canvasToEdit: Canvas): Canvas {\n const canvas = createCanvas(885, 303);\n const ctx = canvas.getContext(\"2d\");\n ctx.filter = \"drop-shadow(0px 4px 4px #000)\";\n ctx.globalAlpha = alphaValue;\n ctx.drawImage(canvasToEdit, 0, 0);\n\n return canvas;\n}\n","import type { Canvas } from \"@napi-rs/canvas\";\n\nimport { KiraError } from \"./error.utils\";\nimport type { OutputFormat, OutputOptions } from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nconst MIME_MAP: Record<OutputFormat, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n webp: \"image/webp\",\n};\n\nconst DEFAULT_QUALITY = 90;\n\nexport async function encodeCanvas(canvas: Canvas, output?: OutputOptions): Promise<Buffer> {\n const format = output?.format ?? \"png\";\n const mime = MIME_MAP[format];\n\n if (!mime) {\n throw new KiraError(\n `Invalid output format ('${output?.format}'), must be one of: png, jpeg, webp`,\n KiraErrorCode.Validation,\n );\n }\n\n if (format === \"png\") {\n return canvas.toBuffer(\"image/png\");\n }\n\n const quality = output?.quality ?? DEFAULT_QUALITY;\n if (!Number.isFinite(quality) || quality < 1 || quality > 100) {\n throw new KiraError(\n `Invalid output quality (${output?.quality}), must be a number between 1 and 100`,\n KiraErrorCode.Validation,\n );\n }\n\n return canvas.toBuffer(mime as \"image/jpeg\" | \"image/webp\", quality);\n}\n\nexport function extensionForFormat(format?: OutputFormat): string {\n if (format === \"jpeg\") return \"jpg\";\n if (format === \"webp\") return \"webp\";\n return \"png\";\n}\n","import { KiraError } from \"./error.utils\";\nimport type { KiraThemeName, KiraThemePalette } from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nexport const THEMES: Record<KiraThemeName, KiraThemePalette> = {\n discord: {\n accentColor: \"#5865F2\",\n borderColor: [\"#5865F2\", \"#404EED\"],\n usernameColor: \"#FFFFFF\",\n tagColor: \"#B5BAC1\",\n messageColor: \"#DBDEE1\",\n levelColor: \"#5865F2\",\n barColor: [\"#5865F2\", \"#404EED\"],\n glowColor: \"#5865F2\",\n heartColor: \"#FF4D6D\",\n },\n midnight: {\n accentColor: \"#7C3AED\",\n borderColor: [\"#312E81\", \"#7C3AED\"],\n usernameColor: \"#E0E7FF\",\n tagColor: \"#A5B4FC\",\n messageColor: \"#C7D2FE\",\n levelColor: \"#818CF8\",\n barColor: [\"#4338CA\", \"#7C3AED\"],\n glowColor: \"#818CF8\",\n heartColor: \"#F472B6\",\n },\n sunset: {\n accentColor: \"#F97316\",\n borderColor: [\"#F97316\", \"#EC4899\"],\n usernameColor: \"#FFF7ED\",\n tagColor: \"#FDBA74\",\n messageColor: \"#FED7AA\",\n levelColor: \"#FB923C\",\n barColor: [\"#F97316\", \"#EC4899\"],\n glowColor: \"#FB923C\",\n heartColor: \"#EC4899\",\n },\n neon: {\n accentColor: \"#22D3EE\",\n borderColor: [\"#22D3EE\", \"#D946EF\"],\n usernameColor: \"#ECFEFF\",\n tagColor: \"#67E8F9\",\n messageColor: \"#A5F3FC\",\n levelColor: \"#22D3EE\",\n barColor: [\"#22D3EE\", \"#D946EF\"],\n glowColor: \"#D946EF\",\n heartColor: \"#D946EF\",\n },\n forest: {\n accentColor: \"#22C55E\",\n borderColor: [\"#166534\", \"#22C55E\"],\n usernameColor: \"#F0FDF4\",\n tagColor: \"#86EFAC\",\n messageColor: \"#BBF7D0\",\n levelColor: \"#4ADE80\",\n barColor: [\"#166534\", \"#22C55E\"],\n glowColor: \"#4ADE80\",\n heartColor: \"#84CC16\",\n },\n sakura: {\n accentColor: \"#F472B6\",\n borderColor: [\"#FBCFE8\", \"#F472B6\"],\n usernameColor: \"#FDF2F8\",\n tagColor: \"#F9A8D4\",\n messageColor: \"#FBCFE8\",\n levelColor: \"#F472B6\",\n barColor: [\"#FBCFE8\", \"#F472B6\"],\n glowColor: \"#F9A8D4\",\n heartColor: \"#FB7185\",\n },\n monochrome: {\n accentColor: \"#9CA3AF\",\n borderColor: [\"#4B5563\", \"#D1D5DB\"],\n usernameColor: \"#F9FAFB\",\n tagColor: \"#9CA3AF\",\n messageColor: \"#D1D5DB\",\n levelColor: \"#E5E7EB\",\n barColor: [\"#4B5563\", \"#D1D5DB\"],\n glowColor: \"#D1D5DB\",\n heartColor: \"#9CA3AF\",\n },\n gold: {\n accentColor: \"#D4AF37\",\n borderColor: [\"#3F3F1F\", \"#D4AF37\"],\n usernameColor: \"#FEF9E7\",\n tagColor: \"#E9D8A6\",\n messageColor: \"#F5E6B8\",\n levelColor: \"#D4AF37\",\n barColor: [\"#3F3F1F\", \"#D4AF37\"],\n glowColor: \"#D4AF37\",\n heartColor: \"#D4AF37\",\n },\n};\n\nexport function getThemePalette(theme?: KiraThemeName): KiraThemePalette | undefined {\n if (!theme) return undefined;\n\n const palette = THEMES[theme];\n if (!palette) {\n throw new KiraError(\n `Invalid theme ('${theme}'), must be one of: ${Object.keys(THEMES).join(\", \")}`,\n KiraErrorCode.Validation,\n );\n }\n\n return palette;\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genPng } from \"../Utils/profileImage.output.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { ProfileOptions} from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nexport async function profileImage(userId: string, options: ProfileOptions = {}): Promise<Buffer> {\n if (!userId || typeof userId !== \"string\")\n throw new KiraError(\n `TypeError: Invalid argument for profileImage()\\nExpected string userId, got ${typeof userId === \"undefined\" || !userId ? \"undefined\" : typeof userId}`,\n KiraErrorCode.Validation,\n );\n\n const data = await fetchUserData(userId, options.guildId, options.bypassCache);\n\n const palette = getThemePalette(options.theme);\n\n const resolvedOptions: ProfileOptions = {\n ...options,\n usernameColor: options.usernameColor ?? palette?.usernameColor,\n tagColor: options.tagColor ?? palette?.tagColor,\n borderColor: options.borderColor ?? palette?.borderColor,\n };\n\n if (resolvedOptions.rankData) {\n resolvedOptions.rankData = {\n ...resolvedOptions.rankData,\n barColor: resolvedOptions.rankData.barColor ?? palette?.barColor,\n levelColor: resolvedOptions.rankData.levelColor ?? palette?.levelColor,\n };\n }\n\n try {\n const buffer = await genPng(data, resolvedOptions);\n\n return buffer;\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n if (message.includes(\"source rejected\")) {\n throw new KiraError(`Error loading user assets, try again later`, KiraErrorCode.AssetLoad);\n }\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","import type { LeaderboardEntry, KiraUserData } from \"../../@Types/index\";\n\nexport const CARD_WIDTH = 720;\nexport const ROW_HEIGHT = 100;\nexport const ROW_GAP = 14;\nexport const PADDING = 26;\nexport const CORNER_RADIUS = 28;\n\nexport const RANK_COLORS: Record<number, string> = {\n 1: \"#F1C40F\",\n 2: \"#B9BBC6\",\n 3: \"#D08A3E\",\n};\n\nexport const DEFAULT_ACCENT = \"#2DD4BF\";\nexport const DEFAULT_ROW_BASE = \"#1c2128\";\n\nexport interface ResolvedLeaderboardEntry {\n entry: LeaderboardEntry & { rank: number };\n data: KiraUserData;\n}\n","import { parseHex } from \"../validations.utils\";\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const normalized = parseHex(hex).replace(\"#\", \"\");\n\n const full =\n normalized.length === 3\n ? normalized\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : normalized;\n\n return {\n r: parseInt(full.slice(0, 2), 16),\n g: parseInt(full.slice(2, 4), 16),\n b: parseInt(full.slice(4, 6), 16),\n };\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const { r, g, b } = hexToRgb(hex);\n\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { createCanvas } from \"@napi-rs/canvas\";\n\nimport { PADDING, ROW_HEIGHT, ROW_GAP, CARD_WIDTH } from \"./constants\";\n\nexport function getHeaderHeight(hasTitle: boolean, hasSubtitle: boolean): number {\n if (!hasTitle) return 0;\n\n return hasSubtitle ? 96 : 68;\n}\n\nexport function getCardHeight(rowCount: number, hasTitle: boolean, hasSubtitle: boolean): number {\n const header = getHeaderHeight(hasTitle, hasSubtitle);\n\n return PADDING * 2 + header + rowCount * ROW_HEIGHT + Math.max(0, rowCount - 1) * ROW_GAP;\n}\n\nexport function createLeaderboardCanvas(height: number) {\n const canvas = createCanvas(CARD_WIDTH, height);\n\n const ctx = canvas.getContext(\"2d\");\n\n return { canvas, ctx };\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { loadImage } from \"@napi-rs/canvas\";\n\nimport { parseHex } from \"../validations.utils\";\nimport { CORNER_RADIUS, DEFAULT_ACCENT } from \"./constants\";\nimport { hexToRgba } from \"./colorUtils\";\n\nexport async function drawCardBackground(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n backgroundImage?: string,\n accentColor: string = DEFAULT_ACCENT,\n): Promise<void> {\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, [CORNER_RADIUS]);\n ctx.clip();\n\n ctx.fillStyle = \"#111318\";\n ctx.fillRect(0, 0, width, height);\n\n const image = backgroundImage\n ? await loadImage(backgroundImage).catch(() => undefined)\n : undefined;\n\n if (image) {\n const scale = Math.max(width / image.width, height / image.height);\n const drawW = image.width * scale;\n const drawH = image.height * scale;\n const dx = (width - drawW) / 2;\n const dy = (height - drawH) / 2;\n\n ctx.filter = \"blur(6px) brightness(55%)\";\n ctx.drawImage(image, dx, dy, drawW, drawH);\n ctx.filter = \"none\";\n\n ctx.fillStyle = \"rgba(10, 11, 14, 0.55)\";\n ctx.fillRect(0, 0, width, height);\n } else {\n const glowTL = ctx.createRadialGradient(0, 0, 0, 0, 0, width * 0.75);\n\n glowTL.addColorStop(0, hexToRgba(accentColor, 0.16));\n glowTL.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = glowTL;\n ctx.fillRect(0, 0, width, height);\n\n const glowBR = ctx.createRadialGradient(width, height, 0, width, height, width * 0.6);\n\n glowBR.addColorStop(0, hexToRgba(accentColor, 0.1));\n glowBR.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = glowBR;\n ctx.fillRect(0, 0, width, height);\n\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.035)\";\n ctx.lineWidth = 1;\n\n const step = 34;\n\n for (let d = -height; d < width; d += step) {\n ctx.beginPath();\n ctx.moveTo(d, height);\n ctx.lineTo(d + height, 0);\n ctx.stroke();\n }\n }\n\n const gradient = ctx.createLinearGradient(0, 0, 0, height);\n\n gradient.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n gradient.addColorStop(1, \"rgba(0, 0, 0, 0.35)\");\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, width, height);\n}\n\nexport function drawCardBorder(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n colors: string[],\n): void {\n const thickness = 3;\n\n ctx.save();\n\n const grd = ctx.createLinearGradient(0, 0, width, height);\n for (let i = 0; i < colors.length; i++) {\n const stop = colors.length === 1 ? 0 : i / (colors.length - 1);\n\n grd.addColorStop(stop, parseHex(colors[i]));\n }\n\n ctx.strokeStyle = grd;\n ctx.shadowColor = hexToRgba(parseHex(colors[0]), 0.55);\n ctx.shadowBlur = 18;\n ctx.lineWidth = thickness;\n ctx.beginPath();\n ctx.roundRect(thickness / 2, thickness / 2, width - thickness, height - thickness, [\n CORNER_RADIUS,\n ]);\n ctx.stroke();\n\n ctx.restore();\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport { withFallback } from \"../fonts.utils\";\nimport { PADDING } from \"./constants\";\nimport { hexToRgba } from \"./colorUtils\";\n\nexport function drawTrophyIcon(\n ctx: SKRSContext2D,\n x: number,\n y: number,\n size: number,\n color: string,\n): void {\n const s = size / 24;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 2.1 * s;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.arc(4 * s, 6.5 * s, 3 * s, Math.PI * 0.15, Math.PI * 1.85, false);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(20 * s, 6.5 * s, 3 * s, Math.PI * 1.15, Math.PI * 0.85, true);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(7 * s, 3 * s);\n ctx.lineTo(17 * s, 3 * s);\n ctx.lineTo(17 * s, 8 * s);\n ctx.quadraticCurveTo(17 * s, 14.5 * s, 12 * s, 14.5 * s);\n ctx.quadraticCurveTo(7 * s, 14.5 * s, 7 * s, 8 * s);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillRect(10.5 * s, 14.5 * s, 3 * s, 3.5 * s);\n\n ctx.beginPath();\n ctx.roundRect(6 * s, 18 * s, 12 * s, 3 * s, [1.5 * s]);\n ctx.fill();\n\n ctx.restore();\n}\n\nexport function drawHeader(\n ctx: SKRSContext2D,\n title: string,\n subtitle: string | undefined,\n accentColor: string,\n): void {\n const iconSize = 26;\n const iconY = PADDING + 2;\n\n drawTrophyIcon(ctx, PADDING, iconY, iconSize, accentColor);\n\n ctx.font = withFallback(\"30px Helvetica Bold\");\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#FFFFFF\";\n\n ctx.fillText(title, PADDING + iconSize + 14, PADDING + 30);\n\n if (subtitle) {\n ctx.font = withFallback(\"18px Helvetica\");\n ctx.fillStyle = hexToRgba(accentColor, 0.85);\n ctx.fillText(subtitle, PADDING, PADDING + 56);\n }\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { loadImage } from \"@napi-rs/canvas\";\n\nimport { abbreviateNumber, truncateText } from \"../strings.utils\";\nimport { parseHex } from \"../validations.utils\";\nimport { resolveCardColors } from \"../canvasShared.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport type { LeaderboardOptions } from \"../../@Types/index\";\nimport type {\n ResolvedLeaderboardEntry} from \"./constants\";\nimport {\n CARD_WIDTH,\n ROW_HEIGHT,\n PADDING,\n RANK_COLORS,\n DEFAULT_ACCENT\n} from \"./constants\";\nimport { hexToRgba } from \"./colorUtils\";\n\nexport async function drawRow(\n ctx: SKRSContext2D,\n resolved: ResolvedLeaderboardEntry,\n rowY: number,\n options: LeaderboardOptions,\n): Promise<void> {\n const { entry, data } = resolved;\n const { basicInfo, assets } = data;\n\n const rowColor =\n RANK_COLORS[entry.rank] ??\n (options?.accentColor ? parseHex(options.accentColor) : DEFAULT_ACCENT);\n const rowWidth = CARD_WIDTH - PADDING * 2;\n\n ctx.save();\n ctx.shadowColor = \"rgba(0, 0, 0, 0.35)\";\n ctx.shadowBlur = 16;\n ctx.shadowOffsetY = 6;\n ctx.fillStyle = \"rgba(18, 20, 26, 0.55)\";\n ctx.beginPath();\n ctx.roundRect(PADDING, rowY, rowWidth, ROW_HEIGHT, [20]);\n ctx.fill();\n ctx.restore();\n\n const rowGradient = ctx.createLinearGradient(0, rowY, 0, rowY + ROW_HEIGHT);\n\n rowGradient.addColorStop(0, hexToRgba(rowColor, 0.14));\n rowGradient.addColorStop(1, hexToRgba(rowColor, 0.05));\n\n ctx.fillStyle = rowGradient;\n ctx.beginPath();\n ctx.roundRect(PADDING, rowY, rowWidth, ROW_HEIGHT, [20]);\n ctx.fill();\n\n ctx.strokeStyle = hexToRgba(rowColor, 0.45);\n ctx.lineWidth = 1.25;\n ctx.beginPath();\n ctx.roundRect(PADDING + 0.75, rowY + 0.75, rowWidth - 1.5, ROW_HEIGHT - 1.5, [20]);\n ctx.stroke();\n\n const circleSize = 60;\n const circleY = rowY + (ROW_HEIGHT - circleSize) / 2;\n\n const rankX = PADDING + 22 + circleSize / 2;\n\n ctx.beginPath();\n ctx.arc(rankX, circleY + circleSize / 2, circleSize / 2, 0, Math.PI * 2);\n ctx.fillStyle = entry.rank <= 3 ? rowColor : hexToRgba(rowColor, 0.16);\n ctx.fill();\n\n if (entry.rank > 3) {\n ctx.strokeStyle = hexToRgba(rowColor, 0.8);\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(rankX, circleY + circleSize / 2, circleSize / 2 - 1, 0, Math.PI * 2);\n ctx.stroke();\n }\n\n ctx.font = withFallback(\"bold 24px Helvetica Bold\");\n ctx.textAlign = \"center\";\n ctx.fillStyle = entry.rank <= 3 ? \"#14151a\" : \"#f1f2f4\";\n ctx.fillText(`${entry.rank}`, rankX, circleY + circleSize / 2 + 8);\n\n const avatarX = PADDING + 22 + circleSize + 20;\n const avatarUrl = assets.avatarURL ?? assets.defaultAvatarURL;\n const avatarCx = avatarX + circleSize / 2;\n const avatarCy = circleY + circleSize / 2;\n\n if (entry.rank === 1) {\n const glow = ctx.createRadialGradient(\n avatarCx,\n avatarCy,\n circleSize / 2,\n avatarCx,\n avatarCy,\n circleSize,\n );\n\n glow.addColorStop(0, hexToRgba(rowColor, 0.35));\n glow.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, circleSize, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, circleSize / 2 + 3, 0, Math.PI * 2);\n ctx.strokeStyle = rowColor;\n ctx.lineWidth = 3;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, circleSize / 2, 0, Math.PI * 2);\n ctx.fillStyle = \"#292b2f\";\n ctx.fill();\n\n const avatarImage = await loadImage(avatarUrl).catch(() => undefined);\n\n if (avatarImage) {\n ctx.save();\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, circleSize / 2, 0, Math.PI * 2);\n ctx.clip();\n ctx.drawImage(avatarImage, avatarX, circleY, circleSize, circleSize);\n ctx.restore();\n }\n\n const levelText = `Nv. ${abbreviateNumber(entry.level)}`;\n\n ctx.font = withFallback(\"bold 17px Helvetica Bold\");\n\n const levelTextWidth = ctx.measureText(levelText).width;\n const pillPaddingX = 14;\n const pillWidth = levelTextWidth + pillPaddingX * 2;\n const pillHeight = 30;\n const pillX = CARD_WIDTH - PADDING - 16 - pillWidth;\n const pillY = rowY + 20;\n\n ctx.fillStyle = hexToRgba(rowColor, 0.16);\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, pillWidth, pillHeight, [pillHeight / 2]);\n ctx.fill();\n\n ctx.strokeStyle = hexToRgba(rowColor, 0.7);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, pillWidth, pillHeight, [pillHeight / 2]);\n ctx.stroke();\n\n ctx.font = withFallback(\"bold 17px Helvetica Bold\");\n ctx.textAlign = \"center\";\n ctx.fillStyle = options?.levelColor ? parseHex(options.levelColor) : \"#f1f2f4\";\n ctx.fillText(levelText, pillX + pillWidth / 2, pillY + pillHeight / 2 + 6);\n\n const textX = avatarX + circleSize + 22;\n const displayName = truncateText(basicInfo.globalName || basicInfo.username, 22);\n const maxNameWidth = pillX - 16 - textX;\n\n ctx.font = withFallback(\"21px Helvetica Bold\");\n ctx.textAlign = \"left\";\n ctx.fillStyle = options?.usernameColor ? parseHex(options.usernameColor) : \"#FFFFFF\";\n ctx.fillText(displayName, textX, rowY + 34, Math.max(maxNameWidth, 40));\n\n const barX = textX;\n const barWidth = CARD_WIDTH - PADDING - 16 - barX;\n const barY = rowY + 56;\n const barHeight = 16;\n\n ctx.fillStyle = \"rgba(0, 0, 0, 0.35)\";\n ctx.beginPath();\n ctx.roundRect(barX, barY, barWidth, barHeight, [barHeight / 2]);\n ctx.fill();\n\n const progress = entry.requiredXp > 0 ? Math.min(entry.currentXp / entry.requiredXp, 1) : 0;\n const minVisibleWidth = Math.min(barWidth, barHeight * 2.5);\n const filledWidth = progress > 0 ? Math.max(minVisibleWidth, Math.round(barWidth * progress)) : 0;\n\n const barColors = resolveCardColors({\n custom: options?.barColor,\n fallback: [rowColor, hexToRgba(rowColor, 0.6)],\n });\n\n const grd = ctx.createLinearGradient(barX, 0, barX + filledWidth, 0);\n\n for (let i = 0; i < barColors.length; i++) {\n const stop = barColors.length === 1 ? 0 : i / (barColors.length - 1);\n\n grd.addColorStop(stop, barColors[i].startsWith(\"rgba\") ? barColors[i] : parseHex(barColors[i]));\n }\n\n if (progress > 0) {\n ctx.save();\n ctx.fillStyle = grd;\n ctx.beginPath();\n ctx.roundRect(barX, barY, filledWidth, barHeight, [barHeight / 2]);\n ctx.fill();\n\n ctx.fillStyle = \"rgba(255, 255, 255, 0.35)\";\n ctx.beginPath();\n ctx.roundRect(barX + 3, barY + 2, Math.max(0, filledWidth - 6), barHeight * 0.28, [\n barHeight / 2,\n ]);\n ctx.fill();\n ctx.restore();\n }\n\n ctx.font = withFallback(\"bold 13px Helvetica\");\n ctx.textAlign = \"right\";\n ctx.fillStyle = hexToRgba(\"#f1f2f4\", 0.85);\n ctx.fillText(\n `${abbreviateNumber(entry.currentXp)} / ${abbreviateNumber(entry.requiredXp)} XP`,\n barX + barWidth,\n barY + barHeight + 16,\n );\n}\n","import { ensureFontsRegistered } from \"../fonts.utils\";\n\nensureFontsRegistered();\n\nexport {\n CARD_WIDTH,\n ROW_HEIGHT,\n ROW_GAP,\n PADDING,\n CORNER_RADIUS,\n RANK_COLORS,\n DEFAULT_ACCENT,\n DEFAULT_ROW_BASE,\n ResolvedLeaderboardEntry,\n} from \"./constants\";\nexport { hexToRgb, hexToRgba } from \"./colorUtils\";\nexport { getHeaderHeight, getCardHeight, createLeaderboardCanvas } from \"./dimensions\";\nexport { drawCardBackground, drawCardBorder } from \"./background\";\nexport { drawTrophyIcon, drawHeader } from \"./header\";\nexport { drawRow } from \"./row\";\n","import { ensureFontsRegistered } from \"./fonts.utils\";\nimport { parseHex } from \"./validations.utils\";\nimport { encodeCanvas } from \"./output.utils\";\nimport type { LeaderboardOptions } from \"../@Types/index\";\nimport type {\n ResolvedLeaderboardEntry} from \"./LeaderboardImage/index\";\nimport {\n CARD_WIDTH,\n DEFAULT_ACCENT,\n PADDING,\n ROW_GAP,\n ROW_HEIGHT,\n createLeaderboardCanvas,\n drawCardBackground,\n drawCardBorder,\n drawHeader,\n drawRow,\n getCardHeight,\n getHeaderHeight,\n} from \"./LeaderboardImage/index\";\n\nensureFontsRegistered();\n\nexport async function genLeaderboardPng(\n resolvedEntries: ResolvedLeaderboardEntry[],\n options: LeaderboardOptions,\n borderColors: string[],\n): Promise<Buffer> {\n const hasTitle = Boolean(options?.title);\n const hasSubtitle = Boolean(options?.subtitle);\n const height = getCardHeight(resolvedEntries.length, hasTitle, hasSubtitle);\n\n const { canvas, ctx } = createLeaderboardCanvas(height);\n\n const accentColor = options?.accentColor ? parseHex(options.accentColor) : DEFAULT_ACCENT;\n\n await drawCardBackground(ctx, CARD_WIDTH, height, options?.backgroundImage, accentColor);\n\n if (borderColors.length > 0) {\n drawCardBorder(ctx, CARD_WIDTH, height, borderColors);\n }\n\n if (hasTitle) {\n drawHeader(ctx, options.title as string, options.subtitle, accentColor);\n }\n\n const startY = PADDING + getHeaderHeight(hasTitle, hasSubtitle);\n\n for (let i = 0; i < resolvedEntries.length; i++) {\n const rowY = startY + i * (ROW_HEIGHT + ROW_GAP);\n await drawRow(ctx, resolvedEntries[i], rowY, options);\n }\n\n return encodeCanvas(canvas, options?.output);\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genLeaderboardPng } from \"../Utils/leaderboardImage.output.utils\";\nimport { resolveCardColors } from \"../Utils/canvasShared.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { ResolvedLeaderboardEntry} from \"../Utils/LeaderboardImage/index\";\nimport { DEFAULT_ACCENT } from \"../Utils/LeaderboardImage/index\";\nimport type { LeaderboardEntry, LeaderboardOptions} from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nconst DEFAULT_MAX_ENTRIES = 5;\nconst HARD_MAX_ENTRIES = 15;\n\nexport async function leaderboardImage(\n entries: LeaderboardEntry[],\n options: LeaderboardOptions = {},\n): Promise<Buffer> {\n if (!Array.isArray(entries) || entries.length === 0) {\n throw new KiraError(\n \"leaderboardImage() expects a non-empty array of LeaderboardEntry\",\n KiraErrorCode.Validation,\n );\n }\n\n const requestedMax = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n\n if (!Number.isFinite(requestedMax) || requestedMax < 1) {\n throw new KiraError(\n `Invalid maxEntries (${options.maxEntries}), must be a number between 1 and ${HARD_MAX_ENTRIES}`,\n KiraErrorCode.Validation,\n );\n }\n const maxEntries = Math.min(requestedMax, HARD_MAX_ENTRIES);\n\n const topEntries = entries.slice(0, maxEntries);\n\n for (const entry of topEntries) {\n if (!entry?.userId || typeof entry.userId !== \"string\") {\n throw new KiraError(\n \"Every leaderboard entry requires a valid userId\",\n KiraErrorCode.Validation,\n );\n }\n\n if (\n typeof entry.currentXp !== \"number\" ||\n typeof entry.requiredXp !== \"number\" ||\n typeof entry.level !== \"number\" ||\n !Number.isFinite(entry.currentXp) ||\n !Number.isFinite(entry.requiredXp) ||\n !Number.isFinite(entry.level)\n ) {\n throw new KiraError(\n `Invalid leaderboard entry for userId (${entry.userId}): currentXp, requiredXp and level are required numbers`,\n KiraErrorCode.Validation,\n );\n }\n }\n\n const resolvedEntries: ResolvedLeaderboardEntry[] = await Promise.all(\n topEntries.map(async (entry, index) => {\n const data = await fetchUserData(entry.userId, options.guildId, options.bypassCache);\n\n return {\n entry: { ...entry, rank: entry.rank ?? index + 1 },\n data,\n };\n }),\n );\n\n try {\n const palette = getThemePalette(options.theme);\n const accentColor = options.accentColor ?? palette?.accentColor ?? DEFAULT_ACCENT;\n const topEntryData = resolvedEntries[0]?.data;\n\n const borderColors = resolveCardColors({\n custom: options.borderColor,\n removeBorder: options.removeBorder,\n useNitroTheme: options.useNitroTheme,\n nitroColors: topEntryData?.decoration.profileColors,\n useRoleColor: options.useRoleColor,\n roleColor: topEntryData?.decoration.roleColor,\n fallback: palette?.borderColor ?? [accentColor],\n });\n\n const resolvedOptions: LeaderboardOptions = {\n ...options,\n accentColor,\n usernameColor: options.usernameColor ?? palette?.usernameColor,\n levelColor: options.levelColor ?? palette?.levelColor,\n barColor: options.barColor ?? palette?.barColor,\n };\n\n return await genLeaderboardPng(resolvedEntries, resolvedOptions, borderColors);\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","import type { KiraBadge, KiraServerTag } from \"../../@Types/index\";\n\nexport const CARD_WIDTH = 700;\nexport const CORNER_RADIUS = 28;\nexport const BANNER_HEIGHT = 170;\nexport const BASE_AVATAR_SIZE = 172;\nexport const AVATAR_BORDER = 6;\n\nexport type TextEffect = \"none\" | \"shadow\" | \"glow\";\n\nexport interface MemberEventLayout {\n message?: string;\n memberCount?: number;\n dateText?: string;\n accentColor: string;\n borderColors: string[];\n usernameColor?: string;\n messageColor?: string;\n customBackground?: string;\n fontScale?: number;\n avatarFrameUrl?: string | null;\n avatarBorderColor?: string;\n serverTag?: KiraServerTag | null;\n badges?: KiraBadge[];\n maxBadges?: number;\n usernameEffect?: TextEffect;\n messageEffect?: TextEffect;\n glowColor?: string;\n}\n","import { createCanvas } from \"@napi-rs/canvas\";\n\nimport type { MemberEventLayout } from \"./constants\";\nimport { CARD_WIDTH, BANNER_HEIGHT, BASE_AVATAR_SIZE } from \"./constants\";\n\nexport function normalizeFontScale(fontScale?: number): number {\n return fontScale && fontScale > 0 ? fontScale : 1;\n}\n\nexport function computeAvatarSize(fontScale: number): number {\n const scale = 1 + (fontScale - 1) * 0.3;\n return Math.round(BASE_AVATAR_SIZE * scale);\n}\n\nexport function computeBodyHeight(\n hasMessage: boolean,\n hasMemberCount: boolean,\n hasDate: boolean,\n fontScale: number,\n): number {\n let h = 40 * fontScale;\n h += 38 * fontScale;\n if (hasMessage) h += 30 * fontScale;\n if (hasMemberCount) h += 28 * fontScale;\n if (hasDate) h += 24 * fontScale;\n h += 28;\n return h;\n}\n\nexport function getCardDimensions(layout: MemberEventLayout): { width: number; height: number } {\n const hasMessage = Boolean(layout.message);\n const hasMemberCount = layout.memberCount != null;\n const hasDate = Boolean(layout.dateText);\n\n const fontScale = normalizeFontScale(layout.fontScale);\n const avatarSize = computeAvatarSize(fontScale);\n const bodyHeight = computeBodyHeight(hasMessage, hasMemberCount, hasDate, fontScale);\n const height = Math.round(BANNER_HEIGHT + avatarSize / 2 + bodyHeight);\n\n const baseAvatarSize = computeAvatarSize(1);\n const baseBodyHeight = computeBodyHeight(hasMessage, hasMemberCount, hasDate, 1);\n const baseHeight = BANNER_HEIGHT + baseAvatarSize / 2 + baseBodyHeight;\n\n const aspectRatio = CARD_WIDTH / baseHeight;\n const width = Math.round(height * aspectRatio);\n\n return { width, height };\n}\n\nexport function createMemberEventCanvas(width: number, height: number) {\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n return { canvas, ctx };\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { loadImage } from \"@napi-rs/canvas\";\n\nimport { drawCoverImage, drawGradientBorder, hexToRgba } from \"../canvasShared.utils\";\nimport { parseHex } from \"../validations.utils\";\nimport { truncateText } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport type {\n MemberEventLayout} from \"./constants\";\nimport {\n CORNER_RADIUS,\n BANNER_HEIGHT,\n BASE_AVATAR_SIZE,\n AVATAR_BORDER\n} from \"./constants\";\nimport { normalizeFontScale, computeAvatarSize } from \"./dimensions\";\nimport { applyTextEffect } from \"./textEffects\";\nimport { drawServerTagPill, drawBadgesPill } from \"./pills\";\n\nexport async function drawMemberEventCard(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n avatarUrl: string,\n username: string,\n layout: MemberEventLayout,\n): Promise<void> {\n const fontScale = normalizeFontScale(layout.fontScale);\n const avatarSize = computeAvatarSize(fontScale);\n const avatarBorder = Math.max(4, Math.round(AVATAR_BORDER * (avatarSize / BASE_AVATAR_SIZE)));\n const avatarBorderColor = layout.avatarBorderColor\n ? parseHex(layout.avatarBorderColor)\n : layout.accentColor;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, [CORNER_RADIUS]);\n ctx.clip();\n\n ctx.fillStyle = \"#111318\";\n ctx.fillRect(0, 0, width, height);\n\n const bannerImage = layout.customBackground\n ? await loadImage(layout.customBackground).catch(() => undefined)\n : undefined;\n\n if (bannerImage) {\n drawCoverImage(ctx, bannerImage, 0, 0, width, height);\n\n const overlay = ctx.createLinearGradient(0, 0, 0, height);\n overlay.addColorStop(0, \"rgba(8, 9, 12, 0.1)\");\n overlay.addColorStop(0.3, \"rgba(8, 9, 12, 0.3)\");\n overlay.addColorStop(0.55, \"rgba(13, 15, 20, 0.55)\");\n overlay.addColorStop(1, \"rgba(13, 15, 20, 0.9)\");\n ctx.fillStyle = overlay;\n ctx.fillRect(0, 0, width, height);\n } else {\n const grd = ctx.createLinearGradient(0, 0, width, BANNER_HEIGHT);\n grd.addColorStop(0, hexToRgba(layout.accentColor, 0.85));\n grd.addColorStop(1, hexToRgba(layout.accentColor, 0.3));\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, BANNER_HEIGHT);\n }\n\n if (layout.serverTag) {\n await drawServerTagPill(ctx, layout.serverTag);\n }\n\n if (layout.badges?.length) {\n await drawBadgesPill(ctx, width, layout.badges, layout.maxBadges ?? 3);\n }\n\n const avatarCx = width / 2;\n const avatarCy = BANNER_HEIGHT;\n const outerRadius = avatarSize / 2 + avatarBorder;\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, outerRadius, 0, Math.PI * 2);\n ctx.fillStyle = \"#111318\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, outerRadius - avatarBorder / 2, 0, Math.PI * 2);\n ctx.strokeStyle = avatarBorderColor;\n ctx.lineWidth = avatarBorder;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, avatarSize / 2, 0, Math.PI * 2);\n ctx.fillStyle = \"#292b2f\";\n ctx.fill();\n\n const avatarImage = await loadImage(avatarUrl).catch(() => undefined);\n if (avatarImage) {\n ctx.save();\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, avatarSize / 2, 0, Math.PI * 2);\n ctx.clip();\n ctx.drawImage(\n avatarImage,\n avatarCx - avatarSize / 2,\n avatarCy - avatarSize / 2,\n avatarSize,\n avatarSize,\n );\n ctx.restore();\n }\n\n const avatarFrameImage = layout.avatarFrameUrl\n ? await loadImage(layout.avatarFrameUrl).catch(() => undefined)\n : undefined;\n\n if (avatarFrameImage) {\n const frameSize = avatarSize * 1.2;\n ctx.drawImage(\n avatarFrameImage,\n avatarCx - frameSize / 2,\n avatarCy - frameSize / 2,\n frameSize,\n frameSize,\n );\n }\n\n let cursorY = BANNER_HEIGHT + avatarSize / 2 + 44 * fontScale;\n const glowColor = layout.glowColor ? parseHex(layout.glowColor) : layout.accentColor;\n\n ctx.textAlign = \"center\";\n applyTextEffect(ctx, layout.usernameEffect, glowColor);\n ctx.font = withFallback(`${Math.round(30 * fontScale)}px Helvetica Bold`);\n ctx.fillStyle = layout.usernameColor ? parseHex(layout.usernameColor) : \"#FFFFFF\";\n ctx.fillText(truncateText(username, 24), width / 2, cursorY);\n\n if (layout.message) {\n cursorY += 32 * fontScale;\n applyTextEffect(ctx, layout.messageEffect, glowColor);\n ctx.font = withFallback(`${Math.round(18 * fontScale)}px Helvetica`);\n ctx.fillStyle = layout.messageColor\n ? parseHex(layout.messageColor)\n : \"rgba(255, 255, 255, 0.85)\";\n ctx.fillText(truncateText(layout.message, 64), width / 2, cursorY);\n }\n\n applyTextEffect(ctx, \"none\", glowColor);\n\n if (layout.memberCount != null) {\n cursorY += 30 * fontScale;\n ctx.font = withFallback(`bold ${Math.round(16 * fontScale)}px Helvetica Bold`);\n ctx.fillStyle = hexToRgba(layout.accentColor, 1);\n ctx.fillText(`Miembro #${layout.memberCount}`, width / 2, cursorY);\n }\n\n if (layout.dateText) {\n cursorY += 26 * fontScale;\n ctx.font = withFallback(`${Math.round(14 * fontScale)}px Helvetica`);\n ctx.fillStyle = \"rgba(255, 255, 255, 0.5)\";\n ctx.fillText(layout.dateText, width / 2, cursorY);\n }\n\n ctx.restore();\n\n if (layout.borderColors.length > 0) {\n drawGradientBorder(ctx, width, height, layout.borderColors, CORNER_RADIUS);\n }\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport type { TextEffect } from \"./constants\";\n\nexport function applyTextEffect(\n ctx: SKRSContext2D,\n effect: TextEffect | undefined,\n glowColor: string,\n): void {\n if (effect === \"shadow\") {\n ctx.shadowColor = \"rgba(0, 0, 0, 0.65)\";\n ctx.shadowBlur = 6;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 3;\n } else if (effect === \"glow\") {\n ctx.shadowColor = glowColor;\n ctx.shadowBlur = 20;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n } else {\n ctx.shadowColor = \"transparent\";\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { loadImage } from \"@napi-rs/canvas\";\n\nimport { truncateText } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport type { KiraBadge, KiraServerTag } from \"../../@Types/index\";\n\nexport async function drawServerTagPill(\n ctx: SKRSContext2D,\n serverTag: KiraServerTag,\n): Promise<void> {\n const text = truncateText(serverTag.text, 12);\n const iconSize = serverTag.badgeURL ? 18 : 0;\n const paddingX = 10;\n const pillHeight = 26;\n const gap = iconSize ? 6 : 0;\n\n ctx.font = withFallback(\"13px Helvetica Bold\");\n const textWidth = ctx.measureText(text).width;\n const pillWidth = paddingX * 2 + iconSize + gap + textWidth;\n const pillX = 16;\n const pillY = 16;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, pillWidth, pillHeight, [pillHeight / 2]);\n ctx.fillStyle = \"rgba(10, 10, 14, 0.55)\";\n ctx.fill();\n ctx.restore();\n\n let cursorX = pillX + paddingX;\n\n if (iconSize && serverTag.badgeURL) {\n const badgeImage = await loadImage(serverTag.badgeURL).catch((_error: unknown) => {\n return undefined;\n });\n\n if (badgeImage) {\n ctx.drawImage(badgeImage, cursorX, pillY + (pillHeight - iconSize) / 2, iconSize, iconSize);\n cursorX += iconSize + gap;\n }\n }\n\n ctx.textAlign = \"left\";\n ctx.fillStyle = \"#ffffff\";\n ctx.font = withFallback(\"13px Helvetica Bold\");\n ctx.fillText(text, cursorX, pillY + pillHeight / 2 + 4);\n}\n\nexport async function drawBadgesPill(\n ctx: SKRSContext2D,\n width: number,\n badges: KiraBadge[],\n maxBadges: number,\n iconSize = 20,\n pillHeight = 32,\n): Promise<void> {\n const shown = badges.slice(0, maxBadges > 0 ? maxBadges : 3);\n if (!shown.length) return;\n\n const gap = Math.round(iconSize * 0.3);\n const paddingX = Math.round(iconSize * 0.5);\n const totalIconsWidth = shown.length * iconSize + (shown.length - 1) * gap;\n const pillWidth = paddingX * 2 + totalIconsWidth;\n const pillX = width - 16 - pillWidth;\n const pillY = 16;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, pillWidth, pillHeight, [pillHeight / 2]);\n ctx.fillStyle = \"rgba(10, 10, 14, 0.55)\";\n ctx.fill();\n ctx.restore();\n\n let cursorX = pillX + paddingX;\n\n for (const badge of shown) {\n const badgeImage = await loadImage(badge.icon).catch(() => undefined);\n\n if (badgeImage) {\n ctx.drawImage(badgeImage, cursorX, pillY + (pillHeight - iconSize) / 2, iconSize, iconSize);\n }\n\n cursorX += iconSize + gap;\n }\n}\n","import \"./profileImage.output.utils\";\n\nimport type {\n MemberEventLayout} from \"./MemberEeventCard/index\";\nimport {\n createMemberEventCanvas,\n drawMemberEventCard,\n getCardDimensions,\n} from \"./MemberEeventCard/index\";\nimport { encodeCanvas } from \"./output.utils\";\nimport type { OutputOptions } from \"../@Types/index\";\n\nexport async function genMemberEventPng(\n avatarUrl: string,\n username: string,\n layout: MemberEventLayout,\n output?: OutputOptions,\n): Promise<Buffer> {\n const { width, height } = getCardDimensions(layout);\n const { canvas, ctx } = createMemberEventCanvas(width, height);\n\n await drawMemberEventCard(ctx, width, height, avatarUrl, username, layout);\n\n return encodeCanvas(canvas, output);\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genMemberEventPng } from \"../Utils/memberEventCard.output.utils\";\nimport { parseHex } from \"../Utils/validations.utils\";\nimport { resolveCardColors } from \"../Utils/canvasShared.utils\";\nimport { getDateOrString } from \"../Utils/strings.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { MemberEventLayout } from \"../Utils/MemberEeventCard/index\";\nimport type { MemberEventOptions} from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nconst DEFAULT_ACCENT = \"#2DD4BF\";\n\nfunction formatMessage(\n template: string,\n username: string,\n guildName: string,\n memberCount?: number,\n): string {\n return template\n .replace(/\\{username\\}/g, username)\n .replace(/\\{user\\}/g, username)\n .replace(/\\{server\\}/g, guildName)\n .replace(/\\{memberCount\\}/g, memberCount != null ? String(memberCount) : \"\");\n}\n\nexport async function renderMemberEventCard(\n userId: string,\n guildName: string,\n defaultMessage: string,\n options: MemberEventOptions = {},\n): Promise<Buffer> {\n if (!userId || typeof userId !== \"string\") {\n throw new KiraError(\"A valid userId is required\", KiraErrorCode.Validation);\n }\n\n if (!guildName || typeof guildName !== \"string\") {\n throw new KiraError(\"A valid guildName is required\", KiraErrorCode.Validation);\n }\n\n const data = await fetchUserData(userId, options.guildId, options.bypassCache);\n const username = data.basicInfo.globalName || data.basicInfo.username;\n const avatarUrl = data.assets.avatarURL ?? data.assets.defaultAvatarURL;\n\n const palette = getThemePalette(options.theme);\n const accentColor = options.accentColor\n ? parseHex(options.accentColor)\n : palette?.accentColor\n ? parseHex(palette.accentColor)\n : DEFAULT_ACCENT;\n\n const borderColors = resolveCardColors({\n custom: options.borderColor,\n removeBorder: options.removeBorder,\n useNitroTheme: options.useNitroTheme,\n nitroColors: data.decoration.profileColors,\n useRoleColor: options.useRoleColor,\n roleColor: data.decoration.roleColor,\n fallback: palette?.borderColor ?? [accentColor],\n });\n\n const rawMessage = options.message ?? defaultMessage;\n const message = formatMessage(rawMessage, username, guildName, options.memberCount);\n\n const dateText = options.showDate\n ? getDateOrString(options.date, Date.now(), options.localDateType ?? \"es\")\n : undefined;\n\n const fontScale = options.fontScale && options.fontScale > 0 ? options.fontScale : 1;\n const avatarFrameUrl = options.showAvatarDecoration ? data.decoration.avatarFrame : null;\n const serverTag = options.showServerTag ? data.decoration.serverTag : null;\n const badges = options.showBadges ? data.assets.badges : undefined;\n\n const layout: MemberEventLayout = {\n message,\n memberCount: options.memberCount,\n dateText,\n accentColor,\n borderColors,\n usernameColor: options.usernameColor ?? palette?.usernameColor,\n messageColor: options.messageColor ?? palette?.messageColor,\n customBackground: options.customBackground,\n fontScale,\n avatarFrameUrl,\n avatarBorderColor: options.avatarBorderColor,\n serverTag,\n badges,\n maxBadges: options.maxBadges,\n usernameEffect: options.usernameEffect,\n messageEffect: options.messageEffect,\n glowColor: options.glowColor ?? palette?.glowColor,\n };\n\n try {\n return await genMemberEventPng(avatarUrl, username, layout, options.output);\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","import { renderMemberEventCard } from \"./memberEvent\";\nimport type { MemberEventOptions } from \"../@Types/index\";\n\nconst DEFAULT_WELCOME_MESSAGE = \"ยกWelcome to {server}!\";\n\nexport async function welcomeImage(\n userId: string,\n guildName: string,\n options: MemberEventOptions = {},\n): Promise<Buffer> {\n return renderMemberEventCard(userId, guildName, DEFAULT_WELCOME_MESSAGE, options);\n}\n","import { renderMemberEventCard } from \"./memberEvent\";\nimport type { MemberEventOptions } from \"../@Types/index\";\n\nconst DEFAULT_LEAVE_MESSAGE = \"{username} has left {server}.\";\n\nexport async function leaveImage(\n userId: string,\n guildName: string,\n options: MemberEventOptions = {},\n): Promise<Buffer> {\n return renderMemberEventCard(userId, guildName, DEFAULT_LEAVE_MESSAGE, options);\n}\n","import type { KiraBadge } from \"../../@Types/index\";\n\nexport const CARD_WIDTH = 700;\nexport const CARD_HEIGHT = 260;\nexport const CORNER_RADIUS = 26;\nexport const AVATAR_SIZE = 128;\nexport const AVATAR_BORDER = 5;\n\nexport interface LevelUpLayout {\n username: string;\n avatarUrl: string;\n level: number;\n currentXp?: number;\n requiredXp?: number;\n message?: string;\n accentColor: string;\n borderColors: string[];\n barColors: string[];\n barBackgroundColor?: string;\n levelColor?: string;\n usernameColor?: string;\n messageColor?: string;\n kickerColor?: string;\n xpColor?: string;\n customBackground?: string;\n backgroundTint?: boolean;\n avatarBorderColor?: string;\n avatarFrameUrl?: string | null;\n badges?: KiraBadge[];\n maxBadges?: number;\n}\n","import { createCanvas } from \"@napi-rs/canvas\";\n\nimport { CARD_WIDTH, CARD_HEIGHT } from \"./constants\";\n\nexport function getCardDimensions(): { width: number; height: number } {\n return { width: CARD_WIDTH, height: CARD_HEIGHT };\n}\n\nexport function createLevelUpCanvas(width: number, height: number) {\n const canvas = createCanvas(width, height);\n\n const ctx = canvas.getContext(\"2d\");\n\n return { canvas, ctx };\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport { hexToRgba } from \"../canvasShared.utils\";\nimport { withFallback } from \"../fonts.utils\";\n\nexport function drawSparkle(\n ctx: SKRSContext2D,\n cx: number,\n cy: number,\n size: number,\n opacity: number,\n color: string,\n): void {\n ctx.save();\n ctx.translate(cx, cy);\n ctx.fillStyle = hexToRgba(color, opacity);\n ctx.beginPath();\n ctx.moveTo(0, -size);\n ctx.quadraticCurveTo(size * 0.18, -size * 0.18, size, 0);\n ctx.quadraticCurveTo(size * 0.18, size * 0.18, 0, size);\n ctx.quadraticCurveTo(-size * 0.18, size * 0.18, -size, 0);\n ctx.quadraticCurveTo(-size * 0.18, -size * 0.18, 0, -size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nexport function drawSparkles(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n color: string,\n): void {\n const spots: Array<[number, number, number, number]> = [\n [width * 0.31, height * 0.28, 5, 0.55],\n [width * 0.37, height * 0.68, 3.5, 0.4],\n [width * 0.62, height * 0.24, 4, 0.45],\n [width * 0.67, height * 0.7, 6, 0.5],\n [width * 0.5, height * 0.16, 3, 0.35],\n ];\n\n for (const [x, y, size, opacity] of spots) {\n drawSparkle(ctx, x, y, size, opacity, color);\n }\n}\n\nexport function drawConnector(\n ctx: SKRSContext2D,\n fromX: number,\n toX: number,\n y: number,\n color: string,\n): void {\n ctx.save();\n ctx.strokeStyle = hexToRgba(color, 0.4);\n ctx.lineWidth = 2;\n ctx.setLineDash([1, 7]);\n ctx.lineCap = \"round\";\n ctx.beginPath();\n ctx.moveTo(fromX, y);\n ctx.lineTo(toX, y);\n ctx.stroke();\n ctx.restore();\n}\n\nexport function drawShipNamePill(\n ctx: SKRSContext2D,\n width: number,\n shipName: string,\n color: string,\n): void {\n const safeName = shipName\n .normalize(\"NFKD\")\n .replace(/[^\\p{L}\\p{N}\\s]/gu, \"\")\n .trim();\n if (!safeName) return;\n\n ctx.save();\n ctx.font = withFallback(\"bold 15px Helvetica Bold\");\n const paddingX = 16;\n const textWidth = ctx.measureText(safeName).width;\n const pillWidth = textWidth + paddingX * 2;\n const pillHeight = 30;\n const x = width - 24 - pillWidth;\n const y = 18;\n\n ctx.beginPath();\n ctx.roundRect(x, y, pillWidth, pillHeight, [pillHeight / 2]);\n const grd = ctx.createLinearGradient(x, y, x + pillWidth, y);\n grd.addColorStop(0, hexToRgba(color, 0.9));\n grd.addColorStop(1, hexToRgba(color, 0.55));\n ctx.fillStyle = grd;\n ctx.fill();\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.35)\";\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = \"#FFFFFF\";\n ctx.shadowColor = \"rgba(0, 0, 0, 0.35)\";\n ctx.shadowBlur = 4;\n ctx.fillText(safeName, x + pillWidth / 2, y + pillHeight / 2 + 1);\n ctx.restore();\n}\n\nexport function drawVignette(ctx: SKRSContext2D, width: number, height: number): void {\n const grd = ctx.createRadialGradient(\n width / 2,\n height / 2,\n height * 0.25,\n width / 2,\n height / 2,\n Math.max(width, height) * 0.75,\n );\n grd.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n grd.addColorStop(1, \"rgba(0, 0, 0, 0.45)\");\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, height);\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport {\n drawCoverImage,\n drawGradientBorder,\n hexToRgba,\n loadImageSafe,\n} from \"../canvasShared.utils\";\nimport { parseHex } from \"../validations.utils\";\nimport { truncateText, abbreviateNumber } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport { drawBadgesPill } from \"../MemberEeventCard/pills\";\nimport { drawSparkles } from \"../ShipCard/decorations\";\nimport type { LevelUpLayout } from \"./constants\";\nimport { CORNER_RADIUS, AVATAR_SIZE, AVATAR_BORDER } from \"./constants\";\n\nexport async function drawLevelUpCard(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n layout: LevelUpLayout,\n): Promise<void> {\n const accentColor = parseHex(layout.accentColor);\n const avatarBorderColor = layout.avatarBorderColor\n ? parseHex(layout.avatarBorderColor)\n : accentColor;\n const kickerColor = layout.kickerColor ? parseHex(layout.kickerColor) : \"#FFFFFF\";\n const levelColor = layout.levelColor ? parseHex(layout.levelColor) : \"#FFFFFF\";\n const usernameColor = layout.usernameColor ? parseHex(layout.usernameColor) : \"#FFFFFF\";\n const xpColor = layout.xpColor ? parseHex(layout.xpColor) : \"rgba(255, 255, 255, 0.75)\";\n const barBackgroundColor = layout.barBackgroundColor\n ? parseHex(layout.barBackgroundColor)\n : \"rgba(0, 0, 0, 0.35)\";\n const backgroundTint = layout.backgroundTint !== false;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, [CORNER_RADIUS]);\n ctx.clip();\n\n ctx.fillStyle = \"#0c0d11\";\n ctx.fillRect(0, 0, width, height);\n\n const backgroundImage = await loadImageSafe(layout.customBackground);\n\n if (backgroundImage) {\n drawCoverImage(ctx, backgroundImage, 0, 0, width, height);\n\n ctx.fillStyle = \"rgba(8, 9, 13, 0.6)\";\n ctx.fillRect(0, 0, width, height);\n\n if (backgroundTint) {\n const duotone = ctx.createLinearGradient(0, 0, width, height);\n\n duotone.addColorStop(0, hexToRgba(accentColor, 0.35));\n duotone.addColorStop(1, \"rgba(8, 9, 13, 0.45)\");\n\n ctx.fillStyle = duotone;\n ctx.fillRect(0, 0, width, height);\n }\n } else if (backgroundTint) {\n const grd = ctx.createLinearGradient(0, 0, width, height);\n\n grd.addColorStop(0, hexToRgba(accentColor, 0.38));\n grd.addColorStop(0.55, \"rgba(18, 15, 24, 1)\");\n grd.addColorStop(1, \"rgba(10, 11, 15, 1)\");\n\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, height);\n\n const bgGlow = ctx.createRadialGradient(\n width * 0.18,\n height / 2,\n 10,\n width * 0.18,\n height / 2,\n width * 0.45,\n );\n\n bgGlow.addColorStop(0, hexToRgba(accentColor, 0.4));\n bgGlow.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n\n ctx.fillStyle = bgGlow;\n ctx.fillRect(0, 0, width, height);\n } else {\n const grd = ctx.createLinearGradient(0, 0, width, height);\n\n grd.addColorStop(0, \"rgba(30, 30, 34, 1)\");\n grd.addColorStop(1, \"rgba(10, 11, 15, 1)\");\n\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, height);\n }\n\n drawSparkles(ctx, width, height, accentColor);\n\n if (layout.badges?.length) {\n await drawBadgesPill(ctx, width, layout.badges, layout.maxBadges ?? 3, 30, 46);\n }\n\n const hasMessage = Boolean(layout.message);\n const hasBar = layout.currentXp != null && layout.requiredXp != null && layout.requiredXp > 0;\n\n const avatarCx = 104;\n const avatarCy = height / 2;\n const outerRadius = AVATAR_SIZE / 2 + AVATAR_BORDER;\n\n if (backgroundTint) {\n const avatarGlow = ctx.createRadialGradient(\n avatarCx,\n avatarCy,\n outerRadius * 0.6,\n avatarCx,\n avatarCy,\n outerRadius * 1.8,\n );\n avatarGlow.addColorStop(0, hexToRgba(avatarBorderColor, 0.35));\n avatarGlow.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n ctx.fillStyle = avatarGlow;\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, outerRadius * 1.8, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, outerRadius, 0, Math.PI * 2);\n ctx.fillStyle = \"#111318\";\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, outerRadius - AVATAR_BORDER / 2, 0, Math.PI * 2);\n ctx.strokeStyle = avatarBorderColor;\n ctx.lineWidth = AVATAR_BORDER;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, AVATAR_SIZE / 2, 0, Math.PI * 2);\n ctx.fillStyle = \"#292b2f\";\n ctx.fill();\n\n const avatarImage = await loadImageSafe(layout.avatarUrl);\n\n if (avatarImage) {\n ctx.save();\n ctx.beginPath();\n ctx.arc(avatarCx, avatarCy, AVATAR_SIZE / 2, 0, Math.PI * 2);\n ctx.clip();\n ctx.drawImage(\n avatarImage,\n avatarCx - AVATAR_SIZE / 2,\n avatarCy - AVATAR_SIZE / 2,\n AVATAR_SIZE,\n AVATAR_SIZE,\n );\n ctx.restore();\n }\n\n const avatarFrameImage = await loadImageSafe(layout.avatarFrameUrl ?? undefined);\n\n if (avatarFrameImage) {\n const frameSize = AVATAR_SIZE * 1.2;\n\n ctx.drawImage(\n avatarFrameImage,\n avatarCx - frameSize / 2,\n avatarCy - frameSize / 2,\n frameSize,\n frameSize,\n );\n }\n\n const contentX = 196;\n const contentWidth = width - contentX - 40;\n\n type Row = {\n kind: \"kicker\" | \"username\" | \"pill\" | \"message\" | \"bar\";\n height: number;\n gapBefore: number;\n };\n\n const rows: Row[] = [\n { kind: \"kicker\", height: 16, gapBefore: 0 },\n { kind: \"username\", height: 38, gapBefore: 10 },\n { kind: \"pill\", height: 30, gapBefore: 10 },\n ];\n\n if (hasMessage) rows.push({ kind: \"message\", height: 18, gapBefore: 14 });\n if (hasBar) rows.push({ kind: \"bar\", height: 16, gapBefore: hasMessage ? 20 : 24 });\n\n const totalHeight = rows.reduce((sum, row) => sum + row.gapBefore + row.height, 0);\n\n let rowTop = avatarCy - totalHeight / 2;\n\n ctx.textAlign = \"left\";\n\n for (const row of rows) {\n rowTop += row.gapBefore;\n const centerY = rowTop + row.height / 2;\n\n if (row.kind === \"kicker\") {\n ctx.font = withFallback(\"bold 14px Helvetica Bold\");\n ctx.fillStyle = hexToRgba(kickerColor, 1);\n ctx.save();\n ctx.textBaseline = \"middle\";\n ctx.fillText(\"LEVELED UP\", contentX, centerY);\n ctx.restore();\n } else if (row.kind === \"username\") {\n ctx.font = withFallback(\"bold 34px Helvetica Bold\");\n ctx.fillStyle = usernameColor;\n ctx.save();\n ctx.textBaseline = \"middle\";\n ctx.fillText(truncateText(layout.username, 22), contentX, centerY, contentWidth);\n ctx.restore();\n } else if (row.kind === \"pill\") {\n const levelPillText = `LEVEL ${layout.level}`;\n ctx.font = withFallback(\"bold 16px Helvetica Bold\");\n const levelPillTextWidth = ctx.measureText(levelPillText).width;\n const levelPillPaddingX = 16;\n const levelPillWidth = levelPillTextWidth + levelPillPaddingX * 2;\n\n const pillFill = ctx.createLinearGradient(contentX, rowTop, contentX, rowTop + row.height);\n pillFill.addColorStop(0, hexToRgba(levelColor, 0.24));\n pillFill.addColorStop(1, hexToRgba(levelColor, 0.12));\n ctx.fillStyle = pillFill;\n ctx.beginPath();\n ctx.roundRect(contentX, rowTop, levelPillWidth, row.height, [row.height / 2]);\n ctx.fill();\n\n ctx.strokeStyle = hexToRgba(levelColor, 0.8);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.roundRect(contentX, rowTop, levelPillWidth, row.height, [row.height / 2]);\n ctx.stroke();\n\n ctx.save();\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = levelColor;\n ctx.fillText(levelPillText, contentX + levelPillPaddingX, centerY);\n ctx.restore();\n } else if (row.kind === \"message\") {\n ctx.font = withFallback(\"15px Helvetica\");\n ctx.fillStyle = layout.messageColor\n ? parseHex(layout.messageColor)\n : \"rgba(255, 255, 255, 0.65)\";\n ctx.save();\n ctx.textBaseline = \"middle\";\n ctx.fillText(truncateText(layout.message!, 58), contentX, centerY, contentWidth);\n ctx.restore();\n } else if (row.kind === \"bar\") {\n const barX = contentX;\n const barWidth = contentWidth;\n const barHeight = row.height;\n\n ctx.font = withFallback(\"bold 12px Helvetica\");\n ctx.textAlign = \"right\";\n ctx.fillStyle = xpColor;\n ctx.fillText(\n `${abbreviateNumber(layout.currentXp!)} / ${abbreviateNumber(layout.requiredXp!)} XP`,\n barX + barWidth,\n rowTop - 8,\n );\n ctx.textAlign = \"left\";\n\n ctx.fillStyle = barBackgroundColor;\n ctx.beginPath();\n ctx.roundRect(barX, rowTop, barWidth, barHeight, [barHeight / 2]);\n ctx.fill();\n\n const progress = Math.min(1, Math.max(0, layout.currentXp! / layout.requiredXp!));\n const minVisibleWidth = Math.min(barWidth, barHeight * 1.5);\n const filledWidth =\n progress > 0 ? Math.max(minVisibleWidth, Math.round(barWidth * progress)) : 0;\n\n if (filledWidth > 0) {\n const barGrd = ctx.createLinearGradient(barX, 0, barX + filledWidth, 0);\n for (let i = 0; i < layout.barColors.length; i++) {\n const stop = layout.barColors.length === 1 ? 0 : i / (layout.barColors.length - 1);\n barGrd.addColorStop(stop, layout.barColors[i]);\n }\n\n ctx.save();\n ctx.shadowColor = hexToRgba(layout.barColors[layout.barColors.length - 1], 0.85);\n ctx.shadowBlur = 12;\n ctx.fillStyle = barGrd;\n ctx.beginPath();\n ctx.roundRect(barX, rowTop, filledWidth, barHeight, [barHeight / 2]);\n ctx.fill();\n ctx.shadowBlur = 0;\n\n ctx.fillStyle = \"rgba(255, 255, 255, 0.35)\";\n ctx.beginPath();\n ctx.roundRect(barX + 3, rowTop + 2, Math.max(0, filledWidth - 6), barHeight * 0.32, [\n barHeight / 2,\n ]);\n ctx.fill();\n ctx.restore();\n }\n }\n\n rowTop += row.height;\n }\n\n ctx.restore();\n\n if (layout.borderColors.length > 0) {\n drawGradientBorder(ctx, width, height, layout.borderColors, CORNER_RADIUS);\n }\n}\n","import \"./profileImage.output.utils\";\n\nimport type {\n LevelUpLayout} from \"./LevelUpCard/index\";\nimport {\n createLevelUpCanvas,\n drawLevelUpCard,\n getCardDimensions,\n} from \"./LevelUpCard/index\";\nimport { encodeCanvas } from \"./output.utils\";\nimport type { OutputOptions } from \"../@Types/index\";\n\nexport async function genLevelUpPng(\n layout: LevelUpLayout,\n output?: OutputOptions,\n): Promise<Buffer> {\n const { width, height } = getCardDimensions();\n const { canvas, ctx } = createLevelUpCanvas(width, height);\n\n await drawLevelUpCard(ctx, width, height, layout);\n\n return encodeCanvas(canvas, output);\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genLevelUpPng } from \"../Utils/levelUpCard.output.utils\";\nimport { parseHex } from \"../Utils/validations.utils\";\nimport { resolveCardColors } from \"../Utils/canvasShared.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { LevelUpLayout } from \"../Utils/LevelUpCard/index\";\nimport type { LevelUpOptions} from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nexport type { LevelUpOptions } from \"../@Types/index\";\n\nconst DEFAULT_ACCENT = \"#FACC15\";\n\nexport async function levelUpImage(\n userId: string,\n level: number,\n options: LevelUpOptions = {},\n): Promise<Buffer> {\n if (!userId || typeof userId !== \"string\") {\n throw new KiraError(\"A valid userId is required\", KiraErrorCode.Validation);\n }\n\n if (typeof level !== \"number\" || isNaN(level)) {\n throw new KiraError(\"A valid level is required\", KiraErrorCode.Validation);\n }\n\n const data = await fetchUserData(userId, options.guildId, options.bypassCache);\n const username = data.basicInfo.globalName || data.basicInfo.username;\n const avatarUrl = data.assets.avatarURL ?? data.assets.defaultAvatarURL;\n\n const palette = getThemePalette(options.theme);\n\n const accentColor = options.accentColor\n ? parseHex(options.accentColor)\n : palette?.accentColor\n ? parseHex(palette.accentColor)\n : DEFAULT_ACCENT;\n\n const borderColors = resolveCardColors({\n custom: options.borderColor,\n removeBorder: options.removeBorder,\n useNitroTheme: options.useNitroTheme,\n nitroColors: data.decoration.profileColors,\n useRoleColor: options.useRoleColor,\n roleColor: data.decoration.roleColor,\n fallback: palette?.borderColor ?? [accentColor],\n });\n\n const barColors = resolveCardColors({\n custom: options.barColor,\n fallback: palette?.barColor ?? [accentColor],\n });\n\n const showAvatarDecoration = options.showAvatarDecoration !== false;\n const avatarFrameUrl = showAvatarDecoration ? data.decoration.avatarFrame : null;\n const badges = options.showBadges ? data.assets.badges : undefined;\n\n const layout: LevelUpLayout = {\n username,\n avatarUrl,\n level,\n currentXp: options.currentXp,\n requiredXp: options.requiredXp,\n message: options.message,\n accentColor,\n borderColors,\n barColors,\n barBackgroundColor: options.barBackgroundColor,\n levelColor: options.levelColor ?? palette?.levelColor,\n usernameColor: options.usernameColor ?? palette?.usernameColor,\n messageColor: options.messageColor ?? palette?.messageColor,\n kickerColor: options.kickerColor,\n xpColor: options.xpColor,\n customBackground: options.customBackground,\n backgroundTint: options.backgroundTint,\n avatarBorderColor: options.avatarBorderColor,\n avatarFrameUrl,\n badges,\n maxBadges: options.maxBadges,\n };\n\n try {\n return await genLevelUpPng(layout, options.output);\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\nimport { createCanvas, loadImage } from \"@napi-rs/canvas\";\n\nimport { drawCoverImage, drawGradientBorder, hexToRgba } from \"./canvasShared.utils\";\nimport { parseHex } from \"./validations.utils\";\nimport { truncateText } from \"./strings.utils\";\nimport { withFallback } from \"./fonts.utils\";\nimport type { AchievementRarity } from \"../@Types/index\";\n\nexport const CARD_WIDTH = 700;\nexport const CARD_HEIGHT = 220;\nexport const CORNER_RADIUS = 24;\nexport const ICON_SIZE = 96;\nexport const ICON_MARGIN = 32;\n\nconst RARITY_COLORS: Record<AchievementRarity, string> = {\n common: \"#9AA3AF\",\n rare: \"#3B82F6\",\n epic: \"#A855F7\",\n legendary: \"#F59E0B\",\n};\n\nconst RARITY_LABELS: Record<AchievementRarity, string> = {\n common: \"Common\",\n rare: \"Queer\",\n epic: \"Epic\",\n legendary: \"Legendary\",\n};\n\nexport interface AchievementLayout {\n title: string;\n description?: string;\n iconUrl?: string;\n rarity?: AchievementRarity;\n accentColor?: string;\n borderColors?: string[];\n noBorder?: boolean;\n customBackground?: string;\n usernameLine?: string;\n progressText?: string;\n}\n\nfunction resolveAccentColor(layout: AchievementLayout): string {\n if (layout.accentColor) return parseHex(layout.accentColor);\n const rarity = layout.rarity ?? \"common\";\n return RARITY_COLORS[rarity];\n}\n\nexport function getCardDimensions(): { width: number; height: number } {\n return { width: CARD_WIDTH, height: CARD_HEIGHT };\n}\n\nexport function createAchievementCanvas(width: number, height: number) {\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n return { canvas, ctx };\n}\n\nexport async function drawAchievementCard(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n layout: AchievementLayout,\n): Promise<void> {\n const accentColor = resolveAccentColor(layout);\n const borderColors = layout.noBorder\n ? []\n : layout.borderColors?.length\n ? layout.borderColors\n : [accentColor];\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, [CORNER_RADIUS]);\n ctx.clip();\n\n ctx.fillStyle = \"#111318\";\n ctx.fillRect(0, 0, width, height);\n\n const backgroundImage = layout.customBackground\n ? await loadImage(layout.customBackground).catch(() => undefined)\n : undefined;\n\n if (backgroundImage) {\n drawCoverImage(ctx, backgroundImage, 0, 0, width, height);\n\n const overlay = ctx.createLinearGradient(0, 0, width, 0);\n overlay.addColorStop(0, \"rgba(10, 11, 15, 0.9)\");\n overlay.addColorStop(1, \"rgba(10, 11, 15, 0.55)\");\n ctx.fillStyle = overlay;\n ctx.fillRect(0, 0, width, height);\n } else {\n const grd = ctx.createLinearGradient(0, 0, width, height);\n grd.addColorStop(0, hexToRgba(accentColor, 0.22));\n grd.addColorStop(1, \"rgba(17, 19, 24, 1)\");\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, height);\n }\n\n const iconCx = ICON_MARGIN + ICON_SIZE / 2;\n const iconCy = height / 2;\n\n ctx.beginPath();\n ctx.arc(iconCx, iconCy, ICON_SIZE / 2 + 6, 0, Math.PI * 2);\n ctx.fillStyle = hexToRgba(accentColor, 0.18);\n ctx.fill();\n\n ctx.beginPath();\n ctx.arc(iconCx, iconCy, ICON_SIZE / 2, 0, Math.PI * 2);\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 4;\n ctx.stroke();\n\n const iconImage = layout.iconUrl\n ? await loadImage(layout.iconUrl).catch(() => undefined)\n : undefined;\n\n if (iconImage) {\n ctx.save();\n ctx.beginPath();\n ctx.arc(iconCx, iconCy, ICON_SIZE / 2 - 6, 0, Math.PI * 2);\n ctx.clip();\n ctx.drawImage(\n iconImage,\n iconCx - ICON_SIZE / 2 + 6,\n iconCy - ICON_SIZE / 2 + 6,\n ICON_SIZE - 12,\n ICON_SIZE - 12,\n );\n ctx.restore();\n } else {\n ctx.font = withFallback(`${Math.round(ICON_SIZE * 0.45)}px Helvetica Bold`);\n ctx.textAlign = \"center\";\n ctx.fillStyle = accentColor;\n ctx.fillText(\"โ˜…\", iconCx, iconCy + ICON_SIZE * 0.16);\n }\n\n const textX = ICON_MARGIN * 2 + ICON_SIZE;\n let cursorY = height / 2 - 30;\n\n ctx.textAlign = \"left\";\n\n if (layout.usernameLine) {\n ctx.font = withFallback(\"14px Helvetica\");\n ctx.fillStyle = \"rgba(255, 255, 255, 0.55)\";\n ctx.fillText(truncateText(layout.usernameLine, 40), textX, cursorY);\n cursorY += 26;\n }\n\n const rarity = layout.rarity ?? \"common\";\n ctx.font = withFallback(\"12px Helvetica Bold\");\n const rarityLabel = RARITY_LABELS[rarity].toUpperCase();\n const rarityWidth = ctx.measureText(rarityLabel).width;\n const rarityPadding = 8;\n const rarityHeight = 20;\n\n ctx.beginPath();\n ctx.roundRect(textX, cursorY - rarityHeight + 4, rarityWidth + rarityPadding * 2, rarityHeight, [\n rarityHeight / 2,\n ]);\n ctx.fillStyle = hexToRgba(accentColor, 0.25);\n ctx.fill();\n\n ctx.fillStyle = accentColor;\n ctx.fillText(rarityLabel, textX + rarityPadding, cursorY - 6);\n cursorY += 28;\n\n ctx.font = withFallback(\"26px Helvetica Bold\");\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillText(truncateText(layout.title, 34), textX, cursorY);\n cursorY += 30;\n\n if (layout.description) {\n ctx.font = withFallback(\"15px Helvetica\");\n ctx.fillStyle = \"rgba(255, 255, 255, 0.75)\";\n ctx.fillText(truncateText(layout.description, 60), textX, cursorY);\n cursorY += 24;\n }\n\n if (layout.progressText) {\n ctx.font = withFallback(\"13px Helvetica\");\n ctx.fillStyle = hexToRgba(accentColor, 1);\n ctx.fillText(layout.progressText, textX, cursorY);\n }\n\n ctx.restore();\n\n if (borderColors.length > 0) {\n drawGradientBorder(ctx, width, height, borderColors, CORNER_RADIUS);\n }\n}\n","import \"./profileImage.output.utils\";\n\nimport type {\n AchievementLayout} from \"./achievementCard.utils\";\nimport {\n createAchievementCanvas,\n drawAchievementCard,\n getCardDimensions,\n} from \"./achievementCard.utils\";\nimport { encodeCanvas } from \"./output.utils\";\nimport type { OutputOptions } from \"../@Types/index\";\n\nexport async function genAchievementPng(\n layout: AchievementLayout,\n output?: OutputOptions,\n): Promise<Buffer> {\n const { width, height } = getCardDimensions();\n const { canvas, ctx } = createAchievementCanvas(width, height);\n\n await drawAchievementCard(ctx, width, height, layout);\n\n return encodeCanvas(canvas, output);\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genAchievementPng } from \"../Utils/achievementCard.output.utils\";\nimport { resolveCardColors } from \"../Utils/canvasShared.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { AchievementLayout } from \"../Utils/achievementCard.utils\";\nimport type { AchievementOptions} from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nexport type { AchievementOptions } from \"../@Types/index\";\n\nexport async function achievementImage(\n userId: string,\n title: string,\n options: AchievementOptions = {},\n): Promise<Buffer> {\n if (!userId || typeof userId !== \"string\") {\n throw new KiraError(\"A valid userId is required\", KiraErrorCode.Validation);\n }\n\n if (!title || typeof title !== \"string\") {\n throw new KiraError(\"A valid title is required\", KiraErrorCode.Validation);\n }\n\n const data = await fetchUserData(userId, options.guildId, options.bypassCache);\n\n const username = data.basicInfo.globalName || data.basicInfo.username;\n\n const palette = getThemePalette(options.theme);\n const accentColor = options.accentColor ?? palette?.accentColor;\n\n const borderColors = resolveCardColors({\n custom: options.borderColor,\n removeBorder: options.removeBorder,\n useNitroTheme: options.useNitroTheme,\n nitroColors: data.decoration.profileColors,\n useRoleColor: options.useRoleColor,\n roleColor: data.decoration.roleColor,\n fallback: palette?.borderColor,\n });\n\n const layout: AchievementLayout = {\n title,\n description: options.description,\n iconUrl: options.iconUrl,\n rarity: options.rarity,\n accentColor,\n borderColors: borderColors.length ? borderColors : undefined,\n noBorder: options.removeBorder,\n customBackground: options.customBackground,\n usernameLine: options.showUsername === false ? undefined : username,\n progressText: options.progressText,\n };\n\n try {\n return await genAchievementPng(layout, options.output);\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","export const CARD_WIDTH = 700;\nexport const CARD_HEIGHT = 260;\nexport const CORNER_RADIUS = 26;\nexport const AVATAR_SIZE = 150;\nexport const AVATAR_BORDER = 6;\nexport const HEART_WIDTH = 140;\nexport const HEART_HEIGHT = 150;\n\nexport const DEFAULT_ACCENT = \"#EC4899\";\n\nexport const MESSAGE_POOL: Array<{ min: number; messages: string[] }> = [\n {\n min: 90,\n messages: [\n \"Definitely the cutest couple.\",\n \"A perfect matchโ€”this is true love.\",\n \"Soulmates confirmed.\",\n ],\n },\n {\n min: 70,\n messages: [\n \"There's great chemistry here.\",\n \"This looks very promising.\",\n \"A strong connection is forming.\",\n ],\n },\n {\n min: 40,\n messages: [\n \"It could work with a little effort.\",\n \"It's a close callโ€”anything could happen.\",\n \"Not amazing, but there's potential.\",\n ],\n },\n {\n min: 0,\n messages: [\"Better off staying friends.\", \"This needs a lot of work.\", \"Fate had other plans.\"],\n },\n];\n","import { MESSAGE_POOL } from \"./constants\";\n\nexport function hashPair(a: string, b: string): number {\n const combined = [a, b].sort().join(\":\");\n let hash = 5381;\n for (let i = 0; i < combined.length; i++) {\n hash = (hash * 33) ^ combined.charCodeAt(i);\n }\n return Math.abs(hash);\n}\n\nexport function computeCompatibility(leftId: string, rightId: string): number {\n return hashPair(leftId, rightId) % 101;\n}\n\nexport function pickShipMessage(leftId: string, rightId: string, percentage: number): string {\n const bucket =\n MESSAGE_POOL.find((entry) => percentage >= entry.min) ?? MESSAGE_POOL[MESSAGE_POOL.length - 1];\n const index = hashPair(leftId, rightId) % bucket.messages.length;\n\n return bucket.messages[index];\n}\n","import { createCanvas } from \"@napi-rs/canvas\";\n\nimport { CARD_WIDTH, CARD_HEIGHT } from \"./constants\";\n\nexport interface ShipLayout {\n leftAvatarUrl: string;\n rightAvatarUrl: string;\n percentage: number;\n message: string;\n accentColor?: string;\n borderColors?: string[];\n noBorder?: boolean;\n customBackground?: string;\n heartColor?: string;\n shipName?: string;\n showText?: boolean;\n}\n\nexport function getCardDimensions(): { width: number; height: number } {\n return { width: CARD_WIDTH, height: CARD_HEIGHT };\n}\n\nexport function createShipCanvas(width: number, height: number) {\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n\n return { canvas, ctx };\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport { hexToRgba } from \"../canvasShared.utils\";\nimport { withFallback } from \"../fonts.utils\";\n\nexport function traceHeartPath(\n ctx: SKRSContext2D,\n cx: number,\n topY: number,\n width: number,\n height: number,\n): void {\n const halfW = width / 2;\n const lobeHeight = height * 0.3;\n const midY = topY + (height + lobeHeight) / 2;\n const bottomY = topY + height;\n\n ctx.moveTo(cx, topY + lobeHeight);\n ctx.bezierCurveTo(cx, topY, cx - halfW, topY, cx - halfW, topY + lobeHeight);\n ctx.bezierCurveTo(cx - halfW, midY, cx, midY, cx, bottomY);\n ctx.bezierCurveTo(cx, midY, cx + halfW, midY, cx + halfW, topY + lobeHeight);\n ctx.bezierCurveTo(cx + halfW, topY, cx, topY, cx, topY + lobeHeight);\n}\n\nexport function drawHeartIcon(\n ctx: SKRSContext2D,\n cx: number,\n cy: number,\n size: number,\n color: string,\n): void {\n ctx.save();\n ctx.beginPath();\n traceHeartPath(ctx, cx, cy - size / 2, size, size);\n ctx.closePath();\n ctx.fillStyle = color;\n ctx.fill();\n ctx.restore();\n}\n\nexport function drawHeartMeter(\n ctx: SKRSContext2D,\n cx: number,\n cy: number,\n width: number,\n height: number,\n percentage: number,\n fillColor: string,\n): void {\n const topY = cy - height / 2;\n const bottomY = cy + height / 2;\n\n ctx.save();\n ctx.shadowColor = hexToRgba(fillColor, 0.55);\n ctx.shadowBlur = 22;\n ctx.beginPath();\n traceHeartPath(ctx, cx, topY, width, height);\n ctx.fillStyle = \"rgba(8, 9, 13, 0.55)\";\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n ctx.beginPath();\n traceHeartPath(ctx, cx, topY, width, height);\n ctx.clip();\n\n ctx.fillStyle = \"rgba(255, 255, 255, 0.06)\";\n ctx.fillRect(cx - width, topY, width * 2, height);\n\n const fillHeight = height * (percentage / 100);\n const startY = bottomY - fillHeight;\n\n ctx.beginPath();\n ctx.moveTo(cx - width, bottomY + 4);\n ctx.lineTo(cx - width, startY);\n\n for (let x = -width; x <= width; x += 6) {\n const waveY = startY + Math.sin((x + cx) * 0.08) * 4;\n ctx.lineTo(cx + x, waveY);\n }\n\n ctx.lineTo(cx + width, bottomY + 4);\n ctx.closePath();\n\n const fillGrd = ctx.createLinearGradient(0, startY, 0, bottomY);\n fillGrd.addColorStop(0, hexToRgba(fillColor, 0.95));\n fillGrd.addColorStop(1, hexToRgba(fillColor, 0.75));\n ctx.fillStyle = fillGrd;\n ctx.fill();\n\n ctx.fillStyle = \"rgba(255, 255, 255, 0.18)\";\n ctx.fillRect(cx - width, startY, width * 2, Math.max(4, fillHeight * 0.12));\n ctx.restore();\n\n ctx.save();\n ctx.beginPath();\n traceHeartPath(ctx, cx, topY, width, height);\n ctx.clip();\n const shineGrd = ctx.createRadialGradient(\n cx - width * 0.28,\n topY + height * 0.32,\n 2,\n cx - width * 0.28,\n topY + height * 0.32,\n width * 0.6,\n );\n shineGrd.addColorStop(0, \"rgba(255, 255, 255, 0.28)\");\n shineGrd.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n ctx.fillStyle = shineGrd;\n ctx.fillRect(cx - width, topY, width * 2, height);\n ctx.restore();\n\n ctx.save();\n ctx.beginPath();\n traceHeartPath(ctx, cx, topY, width, height);\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.9)\";\n ctx.lineWidth = 3.5;\n ctx.stroke();\n ctx.restore();\n\n ctx.save();\n ctx.font = withFallback(`bold ${Math.round(height * 0.19)}px Helvetica Bold`);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.shadowColor = \"rgba(0, 0, 0, 0.45)\";\n ctx.shadowBlur = 8;\n ctx.shadowOffsetY = 2;\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillText(`${percentage}%`, cx, cy + height * 0.04);\n ctx.restore();\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport { hexToRgba, loadImageSafe } from \"../canvasShared.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport { AVATAR_SIZE, AVATAR_BORDER } from \"./constants\";\n\nexport async function drawAvatarCircle(\n ctx: SKRSContext2D,\n cx: number,\n cy: number,\n url: string,\n accentColor: string,\n): Promise<void> {\n const outerRadius = AVATAR_SIZE / 2 + AVATAR_BORDER;\n\n ctx.save();\n ctx.shadowColor = hexToRgba(accentColor, 0.55);\n ctx.shadowBlur = 26;\n ctx.beginPath();\n ctx.arc(cx, cy, outerRadius, 0, Math.PI * 2);\n ctx.fillStyle = \"#0c0d11\";\n ctx.fill();\n ctx.restore();\n\n const ringGrd = ctx.createLinearGradient(cx, cy - outerRadius, cx, cy + outerRadius);\n ringGrd.addColorStop(0, hexToRgba(accentColor, 1));\n ringGrd.addColorStop(1, hexToRgba(accentColor, 0.55));\n\n ctx.beginPath();\n ctx.arc(cx, cy, outerRadius - AVATAR_BORDER / 2, 0, Math.PI * 2);\n ctx.strokeStyle = ringGrd;\n ctx.lineWidth = AVATAR_BORDER;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(cx, cy, outerRadius + 2, 0, Math.PI * 2);\n ctx.strokeStyle = \"rgba(255, 255, 255, 0.35)\";\n ctx.lineWidth = 1.5;\n ctx.stroke();\n\n const avatarImage = await loadImageSafe(url);\n\n ctx.save();\n ctx.beginPath();\n ctx.arc(cx, cy, AVATAR_SIZE / 2, 0, Math.PI * 2);\n ctx.clip();\n\n if (avatarImage) {\n ctx.drawImage(\n avatarImage,\n cx - AVATAR_SIZE / 2,\n cy - AVATAR_SIZE / 2,\n AVATAR_SIZE,\n AVATAR_SIZE,\n );\n } else {\n ctx.fillStyle = \"#2b2d33\";\n ctx.fillRect(cx - AVATAR_SIZE / 2, cy - AVATAR_SIZE / 2, AVATAR_SIZE, AVATAR_SIZE);\n ctx.font = withFallback(`${Math.round(AVATAR_SIZE * 0.4)}px Helvetica Bold`);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = \"rgba(255, 255, 255, 0.7)\";\n ctx.fillText(\"?\", cx, cy);\n }\n\n ctx.restore();\n}\n","import type { SKRSContext2D } from \"@napi-rs/canvas\";\n\nimport {\n drawCoverImage,\n hexToRgba,\n drawGradientBorder,\n loadImageSafe,\n} from \"../canvasShared.utils\";\nimport { parseHex } from \"../validations.utils\";\nimport { truncateText } from \"../strings.utils\";\nimport { withFallback } from \"../fonts.utils\";\nimport { CORNER_RADIUS, AVATAR_SIZE, HEART_WIDTH, HEART_HEIGHT, DEFAULT_ACCENT } from \"./constants\";\nimport type { ShipLayout } from \"./canvasSetup\";\nimport { drawHeartIcon, drawHeartMeter } from \"./heartMeter\";\nimport { drawAvatarCircle } from \"./avatar\";\nimport { drawSparkles, drawConnector, drawShipNamePill, drawVignette } from \"./decorations\";\n\nexport async function drawShipCard(\n ctx: SKRSContext2D,\n width: number,\n height: number,\n layout: ShipLayout,\n): Promise<void> {\n const accentColor = layout.accentColor ? parseHex(layout.accentColor) : DEFAULT_ACCENT;\n const heartColor = layout.heartColor ? parseHex(layout.heartColor) : accentColor;\n\n ctx.save();\n ctx.beginPath();\n ctx.roundRect(0, 0, width, height, [CORNER_RADIUS]);\n ctx.clip();\n\n ctx.fillStyle = \"#0c0d11\";\n ctx.fillRect(0, 0, width, height);\n\n const backgroundImage = await loadImageSafe(layout.customBackground);\n\n if (backgroundImage) {\n drawCoverImage(ctx, backgroundImage, 0, 0, width, height);\n\n ctx.fillStyle = \"rgba(8, 9, 13, 0.5)\";\n ctx.fillRect(0, 0, width, height);\n\n const duotone = ctx.createLinearGradient(0, 0, width, height);\n duotone.addColorStop(0, hexToRgba(accentColor, 0.25));\n duotone.addColorStop(1, \"rgba(8, 9, 13, 0.35)\");\n ctx.fillStyle = duotone;\n ctx.fillRect(0, 0, width, height);\n } else {\n const grd = ctx.createLinearGradient(0, 0, width, height);\n grd.addColorStop(0, hexToRgba(accentColor, 0.32));\n grd.addColorStop(0.55, \"rgba(20, 16, 26, 1)\");\n grd.addColorStop(1, \"rgba(10, 11, 15, 1)\");\n ctx.fillStyle = grd;\n ctx.fillRect(0, 0, width, height);\n\n const glow = ctx.createRadialGradient(\n width / 2,\n height * 0.62,\n 10,\n width / 2,\n height * 0.62,\n width * 0.4,\n );\n glow.addColorStop(0, hexToRgba(accentColor, 0.35));\n glow.addColorStop(1, \"rgba(0, 0, 0, 0)\");\n ctx.fillStyle = glow;\n ctx.fillRect(0, 0, width, height);\n }\n\n drawVignette(ctx, width, height);\n drawSparkles(ctx, width, height, heartColor);\n\n const showText = layout.showText ?? true;\n\n if (showText) {\n const headerPanel = ctx.createLinearGradient(0, 0, 0, 96);\n headerPanel.addColorStop(0, \"rgba(5, 5, 8, 0.55)\");\n headerPanel.addColorStop(1, \"rgba(5, 5, 8, 0)\");\n ctx.fillStyle = headerPanel;\n ctx.fillRect(0, 0, width, 96);\n\n drawHeartIcon(ctx, 34, 32, 18, heartColor);\n\n ctx.textAlign = \"left\";\n ctx.font = withFallback(\"13px Helvetica\");\n ctx.fillStyle = \"rgba(255, 255, 255, 0.65)\";\n ctx.fillText(`LA COMPATIBILIDAD ES ${layout.percentage}%`.toUpperCase(), 54, 37);\n\n ctx.font = withFallback(\"24px Helvetica Bold\");\n ctx.shadowColor = \"rgba(0, 0, 0, 0.6)\";\n ctx.shadowBlur = 12;\n ctx.shadowOffsetY = 2;\n ctx.fillStyle = \"#FFFFFF\";\n ctx.fillText(truncateText(layout.message, 42), 32, 76);\n ctx.shadowColor = \"transparent\";\n ctx.shadowBlur = 0;\n ctx.shadowOffsetY = 0;\n\n if (layout.shipName) {\n drawShipNamePill(ctx, width, layout.shipName, accentColor);\n }\n }\n\n const bandY = showText ? 110 : 20;\n const bandHeight = height - bandY - (showText ? 26 : 20);\n const bandCy = bandY + bandHeight / 2;\n const leftCx = 24 + AVATAR_SIZE / 2 + 24;\n const rightCx = width - 24 - AVATAR_SIZE / 2 - 24;\n\n const heartWidth = Math.min(\n HEART_WIDTH,\n rightCx - AVATAR_SIZE / 2 - (leftCx + AVATAR_SIZE / 2) - 20,\n );\n const heartHeight = Math.min(HEART_HEIGHT, bandHeight - 4);\n\n drawConnector(\n ctx,\n leftCx + AVATAR_SIZE / 2 + 10,\n width / 2 - heartWidth / 2 - 10,\n bandCy,\n heartColor,\n );\n drawConnector(\n ctx,\n width / 2 + heartWidth / 2 + 10,\n rightCx - AVATAR_SIZE / 2 - 10,\n bandCy,\n heartColor,\n );\n\n await drawAvatarCircle(ctx, leftCx, bandCy, layout.leftAvatarUrl, accentColor);\n await drawAvatarCircle(ctx, rightCx, bandCy, layout.rightAvatarUrl, accentColor);\n\n drawHeartMeter(ctx, width / 2, bandCy, heartWidth, heartHeight, layout.percentage, heartColor);\n\n ctx.restore();\n\n const borderColors = layout.noBorder\n ? []\n : layout.borderColors?.length\n ? layout.borderColors\n : [accentColor];\n\n if (borderColors.length > 0) {\n drawGradientBorder(ctx, width, height, borderColors, CORNER_RADIUS - 2, 4);\n }\n}\n","import \"./profileImage.output.utils\";\n\nimport type { ShipLayout} from \"./ShipCard/index\";\nimport { createShipCanvas, drawShipCard, getCardDimensions } from \"./ShipCard/index\";\nimport { encodeCanvas } from \"./output.utils\";\nimport type { OutputOptions } from \"../@Types/index\";\n\nexport async function genShipPng(layout: ShipLayout, output?: OutputOptions): Promise<Buffer> {\n const { width, height } = getCardDimensions();\n const { canvas, ctx } = createShipCanvas(width, height);\n\n await drawShipCard(ctx, width, height, layout);\n\n return encodeCanvas(canvas, output);\n}\n","import { KiraError } from \"../Utils/error.utils\";\nimport { fetchUserData } from \"../Utils/fetch.utils\";\nimport { genShipPng } from \"../Utils/shipCard.output.utils\";\nimport { parseImg } from \"../Utils/validations.utils\";\nimport { resolveCardColors } from \"../Utils/canvasShared.utils\";\nimport { getThemePalette } from \"../Utils/themes.utils\";\nimport type { ShipLayout } from \"../Utils/ShipCard/index\";\nimport { computeCompatibility, pickShipMessage } from \"../Utils/ShipCard/index\";\nimport type { ShipOptions } from \"../@Types/index\";\nimport { KiraErrorCode } from \"../@Types/index\";\n\nexport type { ShipOptions } from \"../@Types/index\";\n\nasync function resolveAvatarUrl(\n userId: string,\n override: string | undefined,\n guildId: string | undefined,\n bypassCache: boolean,\n): Promise<string> {\n if (override) return parseImg(override);\n\n const data = await fetchUserData(userId, guildId, bypassCache);\n\n return data.assets.avatarURL ?? data.assets.defaultAvatarURL;\n}\n\nexport async function shipImage(\n leftUserId: string,\n rightUserId: string,\n options: ShipOptions = {},\n): Promise<Buffer> {\n if (!leftUserId || typeof leftUserId !== \"string\") {\n throw new KiraError(\"A valid leftUserId is required\", KiraErrorCode.Validation);\n }\n\n if (!rightUserId || typeof rightUserId !== \"string\") {\n throw new KiraError(\"A valid rightUserId is required\", KiraErrorCode.Validation);\n }\n\n const bypassCache = options.bypassCache ?? false;\n\n const [leftAvatarUrl, rightAvatarUrl] = await Promise.all([\n resolveAvatarUrl(leftUserId, options.leftImage, options.guildId, bypassCache),\n resolveAvatarUrl(rightUserId, options.rightImage, options.guildId, bypassCache),\n ]);\n\n const percentage =\n typeof options.percentage === \"number\"\n ? Math.min(100, Math.max(0, Math.round(options.percentage)))\n : computeCompatibility(leftUserId, rightUserId);\n\n const message = options.message ?? pickShipMessage(leftUserId, rightUserId, percentage);\n\n const palette = getThemePalette(options.theme);\n const accentColor = options.accentColor ?? palette?.accentColor;\n\n const needsDecoration = Boolean(options.useNitroTheme || options.useRoleColor);\n const leftData = needsDecoration\n ? await fetchUserData(leftUserId, options.guildId, bypassCache)\n : undefined;\n\n const borderColors = resolveCardColors({\n custom: options.borderColor,\n removeBorder: options.removeBorder,\n useNitroTheme: options.useNitroTheme,\n nitroColors: leftData?.decoration.profileColors,\n useRoleColor: options.useRoleColor,\n roleColor: leftData?.decoration.roleColor,\n fallback: palette?.borderColor ?? (accentColor ? [accentColor] : undefined),\n });\n\n const layout: ShipLayout = {\n leftAvatarUrl,\n rightAvatarUrl,\n percentage,\n message,\n accentColor,\n borderColors: borderColors.length ? borderColors : undefined,\n noBorder: options.removeBorder,\n customBackground: options.customBackground,\n heartColor: options.heartColor ?? palette?.heartColor,\n shipName: options.shipName,\n showText: options.showText,\n };\n\n try {\n return await genShipPng(layout, options.output);\n } catch (error: unknown) {\n if (error instanceof KiraError) throw error;\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new KiraError(message, KiraErrorCode.Render);\n }\n}\n","import { AttachmentBuilder } from \"discord.js\";\n\nimport { extensionForFormat } from \"./output.utils\";\nimport type { OutputFormat } from \"../@Types/index\";\n\nexport function toAttachment(\n buffer: Buffer,\n name = \"card\",\n format?: OutputFormat,\n): AttachmentBuilder {\n const fileName = name.includes(\".\") ? name : `${name}.${extensionForFormat(format)}`;\n return new AttachmentBuilder(buffer, { name: fileName });\n}\n"],"mappings":"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","names":["KiraErrorCode","import_canvas","import_canvas","import_canvas","import_canvas","path","import_canvas","import_canvas","import_canvas","import_canvas","hexToRgb","hexToRgba","import_canvas","import_canvas","hexToRgba","hexToRgba","import_canvas","hexToRgba","CARD_WIDTH","CORNER_RADIUS","import_canvas","CARD_WIDTH","import_canvas","import_canvas","CORNER_RADIUS","DEFAULT_ACCENT","message","CARD_WIDTH","CORNER_RADIUS","AVATAR_BORDER","import_canvas","getCardDimensions","CARD_WIDTH","CORNER_RADIUS","AVATAR_BORDER","getCardDimensions","DEFAULT_ACCENT","import_canvas","CARD_WIDTH","CARD_HEIGHT","CORNER_RADIUS","getCardDimensions","getCardDimensions","CARD_WIDTH","CARD_HEIGHT","CORNER_RADIUS","AVATAR_SIZE","AVATAR_BORDER","DEFAULT_ACCENT","import_canvas","getCardDimensions","CARD_WIDTH","CARD_HEIGHT","AVATAR_SIZE","AVATAR_BORDER","DEFAULT_ACCENT","CORNER_RADIUS","AVATAR_SIZE","getCardDimensions","message"]}