From 4e1ceed53fd71d4a26b3cb475125c72e919274b8 Mon Sep 17 00:00:00 2001 From: Lorenzune Date: Tue, 19 May 2026 15:30:47 +0200 Subject: [PATCH] Add badge leaderboard UI and badge rarity styling --- public/configuration/renderer-config.example | 7 +- src/api/badges/BadgeLeaderboardApi.ts | 170 +++++++++ src/api/badges/index.ts | 1 + .../badge_emblem_achievement.png | Bin 0 -> 654 bytes .../badge_emblem_achievement_extended.png | Bin 0 -> 682 bytes .../leaderboard_badge/badge_emblem_common.png | Bin 0 -> 975 bytes .../badge_emblem_common_extended.png | Bin 0 -> 787 bytes .../badge_emblem_default.png | Bin 0 -> 787 bytes .../leaderboard_badge/badge_emblem_epic.png | Bin 0 -> 787 bytes .../badge_emblem_epic_extended.png | Bin 0 -> 871 bytes .../badge_emblem_legendary.png | Bin 0 -> 794 bytes .../badge_emblem_legendary_extended.png | Bin 0 -> 966 bytes .../badge_emblem_mythical.png | Bin 0 -> 787 bytes .../badge_emblem_mythical_extended.png | Bin 0 -> 930 bytes .../leaderboard_badge/badge_emblem_rare.png | Bin 0 -> 787 bytes .../badge_emblem_rare_extended.png | Bin 0 -> 847 bytes .../leaderboard_badge/badge_emblem_unique.png | Bin 0 -> 798 bytes .../badge_emblem_unique_extended.png | Bin 0 -> 1016 bytes .../frame_leaderboard_achievement.png | Bin 0 -> 4369 bytes .../frame_leaderboard_rarity_common.png | Bin 0 -> 3926 bytes .../frame_leaderboard_rarity_epic.png | Bin 0 -> 4228 bytes .../frame_leaderboard_rarity_legendary.png | Bin 0 -> 4245 bytes .../frame_leaderboard_rarity_mythical.png | Bin 0 -> 4358 bytes .../frame_leaderboard_rarity_rare.png | Bin 0 -> 4311 bytes .../frame_leaderboard_rarity_unique.png | Bin 0 -> 4247 bytes .../frame_leaderboard_total.png | Bin 0 -> 4444 bytes src/assets/images/leaderboard_badge/index.ts | 32 ++ .../leaderboard_badges_white.png | Bin 0 -> 283 bytes .../leaderboard_button_close.png | Bin 0 -> 710 bytes .../leaderboard_button_close_swf.png | Bin 0 -> 710 bytes .../leaderboard_badge/leaderboard_divider.png | Bin 0 -> 1141 bytes .../leaderboard_dropdown_opener.png | Bin 0 -> 406 bytes .../leaderboard_entry_even.png | Bin 0 -> 698 bytes .../leaderboard_entry_self.png | Bin 0 -> 729 bytes .../leaderboard_entry_uneven.png | Bin 0 -> 867 bytes .../leaderboard_highlighter.png | Bin 0 -> 6179 bytes .../leaderboard_icon_progress.png | Bin 0 -> 787 bytes .../leaderboard_badge/rarity-thresholds.txt | 4 + .../leaderboard_badge/reference-final.png | Bin 0 -> 73968 bytes .../draggable-window/DraggableWindow.tsx | 1 - src/common/layout/LayoutBadgeImageView.tsx | 82 +++- src/components/MainView.tsx | 2 + .../BadgeLeaderboardView.tsx | 320 ++++++++++++++++ .../infostand/InfoStandBadgeSlotView.tsx | 2 +- .../menu/AvatarInfoWidgetOwnAvatarView.tsx | 6 + src/css/badges/BadgeLeaderboardView.css | 350 ++++++++++++++++++ src/index.tsx | 1 + 47 files changed, 970 insertions(+), 8 deletions(-) create mode 100644 src/api/badges/BadgeLeaderboardApi.ts create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_achievement.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_achievement_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_common.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_common_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_default.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_epic.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_epic_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_legendary.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_legendary_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_mythical.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_mythical_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_rare.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_rare_extended.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_unique.png create mode 100644 src/assets/images/leaderboard_badge/badge_emblem_unique_extended.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_achievement.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_common.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_epic.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_legendary.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_mythical.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_rare.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_rarity_unique.png create mode 100644 src/assets/images/leaderboard_badge/frame_leaderboard_total.png create mode 100644 src/assets/images/leaderboard_badge/index.ts create mode 100644 src/assets/images/leaderboard_badge/leaderboard_badges_white.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_button_close.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_button_close_swf.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_divider.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_dropdown_opener.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_entry_even.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_entry_self.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_entry_uneven.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_highlighter.png create mode 100644 src/assets/images/leaderboard_badge/leaderboard_icon_progress.png create mode 100644 src/assets/images/leaderboard_badge/rarity-thresholds.txt create mode 100644 src/assets/images/leaderboard_badge/reference-final.png create mode 100644 src/components/badge-leaderboard/BadgeLeaderboardView.tsx create mode 100644 src/css/badges/BadgeLeaderboardView.css diff --git a/public/configuration/renderer-config.example b/public/configuration/renderer-config.example index 6c928da..fff74ab 100644 --- a/public/configuration/renderer-config.example +++ b/public/configuration/renderer-config.example @@ -11,8 +11,8 @@ "gamedata.url": "https://nitro.example.com:2096/nitro-sec/file?kind=gamedata&file=", "sounds.url": "${asset.url}/sounds/%sample%.mp3", "external.texts.url": [ - "${gamedata.url}/ExternalTexts.json", - "${gamedata.url}/UITexts.json" + "${gamedata.url}/ExternalTexts.json?t=%timestamp%", + "${gamedata.url}/UITexts.json?t=%timestamp%" ], "external.texts.translation.url": "${gamedata.url}/text_translate/ExternalTexts_%locale%.json?t=%timestamp%", "external.samples.url": "${hof.furni.url}/mp3/sound_machine_sample_%sample%.mp3", @@ -68,6 +68,7 @@ "badges.custom.update.endpoint": "${api.url}/api/badges/custom/%badgeId%", "badges.custom.delete.endpoint": "${api.url}/api/badges/custom/%badgeId%", "badges.custom.texts.endpoint": "${api.url}/api/badges/custom/texts", + "badges.leaderboard.endpoint": "${api.url}/api/badges/leaderboard", "login.turnstile.enabled": true, "login.turnstile.sitekey": "1x00000000000000000000AA", "avatar.mandatory.libraries": [ @@ -612,4 +613,4 @@ "${images.url}/clear_icon.png", "${images.url}/big_arrow.png" ] -} \ No newline at end of file +} diff --git a/src/api/badges/BadgeLeaderboardApi.ts b/src/api/badges/BadgeLeaderboardApi.ts new file mode 100644 index 0000000..e0fb5bb --- /dev/null +++ b/src/api/badges/BadgeLeaderboardApi.ts @@ -0,0 +1,170 @@ +import { GetConfiguration } from '@nitrots/nitro-renderer'; +import { getAccessToken } from '../auth'; + +export type BadgeRarityKey = 'common' | 'rare' | 'epic' | 'legendary' | 'mythical' | 'unique'; + +export interface BadgeLeaderboardStat +{ + badgeCode: string; + ownerCount: number; + rarity: BadgeRarityKey; +} + +export interface BadgeLeaderboardEntry +{ + userId: number; + username: string; + figure: string; + score: number; + rank: number; +} + +export interface BadgeLeaderboardBoard +{ + entries: BadgeLeaderboardEntry[]; + totalPlayers: number; + viewerEntry?: Partial; +} + +export interface BadgeLeaderboardResponse +{ + viewerUserId: number; + badgeStats: BadgeLeaderboardStat[]; + thresholds: { + commonMinOwners: number; + rareMinOwners: number; + epicMinOwners: number; + legendaryMinOwners: number; + mythicalMinOwners: number; + uniqueOwners: number; + }; + leaderboards: { + totalBadges: BadgeLeaderboardBoard; + achievementLevel: BadgeLeaderboardBoard; + rarity: Record; + }; +} + +const interpolate = (value: string): string => +{ + try { return GetConfiguration().interpolate(value); } + catch { return value; } +}; + +const getUrl = (): string => +{ + const configured = GetConfiguration().getValue('badges.leaderboard.endpoint', '/api/badges/leaderboard'); + + return interpolate(configured); +}; + +const authHeaders = (): Record => +{ + const headers: Record = { + 'Accept': 'application/json', + 'X-Requested-With': 'NitroBadgeLeaderboard' + }; + + const token = getAccessToken(); + + if(token) headers.Authorization = `Bearer ${ token }`; + + return headers; +}; + +const parseJson = async (response: Response): Promise => +{ + const text = await response.text(); + + if(!text) return {} as T; + + try { return JSON.parse(text) as T; } + catch { throw new Error('Invalid response from badge leaderboard endpoint.'); } +}; + +const throwOnError = async (response: Response): Promise => +{ + if(response.ok) return; + + const payload = await parseJson<{ error?: string }>(response); + const message = payload?.error || `Request failed (${ response.status }).`; + const error = new Error(message) as Error & { status?: number }; + + error.status = response.status; + + throw error; +}; + +let cachePromise: Promise = null; +let cacheValue: BadgeLeaderboardResponse = null; + +const buildStatsMap = (response: BadgeLeaderboardResponse | null): Map => +{ + const map = new Map(); + + if(!response?.badgeStats?.length) return map; + + for(const stat of response.badgeStats) + { + if(!stat?.badgeCode) continue; + + map.set(stat.badgeCode, stat); + } + + return map; +}; + +let cacheStatsMap: Map = new Map(); + +export const fetchBadgeLeaderboard = async (force = false): Promise => +{ + if(!force) + { + if(cacheValue) return cacheValue; + if(cachePromise) return cachePromise; + } + + cachePromise = (async () => + { + const response = await fetch(getUrl(), { + method: 'GET', + credentials: 'include', + headers: authHeaders() + }); + + await throwOnError(response); + + const payload = await parseJson(response); + + cacheValue = payload; + cacheStatsMap = buildStatsMap(payload); + + return payload; + })(); + + try + { + return await cachePromise; + } + finally + { + cachePromise = null; + } +}; + +export const getCachedBadgeLeaderboard = (): BadgeLeaderboardResponse => +{ + return cacheValue; +}; + +export const getCachedBadgeRarityStat = (badgeCode: string): BadgeLeaderboardStat => +{ + if(!badgeCode) return null; + + return cacheStatsMap.get(badgeCode) || null; +}; + +export const ensureBadgeLeaderboardLoaded = async (): Promise => +{ + return fetchBadgeLeaderboard(false); +}; diff --git a/src/api/badges/index.ts b/src/api/badges/index.ts index 75e2cd1..7144507 100644 --- a/src/api/badges/index.ts +++ b/src/api/badges/index.ts @@ -1 +1,2 @@ export * from './CustomBadgeApi'; +export * from './BadgeLeaderboardApi'; diff --git a/src/assets/images/leaderboard_badge/badge_emblem_achievement.png b/src/assets/images/leaderboard_badge/badge_emblem_achievement.png new file mode 100644 index 0000000000000000000000000000000000000000..0733dd3f462847b9afd133bf09847fa2c65ae04d GIT binary patch literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^vOp}!!3-pS-MOj_q!^2X+?^QKos)S9TL$=qxB}__&&>Y+|6l3J^7$CUznAX+zbyH*kLCZbOFutue7`5~eILW8 zc?@Dl-ZG?CF)=ayJKW=88g_ArodYV`ks9Hd=IN=$ z05XP^L5h);ff2~^0%B<>8{}mTMrN=$6Oe7l$iyHBq@#d1vz-Mjo&#iqKmrhh^uuU$ zTNxOD!8U=Nfd#0>z{uEuaRJ0!kRH|r5VNKM*&x6KG>HkUGRV>b$b#xJG%x_kvYB2f z-qc@Y4P;*Pba4#P2rj*JaZy5&l$ zv!ox-309hCb)84YNyX;Pz4Qn%u~5;t>#J`H>hSZrJvU2=oIl4&IKQ@3lEI)jI!esA zc(3%Gg-S~6uPa}5(F}Sgw#v)piowz#0n^fqcI{hbWq%Gw?T;=_&#j#?lhJDDyj+F% zZN2WH_Y$i0wma3eU#oU;x-TiW>$qHS&VCd5<3`Um#E34uuPK$z_g6Ytz#@COR+BH>Y{bmlSmJ;w-@%ufzJ+sQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`EdzW)T!HleXJ-HZ|F869`FxDw-%I!ZUzU8@$MXNzrJo-+zTXr0zK`M4 zJO;5NZy8dnn3$OUo@I!<`U$9O*6Q|^KuWkI$S)YE9StySs=dPjl;$k(h%9Dc;5!V$ zjK}j=qyPmaOI#yLg7ec#$`gxH83GbB^GfvmTtgI0^$hh44ZAqR&H)weNR9AJ^YqkW z02#x|AjQbazzAe{0kJfc4f3)EBQsc>3CK2NWMU8m(osO1+0FtM&jGSQAOVO$`e8J> ztqcsnV4J|szyefbU}S8-xBy}3hm~KYO_H~7_W%Dk))oX7mSq2SRFplateV4cV5z}5 zr;h2T3>FF~^)9_Ea70G=a%F!lhmY{a4uhp7C0`hqaURjvz{|4&^PT`u8B6-)licJr)c=5Ogd=_UK;E8aEX z@H+BLaXO#l=czN@^i9l}Lqor-1|6>zWcajd!K@z%iZ5pUl~$@32|v5X!Co@#Pt>)Y z3tm6`yv;_%-;?@JD}H`_A!}UyP000>X1^@s6#OZ}&000A)Nkl?AFre7NsY@!{(Mg(E6r`{*|Cqn3hsuT8fX99Nbj`$iZDD#Yf6H z`>#X-h{Sv%F`tV-Ru^4F6->pZkuz1})LDgS8^)!RRmEN!^?nvvT?Fd@%nsDh6cY16 zu+xFr&tB1bHDAYJ0FqtOH@Wq+2LNN_Jfu^wm!=fYQEE3ErfcsPX^AIk>GMLc6Jz8& zh3FqT(48UxzDZl0IeF{zFRIpS_p$ejHBset7P%e0&E=5QMbyw#`8-P@TEyr|;~BjP zfCqT<%{`}Fl3gEsTiR03b1|P-6=mzFes~J^BELFIP}w3nXUs9g@KtE&^~5qbeWZ8NEqx*dQ^h z2!!H|iOK|lP@Kf9A~YVtm+=0}ZuBrM7 z7@+(1EfUP5#ufm0@DW@*3+vlBy2Pxa`}VCGyQ;s#r*k?}Km|f^$%N;eOaRpGGV;!6 z4iP}RAN&_!U=tE!8do7uyUVUV96p`X8JAxx&U*OuJr_`Zn5X6P8G2?05Oc!O2g;AK zBCxwm>DMIc@)?((Pp_P+23+g2BILhs#T@U~-;E3Bv@)HdZgrl}zh#{D;|6V?6lxI) z+~0WD8(GW=7zDL;pY;bhQv1UCHf-!b|7qQu6J1FzUiUf!3>%GtZ~R9h|J)}3T=!w? xh49{&jZiwC6+6qh-ul_7OQ+7VIb75De*nm@na~DlDLnuH002ovPDHLkV1go8-u(ao literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_common_extended.png b/src/assets/images/leaderboard_badge/badge_emblem_common_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..40425aabc570c63ff68952fdc34f936d85bdc7e7 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewh{=YWs_kQ;O7ka*}VEKQx z`Tv2G|HlgdAIki{-S_|Q@c;W0pSCc5nWyk`E9>v|c1zQ^-fwYU>c(&?h2d5?W1~L9 zL5h);ff2~^0%B<> z8x%wujLcwhCLr68k%>VNNJjy2W;+X5JO{`Ifdn81>4(wiwlXjPgLwiw0}D`%fswHR z;{u4eAU&)LAZASivO$0eXc7}xWss!>kOkFcXkY-6Wi!1}ys5v)8fc%kr;B5VMsVq* zn?;8ecwFr6t|$1{{YO4i zQrzP0?25czpE&n~EfNqstbR3_HN@G)iD%XMTZSPATwEsZ6AE$3X{l?Nb2h@{hKg9o z4V`p`nH?oH)3)8tm15Tr^j(zHHs#W~DVw}C5Biw&f8MkzG5&Rth0L_5?*>2 zo3HQE@m|}PHpTtN!lnKp>M!_xKX+cS?wc%g(fTMmqs$q`xW7-X3eI>K++Tfgrqs9U zggsJo1Me_aXuWXZ-4Ubjp!`ZB^WRg}*p8@f#cggXvPa#oeh}Wpk|=ddXvt%flNp)m zsnZhAoT`nRdh_E%_x$UpzdxmdKI;Vst0A3Ip82|tP literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_default.png b/src/assets/images/leaderboard_badge/badge_emblem_default.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe87a50ca8be52368e8eaab76f9ac4fc492b13b GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewh{{R2~_kQ-T-+z2t!Se3o zrhn| zhRel3gBjG{+<6P6JkvZqwHP>n999M?Mpgz!Aj=Dg zrJ-z45NR+ngTM~4|l}mD#XgAL9XN-6s_AYI6WPZ4w;9vJ2 z`AkW1i?_2Y@_K#Z+!MA)K=82o)nwKXXBQ`)Rp)ORh8%ElnYd3V#3iStu3^sE2$LHs zVj(wl(ivuUl+;Yyb~{&!T|>}!QBvEKOY5d=^42`)W77Y5)2hVy*F_dG)1tl`TMV#NX-qr!&ss9!i9H7jJ|{ND~-&5Pg!F-qPi8gxv9t=b-(&Sco$2e)G?tYk4;Wy zWTvN1OFVO`Hg4+8j}zVVub=+@wCeK2=eF`kB;GIn%J9z6&(hzB{gceo)BjmTCMloO Sdp5Zj6oj6xelF{r5}E*qq#y49 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_epic.png b/src/assets/images/leaderboard_badge/badge_emblem_epic.png new file mode 100644 index 0000000000000000000000000000000000000000..8c1e5eb2e52b553b2e1aabb41e2eb099e0d3d366 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewhF1_~u_kQ;I=f8bh!7}^Q zhyGo6ryO`XanFOcb?3S^U+vp*`)Lbf{)E*(x3bnPKI9gi^L~r-Qa6TEDGayD85{K( zE*Aq0X0R?fe-KE?mjw9*|Hlg$&PtXE0F`nUctirV@*M_Y#^d=bQh~g+Yt+pkqqzumAIJHs;i2m?kTiY>|NAVfCxYtRc=WPCTp5-!cq2;NmiIpHPTPPD@?GoU;)oH&nzz zZs?>l%Rqb>C!}i`GZk8D-8e#{GSARdB|`;Qs1^Go`*& zC+v}$8+eDYLhFSK?~WLK2jy29ng5=$#&$$?D{gaBkv-~u^@H#(mPDyzLQ5W-oXp5f zPo0){=2UIm)SDkCy60a%{rzdx<%!R2<&Q|bU;LHfouQwlzY+T#|HR>xB}^=*Z$8x|84fE5B>&|s;zS_6rcK(Fbb&C(V zMdy4!;`;A*_W!S%|DQ?zzr^)-6XU0T#^3wdzpY?-+QRsAE9?6$&P&}GPNgv1Draoe zXSiGpG?-z{(<|ISO1>n>FZe%Rz;ITwOaQ2qv%n(~sFm+92s0kfUy%Y7lq_+LC<)F_ zD=AMbN@WO0%*-p%^K%VRFx4~EGc@et5IYA{v?DdbGtJXei-7~kVP%kFWMyCkvb=y; z8p;L*kp?3(SeyySHe_UC5CqauK%Cjm0v68!vOypLh(Y>cG`g(}48UNXz|Oz|RAXRd zY{0kxVlGGz>jH>b(|~LcU;>)N1XdYjX#r$Gbr~8MfMnTBuM}_UFR}*OSMTZK7-HeS zcGB&l!wNhu)74no)ts1kJa0YwZ@-!O*o~5^%9Y2M*YxpDinPg2m|11A*C#+Zu2gnm z9NV3*@gfaYGJISayWg5Dm|~T+w%_aOcXr-6Ju}Ze|D1AW<)yvHgs;uWoYk{2_xapo zO1|yQdgrr4*U!zX`gtwx&4;(EP8VBEeU#-pHE-9no9%7eQ_k0l|98J$fA_1xy6dlJ zNU#Y0b-R0B@AaMC1L%z74iAygwsRHSshe5_^U7631ioD*J z?XGZ2G+ck#o^N-KIarqKKl4dk+|XLQulk}j`|aOb!ydb>tTw#Jduv_aRxf2?)d&A} zFn4M=uXdZiL271a5SQH&mm`w9X4NkgPx>g5@-%J#(ogA@ z;rHaefB*g1_tZ|^yUPR)x$iV%kXPJNW}PekEA=m@pjPOg$Eoi@DTu+-)z4*}Q$iB} D`$|sO literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_legendary.png b/src/assets/images/leaderboard_badge/badge_emblem_legendary.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7130591b8d888a0838dd871b96d02f5415fa8c GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6-D0X`wFK>GU;*MGmW|9{o||4j1#C9c1l7(ewh{tWT>y`TN9m-V+5EH~^; z9ynXvb1*t%t#`>*|E9g+(-y{+hH5{zvK}zk&X$+><7xSRi}PJ4^QCSKr&1Vhl`}T# zGh8kPn$7Sx>q|F~QYZ=X3;vHEFvP@2zXhu0Ebxc~>g78O!i>lBSEK+1B}-f*N`mv# zO3D+9QW*jgGxJLH{9Hp6O!W-)3=O+D#LfW~?MRLAO!M^AV&DLBSQ(@kSs56CEH5CI zhO$Ayq`}Ax7H0yo4H=mj1c7uE5NEctfW>owY!FBQVvv3qjczLg12Cv3ursg#)fgBV z8!#?_m!h6>3O<1hG+zr zPI_B*NP(v<{xjo}6(NV-Ec1K+U$1l(5;JUSe|Mq2OUn$e+gY03hnB-<|xMP|tt z6PhCe5;xCbOi{Y@FLKs0&9BT;I@kgYoxL*aEo8oFs?O+qRu>m$D&sxVfBEH@Q-aH8 zUCee?Tm2#ES*705z}_PM^-;GRQX95qN%=3i_QCK3d(`3`LI)1YJUDtjPNq@P?#mAS zA4|H{>o3@^Rhv}E{@`+xTS(*SuS_9}+ES(Je>SPPY&|BBtvadgX!X?(#PP|C=@+i{an^LB{Ts5&r={= literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_legendary_extended.png b/src/assets/images/leaderboard_badge/badge_emblem_legendary_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..451f69378ec77d901c29ded1a9c6df2acc6ee0b2 GIT binary patch literal 966 zcmeAS@N?(olHy`uVBq!ia0vp^ra-L8!3-o9=}cS%q!^2X+?^QKos)S9Cj|I}xB}^)As%nNtZ&$xJaD$S=U{ZkTJMsr{!M$sm4<2u%(b)SCGI+z ze?Q{-?|1h9ubTg#N&dgY^>-8Fr+&uY``N#(V0qfY_;V}kA5Y8oTb!4=F`PC!ZXd&Q;UHE$YEuWVq|4t1hTw< zSQ^R(1(OCNGgzDn$TnnTVh{wMybe+IP#-#WBRg zdum8y(P9OWnA}whGv#a?Hh8Z8_dmW&Vfmrp^E=J^(yqt0-ZY(I)-1fod*MpUPUG#0 zv$jq0{G()klYxKCU_aT2CMwPBF5B<4cWy#hJqPt2u>{414xA`o46c)QERsPemHO-s9UJHxe z`{k$J=F*G@I-m2tO=4!q?|FDf&g|F^7tg5;hac=U%c(7^JndF(&l9Bfz`FRg)d|8}n`b5Y?s@c1VKQ{a&s^LD7M5WFbR z`d|%r;|Z6ZOIsfAQk2RzS$gr4ZTDC?1U!C1Qn|b%= zd{brpt@r$n|1TScKNj1CudiGEW5KEWNB=P0;oN!T_U%P#pcwab^>bP0l+XkKCeDNf literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_mythical.png b/src/assets/images/leaderboard_badge/badge_emblem_mythical.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7cae01a831aa58b7b15d3c6ebac1e6de26e776 GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewh-dXqj_kQ*(EAM|>!E%1d z&3)5P9G!dq;LOvTdUtQ1cyRBu<4;={CzsCtxs`Q!>xNjbr1x8#m%1^WN@2KF&e*8W zaJd+0Fhfnjo-aU3z9h&m_&;92a8|NR0H~C+z#|fR| zDNig)We7;j%q!9Ja}7~2)icyHH0BQ?S^&C^qhfdj~4WsqWIWncudynt95 z$_53I1|u_AoC(M_WMpCx1kzDJoY~F-7S92)K_CH$LHc1dx~&Whz+j%h&cFgxV_;-# zz_1NSk1s>P@Eeu+m2OU##fBm0-voWVG!!%jBBxi|sbt?!oi24hD-_M;_totU*T(myQ&M0$+G4Ah^tAaBg2KQGVoGJCK zI$@90+`v1G6$o%(|HMS$FTXCD4itJJMs~?1Su_Q_z6I$}v zdg`>qGpB0frr!KG(LMkA>F-agE>C=JD}O}d{o=0-?+pDc{f*c^$vi#%pH*a%@;SX{ RlY2oy=;`X`vd$@?2>^UF8Z7_- literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_mythical_extended.png b/src/assets/images/leaderboard_badge/badge_emblem_mythical_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..632f961cd2406f411aa3c5ac2754d440a1585c43 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^+CZ$u!3-p2?+1kgDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheu>n3Iu0ZM}Gi0LikMUMb$xUt|rmZL|MPdUt~=@Q;nlJr&t<<^H)adjxV6TuFb!FFtVloP z%XtC0tpBH(0@@EdGFGpCKQ-uh=Bz%ix7Y4{RbTu3^G}=X+FO-pm)?m^6B~Z-)D8*g@ZP(zyA7K&bwLtFF@4aTx4=6Iaes_RCeyDQg4Kg zch9wr{Zo7A&Fw9WWKoPzdbH_Ec7n3-Md@j=J!cObdr@&hY(}#2hKZ`To;0*32{F%J zbjNYJWJgi!>jTT~q~0-WEQ(_{OXqqYao|AIe!ex^#h&@@JLdCa$riqxMgBf%|5vVB zGiySpP{Ho|4K7m*S1SH)m^nc<(Cc9Pl#ZBVD)(=+?NzXTuQPSix!padrML0;Z_8P$ zovM5LPTif^0dlGP|CH|kyZ7$?9dEXm-qvgR5X&ZbpqwLjkF7Ra*ggB#?5jd2zfr1A Q1*Jp=Pgg&ebxsLQ02}^wBLDyZ literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_rare.png b/src/assets/images/leaderboard_badge/badge_emblem_rare.png new file mode 100644 index 0000000000000000000000000000000000000000..3b16ec35ec9edf11014c565f3013f2c8b2f6aa3e GIT binary patch literal 787 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewh&i^(0_kQ+SpQe6W!7}a5 zq^_H7{SUi)?sPPsu5G>8*m=G6X$xcaij1FISu6LKIcGV(-{QQ~jp0-Z!>w}0Mtz3M z#Xy4@7{AZn52WNvg8YL2;{^<7CCdbWN;wNWB7s`@4ude`@%$AjKtah8*NBqf{Irtt z#G+J&fW*wa55|M#ct= z3n1o#^sp{~m^BT^1_36ZNlajsL6#Ok7F3s^fdNRC&Gbs~rv4&ppnck&E{-7@!KIUK z79CdLan0Ytpv8I6F(voc|M@o?bLuiola)(ymS{K5?`Mp7ANDS7b7X$Fp5R~iANfp4 zaf`RJEAo1M;@lIqNI>wg`qgCC5N8)Bo>k{>8HOBiahbSJD8wbFrLJMl*$9&xDqgOzu@=%+iZ?eoq>!a+9GG`d${yw=XIOAb(fAztcQs1f* z_DIbQyu(aBM~uFM@+*zZe@|IsJEFQ3x4Egv9(BL^L3kHSqSP^=C67%`W@M(P zPD?yt#q(9hD}i2aky)6@T1MJ6eq(|b0# P7Zik^u6{1-oD!Mk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1g2Ka=y0_pj`X3zRGb=sRrT{qkMA9nZL>1aG%+j_CF^LlIcij2zrWzJcS z-;cQd`anMprB-lYeY$Kep*R+ zVo@qXKw@TIiJqTph=Qq}p`M{(7l+t6prReA5uRzDo>~kXKn^Q|6eBAGBar0<#L`eU zC`2?EnZe>rK(-+x6N4a-jsoJ$b{4RB4v-B32|x_e52Mj-WncgX^8|JV7N8mfBVz-` z1rT#VdRP}g%$f#dg8&oIBqp%RAWI7%3#!Y|zyKu6W_qP~Q-6^)(7tp}7sn6_|E-f= z2OU-rXyp&{>UtZuvtNTJXEJxFs=Euz>i#}%`XmpT4zJJn#Sa za@JqDjP>$QZndt-lAE=o^S|=bcG z`>xJmyeg0=(ERG{n+&Z9E-t&vLtKKiV;koLCtaLi<>}ZOd`i+mO(}Q2?m90om$@sJ zY$*)&TD0@8{_17Dt0!f-SxXx&HQKRC<m;Zv=$U->VI3J<^PRjAg$UK|lC zI^*GPx%ayFR<2p6^@Z=XEknMJRv_cK>Ba#aT5Dde-s38|C@868seote*SA+bxQB2a zy3(ZTadhM4YnM))($SqUHG8|)`-mdKI;Vst0676Xxc~qF literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_unique.png b/src/assets/images/leaderboard_badge/badge_emblem_unique.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cf7e8d203759bd775053d5bda7348486856844 GIT binary patch literal 798 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%3?x6Bmj(hU#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewhe*544dq4aCXAIv~u>8Kt z{O>N)_shXQwsHPG!}_#^@j;)^&#kP_Hrij$W2n^PdB4T^{{jF1e}a~}F`PpW$*b(0GRYBdbz?lwwJcU+{kdfMNc@3yMI+oCO|{K+SxIL74G){tA!@k|nMY zCBgY=CFO}lsSE*$nRz98ey$-3rh0~YhK5}nV&{O0cBDplrg?g5F>nAmtPE0&tPG4m zmKP99L)oC9(qLo;i!%Y)hKx)Mfvp_8juYFOhA*Ez$$|*Er2YjE<*zYkSv?&mEukPMb<$3^gLZ0 zLo|X*C%v9@NP(xdeFFK+l>eAB8s=ZT-8{ic^(RZ5_QcO0-c8PmWej~T_+aj<&1EK{27-YtiVm(vqFyi_ z$vC#?oR#77LurOg9WG1WZZ_a?&S2LNEM1h;CU9uS{rATOn9jH)TkEfq+7~qISmB(Y zUrj6Bw%igpY4mK$vP`c`H?uC?Jz1KvOZiT%T4_Je>)^u4%wCH7g%&j3O!WKweNLK1 z+Ld+7!wya~@>5^1*GN`zE7OW}N5xYIiXt0)LKL3=3l|kpJayB0zVSp6kKEA3ae+rT zgN?=1S+Dy=d2?%THc1ZC`@8B(-*%g--8%NCpDxoqUv2l{-u>v;jCc0FFPgW6|B2

HoR?kEwErPg@R(Rt8U3KbLh*2~7afK_4Xm literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/badge_emblem_unique_extended.png b/src/assets/images/leaderboard_badge/badge_emblem_unique_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..c87660b28ca446d94931771a2008b2d5d84044f0 GIT binary patch literal 1016 zcmeAS@N?(olHy`uVBq!ia0vp^)Nn{1`lLLH0T!Hkr|Ly;uG5o&D{O>N)_shXQwsHPG!}_34=-Ed5N-duM2mHSu zasBr@`~O$X|IZ}5|M#ct=3n1o#^sp{~m<94Z2rvOnVgjoSva|rQpt=kV3_!AMrdNtL^%nu-kcq?7 z#WBRgdu}Li@goI++Cb^IS5w6~mTY}{_5XkE{0_s!#uTgX#|jVqF7TYzyW>5h>cS1H z7u}xjt;D?Ra9&0D@B2Cp?+PqR4s2VhlD6RWuE#G+tjg}Dz4iUK^!@qck3Zh|u0MO; zT2;N;db|0*|4k}99hyATT(z}YR<~?@*sFt&N>A-u=koJL`KIarK0Tjw_3p`Oz6Wnh zPuMqW)v0T~Gh@!nuL_xZH`gopY}tj3Q(e<${d~3TNydtwsW(Mh+g81PwQNcI?!~Lt zWO*sAyZ(BYMrf_sr)56bN~g>hUj1Z~-QY8Atzot<_lX&05v`{+is)n|J_YYU?ZRG98t}C5s}+w2{3#(qchoa#!dAsL2>g{oCggm@*~#F z-*k^l`h9!iy~Jm3riv0B9ziS98TDOE(u+Y#6yEIBdSH86dG(zY>MYG2;jDXX7N44H z_p~KJL4Fg{!SmMhj$Hk_BKjPE;G9FjjRIFU#@&4x?8_l@bcaaC#F%Ak-?@khGxZo8 z(_>v@C{bMbGperO;<1Sz{Sq|=UdY}KV`r-KcP31j3CtMUQ zUOOo~;>dHkeN*3MTaL!T4Np7P$ERJc?04&V$dY{I$hZ0R-MjB!{(I{C^SAHcevZEM ycUl{#^qS&#>b!Cd^3OMYdv+t?dSmEyss9Ys2{*OH+_ScW(ub$3pUXO@geCyl)}6rs literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_achievement.png b/src/assets/images/leaderboard_badge/frame_leaderboard_achievement.png new file mode 100644 index 0000000000000000000000000000000000000000..2dfff9a508b3b2d94228a85d5098f9cb92106f9f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_epic.png b/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_epic.png new file mode 100644 index 0000000000000000000000000000000000000000..11fbc465e5afe4d427427c63dce85c5083a6c0f1 GIT binary patch literal 4228 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 CR%*@w literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_legendary.png b/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_legendary.png new file mode 100644 index 0000000000000000000000000000000000000000..59c81202dffa34da0588d4be56854fa84bd845af GIT binary patch literal 4245 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_mythical.png b/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_mythical.png new file mode 100644 index 0000000000000000000000000000000000000000..b016468d43a0094565c4383c801ccfcb496eeaa0 GIT binary patch literal 4358 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_rare.png b/src/assets/images/leaderboard_badge/frame_leaderboard_rarity_rare.png new file mode 100644 index 0000000000000000000000000000000000000000..d45a5b066327e298b1cc78c96cbdde6f46527f66 GIT binary patch literal 4311 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 SwZqxfT35>m^+v-!>VE(tqklvI literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/frame_leaderboard_total.png b/src/assets/images/leaderboard_badge/frame_leaderboard_total.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcec1d60cb55f7a5063bb740007ba4d4994925e GIT binary patch literal 4444 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 SLF2Fg0|vULxDss#;(q`~#Kj2! literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/index.ts b/src/assets/images/leaderboard_badge/index.ts new file mode 100644 index 0000000..a5dddb1 --- /dev/null +++ b/src/assets/images/leaderboard_badge/index.ts @@ -0,0 +1,32 @@ +export { default as badgeEmblemAchievement } from './badge_emblem_achievement.png'; +export { default as badgeEmblemAchievementExtended } from './badge_emblem_achievement_extended.png'; +export { default as badgeEmblemCommon } from './badge_emblem_common.png'; +export { default as badgeEmblemCommonExtended } from './badge_emblem_common_extended.png'; +export { default as badgeEmblemDefault } from './badge_emblem_default.png'; +export { default as badgeEmblemEpic } from './badge_emblem_epic.png'; +export { default as badgeEmblemEpicExtended } from './badge_emblem_epic_extended.png'; +export { default as badgeEmblemLegendary } from './badge_emblem_legendary.png'; +export { default as badgeEmblemLegendaryExtended } from './badge_emblem_legendary_extended.png'; +export { default as badgeEmblemMythical } from './badge_emblem_mythical.png'; +export { default as badgeEmblemMythicalExtended } from './badge_emblem_mythical_extended.png'; +export { default as badgeEmblemRare } from './badge_emblem_rare.png'; +export { default as badgeEmblemRareExtended } from './badge_emblem_rare_extended.png'; +export { default as badgeEmblemUnique } from './badge_emblem_unique.png'; +export { default as badgeEmblemUniqueExtended } from './badge_emblem_unique_extended.png'; +export { default as frameLeaderboardAchievement } from './frame_leaderboard_achievement.png'; +export { default as frameLeaderboardRarityCommon } from './frame_leaderboard_rarity_common.png'; +export { default as frameLeaderboardRarityEpic } from './frame_leaderboard_rarity_epic.png'; +export { default as frameLeaderboardRarityLegendary } from './frame_leaderboard_rarity_legendary.png'; +export { default as frameLeaderboardRarityMythical } from './frame_leaderboard_rarity_mythical.png'; +export { default as frameLeaderboardRarityRare } from './frame_leaderboard_rarity_rare.png'; +export { default as frameLeaderboardRarityUnique } from './frame_leaderboard_rarity_unique.png'; +export { default as frameLeaderboardTotal } from './frame_leaderboard_total.png'; +export { default as leaderboardBadgesWhite } from './leaderboard_badges_white.png'; +export { default as leaderboardButtonCloseSwf } from './leaderboard_button_close_swf.png'; +export { default as leaderboardDropdownOpener } from './leaderboard_dropdown_opener.png'; +export { default as leaderboardDivider } from './leaderboard_divider.png'; +export { default as leaderboardEntryEven } from './leaderboard_entry_even.png'; +export { default as leaderboardEntrySelf } from './leaderboard_entry_self.png'; +export { default as leaderboardEntryUneven } from './leaderboard_entry_uneven.png'; +export { default as leaderboardHighlighter } from './leaderboard_highlighter.png'; +export { default as leaderboardIconProgress } from './leaderboard_icon_progress.png'; diff --git a/src/assets/images/leaderboard_badge/leaderboard_badges_white.png b/src/assets/images/leaderboard_badge/leaderboard_badges_white.png new file mode 100644 index 0000000000000000000000000000000000000000..fd416045c1e231e2368158abe34b04c1cbfe2310 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^Za{3##0(_Q*j*_GQk(%kA+G=b|JT>o2a?8D?FE5? zOeH~n!3+##lh0ZJdHX$G978JN&R#U+I&8qh8W0}*Cb-0~WuBUdjM1z<+t!y?47Y3G!(_uqVI{pQtxEBI zPQsUUOu`sN=Xb1GB=t=6>V`EPhZHmx8T?+T7chfAU9ElQi!PrDHnl!`Q>Lo-dI|2j z@TFkB{gfAPWU+`&0cRfY|fRryKhHid*PkX ehfzo0ERVZm6`XWuS$zl4D-52lelF{r5}E*JpmVJN literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_button_close.png b/src/assets/images/leaderboard_badge/leaderboard_button_close.png new file mode 100644 index 0000000000000000000000000000000000000000..984a14b1998340770ec282410dbceff49272f57a GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^CO|B}!3HEFU1LrIDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5hd`K7RKu$QC@5Lt8c`CQpH@e;D>40u}9r%aN&bYPh@ zmzQ}V^D9M7*XolSHm!+hJD#|oncv1~)&T2_aR=BAX+ ze0TDd*4#!57IP>!P|$Jtx{LB!{Nsu{Q6C!9@P$+L;Fpo@_gxAR*MY>4w32cK3{Dzbt!aD8#=m7C+U#a$Zb} z+KJR-`_&&s*Lp}~MT-5f%m3SMkoFA3ZTk^$*4D*KQzq)*+NbCBXW2ckth>}+a(Kbr zx{tOg;tnZkU*tA%E4(tU;ujQrXntwVX8&S-*4t~AN3YtIF#BtXzeF3i0@u;%6Z2l~ zdtW8{FCsBOy-LP?z24={u8yvbyxYfqm6s%>cr2Q{M(?uc^*0Uw^iQ4%`=x(+a}D>+ S-^{l_G2!Xz=d#Wzp$P!mG4vGx literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_button_close_swf.png b/src/assets/images/leaderboard_badge/leaderboard_button_close_swf.png new file mode 100644 index 0000000000000000000000000000000000000000..984a14b1998340770ec282410dbceff49272f57a GIT binary patch literal 710 zcmeAS@N?(olHy`uVBq!ia0vp^CO|B}!3HEFU1LrIDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F5hd`K7RKu$QC@5Lt8c`CQpH@e;D>40u}9r%aN&bYPh@ zmzQ}V^D9M7*XolSHm!+hJD#|oncv1~)&T2_aR=BAX+ ze0TDd*4#!57IP>!P|$Jtx{LB!{Nsu{Q6C!9@P$+L;Fpo@_gxAR*MY>4w32cK3{Dzbt!aD8#=m7C+U#a$Zb} z+KJR-`_&&s*Lp}~MT-5f%m3SMkoFA3ZTk^$*4D*KQzq)*+NbCBXW2ckth>}+a(Kbr zx{tOg;tnZkU*tA%E4(tU;ujQrXntwVX8&S-*4t~AN3YtIF#BtXzeF3i0@u;%6Z2l~ zdtW8{FCsBOy-LP?z24={u8yvbyxYfqm6s%>cr2Q{M(?uc^*0Uw^iQ4%`=x(+a}D>+ S-^{l_G2!Xz=d#Wzp$P!mG4vGx literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_divider.png b/src/assets/images/leaderboard_badge/leaderboard_divider.png new file mode 100644 index 0000000000000000000000000000000000000000..beda1bee3f3702d4668f229be25f187e2b01455a GIT binary patch literal 1141 zcmbVMOK8+U7>*BAiUl7BQHl zq^<`M!JD20#m7ld!TP8QYA-5E@nR1iWCf9miicVSQFPLFtB0as4#_{0@B9A8{Qn$p zZ`)a2wW*3>nCeW6l4F=9d#Sy2)e8Dvvu2c~pN&NAA|1Gw6f_qx2?O^akg>ErltY?P zJn#fHGR(4GGv7tJvb$s*TbvePINx$8n_(K8eMi#=5CJ`?&$Q$0r@QxAU>b3@Q_2ci zCx!aWmSGol47cU=;Q>8nu+2@N(U+-!g@^`xYtZ&&KhDnT%G3_Fc^1q<$UvN(3#u#I z4pP`fK;nduE;K;UP|v}7Ayyx&1EK&09*VpW2|+=YBC-I%{KHajuF)&!l=QqWx{9;? zgg7$K7YYTg5azJk$HQ1G#tR}ZiXn;!c}1IOe#rJ}D+&tobk}r45frOt9CF9gymfI0!mT+rR}cIG(v|737)+k&$+>1!n6jn~V6Dlz-(t$2I<^ zW;_js51QkTW~pq^4h+nN)~Abw;XyW?7?+O5smam|9ji+jC6V`Ee#k$p9s#Qdi|?Bz z%F4;IGEr{&b~8DCVzj;G!Z!E#>*4OT>!MrPYvXr5rY>IiDY(1*k=FgjZ8cQvRip6`{}ob&ON^kXO2FAV=EqaSJyq;Q(DfM`Kelsi<}-k^XUA!lvI6;>1s;*b3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S_~VrE{6o}X)of~lUN zo}pnEhuArwq8+Ibo@t(*S_~XO4l9EcBP#)( zTw`B4z3$eAjQ3sF7(IlvoQ1wKr+Q?uKd$?IPc|^&eXZ1u@`U@1tp{0-i}y#p+Pb_Q OWU{BLpUXO@geCy14pspG literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_entry_even.png b/src/assets/images/leaderboard_badge/leaderboard_entry_even.png new file mode 100644 index 0000000000000000000000000000000000000000..e68fb7fcd149ca84dc9a75c09d21f1422501f210 GIT binary patch literal 698 zcmeAS@N?(olHy`uVBq!ia0y~yV9WxtH944pr1sv)%YhVQage(c!@6@aFM%AEbVpxD z28NCO++CzrTO~;@`h-fBt;={rmIJpC7+}fB*IC+s~h0fBg9J z!-p5|-aUKs=Ec0`o3*ci z3OEZqB7q9|4ude`@%$AjKtah8*NBqf{Irtt#G+J&fW*wa5IFPI!kNQ0g_) zyW8i5-tSxZ$);|4#`)y^o2Cc-={};hbk9od{g>w4J+wzW?w@1Q-}s7`c^fUe|FBP3 WJwJJReaCB1hd+r_(-8*;x{&^63aQ?xA3n29H!b2c>bm0*Y zJ-!G;kAdjP#V0`Y^b!y~1)^t{LFoDAXF&Ag^79v0KrK(-+x z6N4a-jsoJ$b{4RB4v-B32|x_e52Mj-WncgX_XKtZ7N8mfBVz-`1rT#VdRP}g%$f#d zg8&oIBqp%RAWI7%3#!Y|zyKu6W_qP~Q-6^)konTn#W5tq`R(mUz9t6&hQOF(wX!h* zfjj?ep7mMGvBh4cBq^x0<$JuRpw|hNgMAN}jWidjyE5)bJSbgwd(xyD3F+RgbBgmW zWki`}o5XvZj#};iI&JpZZ@cGi$$z@{d*&>;x^kPXR>wE#?9PZ?Iy-9K^Y5$N*QS4O z*(21xXO;S=48EOGPbN6uGd-c$9@8XKWP3s}yjiB`gz5>!>p+?W;or(ddR%MgooKdL uKcTcyrug(D!QIPN&t;ucLK6ViFCMl4 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_entry_uneven.png b/src/assets/images/leaderboard_badge/leaderboard_entry_uneven.png new file mode 100644 index 0000000000000000000000000000000000000000..91e8b02e36984d765314ec83f378959a87652294 GIT binary patch literal 867 zcmeAS@N?(olHy`uVBq!ia0y~yV9WxtH944pr1sv)%YhVQage(c!@6@aFM%AEbVpxD z28NCO+pAgrkrn>+Czu&um^WFm>x^@2{5Z!(NM2~Ji1fe^R9^ZKkL{EU| z?vp2XpFX|&@87pSf4=VNNJjy2W;+X5JO{`Ifdn81>4(wiwlXjP zgM9)!0}D`%fswHR;{u4eAU&)LAZCF)1OiMzlbFCNgDfq8ET}F+0|SsOo9UI}P5njI zK>M;iT^vI)oZsHw?#JpV;BqmkvEBUj-o*d^l>_Sc=giwv&ajVfOS zEnD_YSmKoPX1CLS=GQV_>5q=eM)fZXK%{#Z#_73a!blX2iA3xOm^k?q$_&sVO zQSDd4qE-fTt?a+#HFwJ0?4|#X6xL{#wmkk3^ory7$E8;U`yP9*RF*kDJ;>dnPk(7& zflR!Y>_dxvQ>+dVr_kw@O?cMf!kVX+4T}Om3{lpGO(7u0RMm!6K_Et`Xv3~B5aX(8 z!?HjS!<4sSTPTRJRkvYXFo;nq+prI8&R5%pM6fx$%ngNLb9$8{P4LSEao1H@D{ozuK~Ld+z2d*7sC)ZfM=uDsJDgKKbF&yGccgpR6ay VcJ_z9n&bkC0#8>zmvv4FO#tsrYyAKK literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/leaderboard_highlighter.png b/src/assets/images/leaderboard_badge/leaderboard_highlighter.png new file mode 100644 index 0000000000000000000000000000000000000000..5663e4b99f30e933c7f20227f93beeb1a7770c86 GIT binary patch literal 6179 zcmWky1yB@D7e9_}q?PVcBm|@cNlB4zj#LRnI;HbZBPno{)X{KAb4UvY(#-)LEhweH zvEO|&J3AZiz5VU)#m;Pkfxads*&Q+n1VX9xM9mNa!E?fmg-P&neare}Cj``#DgL1~q7aK!dJbP`Cu@(4cGybnJkJP0+Om;7g!>6ExstRzc@3=-CBG z4Cvhhy}RK3JZRhmMN1%W4j{Kd6&h4;g1R+OhwIlt+YYE&2PHW5b9rWyhsx{DsQ^B2u0R?lQW)oDdfyyONwE`;FK{XD*3TVNA zDx3-iv~Gjy70`$Q&6}Wp4OFj!yjjqU1F!_jmq6h>C|v~b1yH>XD$$@|9@H#>vNeFf z8D9g9Xwbe5YSuu*7Wl9PS~me|A0Sph$2Mrht>6w_0jLAevIUxP(?x*X1nn5mw+9gG zpk^Jk;Aq(fJ^SFpI_TR4^{b$85%lbUf<@4Q0q!1?@5KEwa7Zl8ZHk{=ZP__;} zEP#d;(7q39wm{B2=sN_R2LQeTnsH!eK>1F$1>kd_Z4;EQfUGG{vL6pY`{+UUHV89R%rY|b)t_3CoRY-Xg}4yO(nUZ>(;#%rk7;<-`LrEqg=C-H zXf-p`!p0xB`J25j^GAA}%Xxg26}bA({Q?HbMcCv?_oEjcVe8kX&w}@SRw}KwEm#gS zkQYM(zmCsd2PG@BUe0WDxIpS+aEGU=fEXV**}5Au(e`QL6O3e z$m(CZLwB)k6jb)q#*ZrWt@vu!ML7==o)F>laK?b*9GOjZwN0jE@>;Z=6}x0UC0dgd3MBQV!xZmo?C0l7^@(gm z_h$I2RWC|m4&3H$@PJP#8Y9i_TY0{2s%{$8HVOrYHrB0~Oe6=5FPN)3x%!%%~|xLRj@7n#skgUxdr6(iXv<_F z0~@OS6xp~t4DNR-pq@fqksmeRUZ&dx1zGqM=zQal3v{_i|0vzNaR@5=Wkya9(Acr0 z*8Psn;c_V$|D$wKY0=?~XNS#GG`TXg-xuB#=Da2OT4G*oL1%+U26^`E_&qHVY|6=O z8fsAZqk{^V)z zMwe6w3yE_zNpusOSC$IYYjko?Wet2xkDX0skvSJpI+@uVCw^_c;O`RRgNbqP(NOi>u>Xu1(zsy?GT}pANmvtT)saTtG z1r0Bk77wb5Tf2kafPsve2`1V9ca>4Y!~R&)G34RZa*a;p7NdsB@?cu^+AxY?CCnN;B=NqLrLYh12e z#VtK8-f0!nAp75~J?QtXyD!lO#A><_RCEAgl^JQVwX&GQ*b_#UyZbJ;^uq0ooIg0A zzE-*ICF%~~t==167|!*ecm{DS)_wSU7j^dK`Me-=ihZ^*9p@ZY|_tbMak-( znSL^#wNa%bc7?dg__tBjs0CW1J0GJUlCCKQObpQ4n%m{&C3rI7)MIvGjCvcZ9Mq~t z6gPIvM2?BoLAH*Or2M&@=dMIjL?->Pnpdga*DK+G>w+2vgRW)p!u;8&z*aNBNKvnZu^F6&Hu?KK02{2{wqeo{}PD zP!W%}pKtsYF5pYr8pGw+!D%YY^%v&%q_iS*%~w7eB~vewsl*>U*!?l4{{rTvijw9( z)eC+08~|H~EJ443nL!c}ubqiU4&IZ~dvGr6B&)7?IRd}>-OJDBhc72Cp(%7Bql5Oyj4 zxpX=DGiLtrATl?rwYl`{Z2Zz`yV{Nb4|)P$3J%o3hCB>p9B#Sza&Rd!DSDs9=PTUr zJaqcMw;QD!fe4>aPL#f%F2{fZsl?bTL9qutRNIPmCad)(k>wB@Q{RytD`X9xGPhsR zOudO*!?Yb|WeZ$$O z$~Urf1isyWEh968~X3#P)W$UM&Z!|IXlvwZi0OO?&n z3dIzx)pUdvgE@HQq*`Q>Vj(T2d|SaLh!@QwA6-rK-AryH%l}wrc@aJitVvLd>o-dB zWGm}BVlMkhP=+h9L=xed&ML!36TgcmRej$S^BIjqMhMs9$p39MzVLVGK0MLvqAxzo z>v9iMnes|>(Ob1?|7^~7br~E`FS9(lMTvHkiw{@4akE!lUyO9!SYpEjca)B z*ClbU#0c@;%F%s>nz7{v^Obck|9&d|ES2G&w8|dn_;2?olT2S*NAoqUeuH(-&B_~A zj#h)Q`ncxVOP&j-RE_>5nyviK{5t9AS0+Pwc#Q8k5Y}F$S3+&HX`WmJ#uRv@>4^I9 zj_+t;!|dwFt`_8?n0wps!@HZzL5UIlHiNuN%<0nzW(Co_|02mNCtGUvwIA@^s&R!@!<_)Ds{5V$lTiB^UTf6!%JP~HU^JJClSxtLww90wRB1DLtj)Y23ywk zv;+s;^KfhpeNFgq4v!Z@7_I9-%A0n#1T*PV8%XI)NW>Pm%vLkwJ2wX(ON!(oZ8_ay z-oj<{alQCoc3tS^Jl^d4f{z2VdSh3$Jd@T98{9B8su7Fk0!buBae3K9jU#Egu7_+u)*_Vx|>Og;@+MK43Yk8|LPtD)wg;dDZm zHY8l9SwxtApr*dl1`&|zX7Xf|D5+upOj|iCzn>!NW{~-JsMr=X+-X>E;{5hMJ~BP7 zlCgpia&WW~9P|@n;+kaO ziT67{iu?I6iA_m*3FNwzt~kj_2$xX#-Y%m=^P`&rW!_lJ$YKPRc>4ahy=J}nsk(N# zF+9%lzQOv67+~!R<$`W_{z#boxN>iGtfoqC)cxD4h;*7!A=s?)6p+AVe7+Eyw(WJ~H{VRm;U=qh!+ zFqyUCx0AHix~dh^V@wuy8bD*{mUuvyo6^;I-0(iQ`96$xd)|B50blUGxqg;6M)tL} z$UA>BLGxs#rDal=>8(G1elnw)6t>A#h}@a@VS7}h z+4%zsVO@x+m(MWX5Y%;JVC-;RuAdRjUK_Af&+e@=y`XA+C*gU9sSt$?;dqc|?pwO$ zL+4nmNRl(3#r(oc;U1$6o-#X~aMzjd@6SiwZ(fA_`TiQzU~|F%3--RxS4`33rFTdm>uuTt)J0m-9n6q856dvUSg85O7u-&_E3!oQ^T>l=b0B5%lF^ z&W9m&+UMRD6-{q*nE&-KKl?tx7^}|dK5L-d_%2;+A&%Ew?=PM=g#5G%J41iS+G71yBt`6%{{6wEEL8rIf+axsw>*-|(ZI$~Go?fjYS6h1& z{W$CV?1>36|MX2zoSW`o8&O%CCY3&RK=Wqcn<9(HsF`$;xx#!`5VC1m&VT(M^#B8f z=ET)vHSpN}%%G_EeUF$Oa0$r$_UyZ3i`{8|UgAJmlCzi5I#uTu_u%$}x=(DguZs?Q zpCW4pBu-Nbb$)SUzTSR0bcagj@QHtLZ0qP94^>f7s8m{H%!l<^|33lV-q%vkpY)x= zdy?&xWc~IlQ`xbS#Pp=Un-<^F&+m_HZ$8A1CZ^`QE0+7~CAvBOizTh`)j(FKcRHFS!nN!SE zy#1+SIKF%8_0;B<-gp8i( z9JTu&4L=R5T3if6-Qs*8rS&~rP?c*GE&wAS-EFSzFac%Ed5XDxUg#Z)kN-fduagFLwQ|BQIueRFC>EDgS3;@IZYWERU`wR7x zsn>;$VNyZI)6e@d6kA=AY-=*$>F%W%VW<3QLo2}y8Uq8vIlY5_-C3*hW(Xw75^|64 zr9JIYy+cTSt8bBNOI4h3Bc7TM-dOQ{X7{{E9xT~j6#;RXL$DJxA~*cw#tkbqA(R|C z8tXj`=Xre=zbn8nH_ql7hJzRM; ztrU$?r46zlTH3Wtrl%(FO&B|p=C`hT_cDHc)RhAOGW6i<50Qo9t7R zP=;``u#v7)5^(Eq5@@dX?AECe9DjOA7HDrc+Y*sl#nEuKdhpECzPVZOO-K+naAR9x z8-1IA9dk)si4?{N(iS{5F4?a8x&@nzBIyx3awrpZO?*A6{SQ}SV`W@$nUR+*uZSCxoW}=E4 zDRDbCT`W1mBNe5JLt8ug)+@=(<(|YL`fT$;XtFie;w%YY&DONLg- zS+~nsvz_mfTxmu=LRE1EO^I~S=1l5@_DV@OaEnFVt#X2Jl5=*Vuzu0@O6$#R82kLI z!$h;+*iUrc%fY+%9-VHc+w2Di@Sm9qQDJe{5k^bVOU-{qyQU-JK~QENMum5&>KU&Q?j0%?+;$CTCuX{2UGB)lqqzmq zp~r{x)AqAiHr)vvOV7y63d%L5Rl4{gMnx5CFUDl9Gr5@cb8EC&FNG%`-?V1~xl1Q= zaIp<7HJ?!Dmi@!Vd)SIK?cGFb`@5di+n3(cl^rq`<|^g!xK(@h@DGNj{`_jE!lvI6GU;*MGmW|9{o||4j1#C9c1l7(ewh{{R2~_kQ-T-+z2t!Se3o zrhn| zhRel3gBjG{+<6P6JkvZqwHP>n999M?Mpgz!Aj=Dg zrJ-z45NR+ngTM~4|l}mD#XgAL9XN-6s_AYI6WPZ4w;9vJ2 z`AkW1i?_2Y@_K#Z+!MA)K=82o)nwKXXBQ`)Rp)ORh8%ElnYd3V#3iStu3^sE2$LHs zVj(wl(ivuUl+;Yyb~{&!T|>}!QBvEKOY5d=^42`)W77Y5)2hVy*F_dG)1tl`TMV#NX-qr!&ss9!i9H7jJ|{ND~-&5Pg!F-qPi8gxv9t=b-(&Sco$2e)G?tYk4;Wy zWTvN1OFVO`Hg4+8j}zVVub=+@wCeK2=eF`kB;GIn%J9z6&(hzB{gceo)BjmTCMloO Sdp5Zj6oj6xelF{r5}E*qq#y49 literal 0 HcmV?d00001 diff --git a/src/assets/images/leaderboard_badge/rarity-thresholds.txt b/src/assets/images/leaderboard_badge/rarity-thresholds.txt new file mode 100644 index 0000000..f47c312 --- /dev/null +++ b/src/assets/images/leaderboard_badge/rarity-thresholds.txt @@ -0,0 +1,4 @@ +raro > 10 +epico > 6 +leggendario > 3 +unico > 0 \ No newline at end of file diff --git a/src/assets/images/leaderboard_badge/reference-final.png b/src/assets/images/leaderboard_badge/reference-final.png new file mode 100644 index 0000000000000000000000000000000000000000..8afe74e31f53aa55dc9b03081db6bd66a97f8597 GIT binary patch literal 73968 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%0D(mrH7gG+2X-5#LP?DvY1l}@x3ft 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 = props => { const [isPositioned, setIsPositioned] = useState(false); const [dragHandler, setDragHandler] = useState(null); const elementRef = useRef(); - const bringToTop = useCallback(() => { let zIndex = 400; for (const existingWindow of CURRENT_WINDOWS) { diff --git a/src/common/layout/LayoutBadgeImageView.tsx b/src/common/layout/LayoutBadgeImageView.tsx index 7162627..2486584 100644 --- a/src/common/layout/LayoutBadgeImageView.tsx +++ b/src/common/layout/LayoutBadgeImageView.tsx @@ -1,7 +1,7 @@ import { BadgeImageReadyEvent, GetEventDispatcher, GetSessionDataManager, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer'; import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; -import { GetConfigurationValue, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; +import { BadgeLeaderboardStat, ensureBadgeLeaderboardLoaded, getCachedBadgeRarityStat, GetConfigurationValue, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api'; import { Base, BaseProps } from '../Base'; export interface LayoutBadgeImageViewProps extends BaseProps @@ -12,13 +12,25 @@ export interface LayoutBadgeImageViewProps extends BaseProps customTitle?: string; isGrayscale?: boolean; scale?: number; + showRarityInfo?: boolean; + highlightRarity?: boolean; } +const BADGE_RARITY_COLORS: Record = { + common: { glow: 'rgba(148, 163, 184, 0.55)', pillBackground: 'rgba(71, 85, 105, 0.16)', pillBorder: 'rgba(100, 116, 139, 0.45)', pillText: '#475569' }, + rare: { glow: 'rgba(59, 130, 246, 0.7)', pillBackground: 'rgba(59, 130, 246, 0.12)', pillBorder: 'rgba(37, 99, 235, 0.38)', pillText: '#1d4ed8' }, + epic: { glow: 'rgba(168, 85, 247, 0.72)', pillBackground: 'rgba(168, 85, 247, 0.14)', pillBorder: 'rgba(147, 51, 234, 0.4)', pillText: '#7e22ce' }, + legendary: { glow: 'rgba(249, 115, 22, 0.76)', pillBackground: 'rgba(249, 115, 22, 0.16)', pillBorder: 'rgba(234, 88, 12, 0.4)', pillText: '#c2410c' }, + mythical: { glow: 'rgba(236, 72, 153, 0.76)', pillBackground: 'rgba(236, 72, 153, 0.15)', pillBorder: 'rgba(219, 39, 119, 0.4)', pillText: '#be185d' }, + unique: { glow: 'rgba(34, 197, 94, 0.76)', pillBackground: 'rgba(34, 197, 94, 0.14)', pillBorder: 'rgba(22, 163, 74, 0.4)', pillText: '#15803d' } +}; + export const LayoutBadgeImageView: FC = props => { - const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, classNames = [], style = {}, children = null, ...rest } = props; + const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, showRarityInfo = false, highlightRarity = false, classNames = [], style = {}, children = null, ...rest } = props; const [ imageElement, setImageElement ] = useState(null); const [ tooltipPosition, setTooltipPosition ] = useState<{ top: number; left: number } | null>(null); + const [ badgeRarityStat, setBadgeRarityStat ] = useState(null); const badgeRef = useRef(null); const tooltipsEnabled = showInfo && GetConfigurationValue('badge.descriptions.enabled', true); @@ -73,10 +85,21 @@ export const LayoutBadgeImageView: FC = props => } } + if(highlightRarity && badgeRarityStat) + { + const colors = BADGE_RARITY_COLORS[badgeRarityStat.rarity]; + + if(colors) + { + newStyle.borderRadius = 8; + newStyle.boxShadow = `0 0 0 1px ${ colors.glow }, 0 0 14px ${ colors.glow }`; + } + } + if(Object.keys(style).length) newStyle = { ...newStyle, ...style }; return newStyle; - }, [ badgeCode, isGroup, imageElement, scale, style ]); + }, [ badgeCode, badgeRarityStat, highlightRarity, isGroup, imageElement, scale, style ]); useEffect(() => { @@ -136,6 +159,46 @@ export const LayoutBadgeImageView: FC = props => return () => GetEventDispatcher().removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent); }, [ badgeCode, isGroup ]); + useEffect(() => + { + if(isGroup || !badgeCode || (!showRarityInfo && !highlightRarity)) + { + setBadgeRarityStat(null); + return; + } + + const cached = getCachedBadgeRarityStat(badgeCode); + + if(cached) + { + setBadgeRarityStat(cached); + return; + } + + let cancelled = false; + + ensureBadgeLeaderboardLoaded() + .then(() => + { + if(cancelled) return; + + setBadgeRarityStat(getCachedBadgeRarityStat(badgeCode)); + }) + .catch(() => + { + if(cancelled) return; + + setBadgeRarityStat(null); + }); + + return () => { cancelled = true; }; + }, [ badgeCode, highlightRarity, isGroup, showRarityInfo ]); + + const rarityColors = badgeRarityStat ? BADGE_RARITY_COLORS[badgeRarityStat.rarity] : null; + const rarityLabel = badgeRarityStat ? LocalizeText(`badge.rarity.${ badgeRarityStat.rarity }`) : ''; + const rarityText = badgeRarityStat ? LocalizeText('badge.rarity.badge', [ 'rarity' ], [ rarityLabel ]) : ''; + const ownersText = badgeRarityStat ? LocalizeText('badge.owner_count', [ 'count' ], [ badgeRarityStat.ownerCount.toString() ]) : ''; + return ( = props => className="fixed z-[9999] pointer-events-none select-none w-[210px] rounded-[.25rem] bg-[#fff] text-black py-1 px-2 small" style={ { top: tooltipPosition.top, left: tooltipPosition.left } }>

{ isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
+ { showRarityInfo && badgeRarityStat && +
+
+ { rarityText } +
+
{ ownersText }
+
}
{ isGroup ? LocalizeText('group.badgepopup.body') : LocalizeBadgeDescription(badgeCode) }
, document.body diff --git a/src/components/MainView.tsx b/src/components/MainView.tsx index ae9c4ca..45cb80e 100644 --- a/src/components/MainView.tsx +++ b/src/components/MainView.tsx @@ -5,6 +5,7 @@ import { useNitroEvent } from '../hooks'; import { AchievementsView } from './achievements/AchievementsView'; import { AvatarEditorView } from './avatar-editor'; import { BadgeCreatorView } from './badge-creator'; +import { BadgeLeaderboardView } from './badge-leaderboard/BadgeLeaderboardView'; import { AvatarEffectsView } from './avatar-effects'; import { CameraWidgetView } from './camera/CameraWidgetView'; import { CampaignView } from './campaign/CampaignView'; @@ -125,6 +126,7 @@ export const MainView: FC<{}> = props => + diff --git a/src/components/badge-leaderboard/BadgeLeaderboardView.tsx b/src/components/badge-leaderboard/BadgeLeaderboardView.tsx new file mode 100644 index 0000000..7af23d0 --- /dev/null +++ b/src/components/badge-leaderboard/BadgeLeaderboardView.tsx @@ -0,0 +1,320 @@ +import { AddLinkEventTracker, GetSessionDataManager, ILinkEventTracker, RemoveLinkEventTracker } from '@nitrots/nitro-renderer'; +import { CSSProperties, FC, useEffect, useMemo, useState } from 'react'; +import { BadgeLeaderboardBoard, BadgeLeaderboardEntry, BadgeRarityKey, fetchBadgeLeaderboard, getCachedBadgeLeaderboard, LocalizeText } from '../../api'; +import { Column, DraggableWindow, DraggableWindowPosition, Flex, Text } from '../../common'; +import { + badgeEmblemAchievement, + badgeEmblemCommon, + badgeEmblemDefault, + badgeEmblemEpic, + badgeEmblemLegendary, + badgeEmblemMythical, + badgeEmblemRare, + badgeEmblemUnique, + frameLeaderboardAchievement, + frameLeaderboardRarityCommon, + frameLeaderboardRarityEpic, + frameLeaderboardRarityLegendary, + frameLeaderboardRarityMythical, + frameLeaderboardRarityRare, + frameLeaderboardRarityUnique, + frameLeaderboardTotal, + leaderboardButtonCloseSwf, + leaderboardDivider, + leaderboardDropdownOpener +} from '../../assets/images/leaderboard_badge'; + +type LeaderboardPage = + | { key: 'totalBadges'; board: BadgeLeaderboardBoard; frame: string; emblem: string; title: () => string; info: () => string; option: () => string; } + | { key: 'achievementLevel'; board: BadgeLeaderboardBoard; frame: string; emblem: string; title: () => string; info: () => string; option: () => string; } + | { key: `rarity-${ BadgeRarityKey }`; rarity: BadgeRarityKey; board: BadgeLeaderboardBoard; frame: string; emblem: string; title: () => string; info: () => string; option: () => string; }; + +const RARITY_ASSETS: Record = { + common: { frame: frameLeaderboardRarityCommon, emblem: badgeEmblemCommon }, + rare: { frame: frameLeaderboardRarityRare, emblem: badgeEmblemRare }, + epic: { frame: frameLeaderboardRarityEpic, emblem: badgeEmblemEpic }, + legendary: { frame: frameLeaderboardRarityLegendary, emblem: badgeEmblemLegendary }, + mythical: { frame: frameLeaderboardRarityMythical, emblem: badgeEmblemMythical }, + unique: { frame: frameLeaderboardRarityUnique, emblem: badgeEmblemUnique } +}; + +const RARITY_ORDER: BadgeRarityKey[] = [ 'common', 'rare', 'epic', 'legendary', 'mythical', 'unique' ]; +const PAGE_SIZE = 10; +const getAvatarHeadUrl = (figure: string): string => +{ + if(!figure) return ''; + + return `https://www.habbo.com/habbo-imaging/avatarimage?figure=${ encodeURIComponent(figure) }&direction=2&head_direction=2&gesture=sml&size=m&headonly=1`; +}; + +export const BadgeLeaderboardView: FC<{}> = props => +{ + const [ isVisible, setIsVisible ] = useState(false); + const [ isLoading, setIsLoading ] = useState(false); + const [ loadError, setLoadError ] = useState(null); + const [ version, setVersion ] = useState(0); + const [ categoryIndex, setCategoryIndex ] = useState(0); + const [ entryPageIndex, setEntryPageIndex ] = useState(0); + const [ isCategoryMenuVisible, setIsCategoryMenuVisible ] = useState(false); + + useEffect(() => + { + const linkTracker: ILinkEventTracker = { + linkReceived: (url: string) => + { + const parts = url.split('/'); + + if(parts.length < 2) return; + + switch(parts[1]) + { + case 'show': + setIsVisible(true); + return; + case 'hide': + setIsVisible(false); + return; + case 'toggle': + setIsVisible(value => !value); + return; + case 'refresh': + setVersion(value => value + 1); + return; + } + }, + eventUrlPrefix: 'badge-leaderboard/' + }; + + AddLinkEventTracker(linkTracker); + + return () => RemoveLinkEventTracker(linkTracker); + }, []); + + useEffect(() => + { + if(!isVisible) return; + + let cancelled = false; + + setIsLoading(true); + setLoadError(null); + + fetchBadgeLeaderboard(version > 0) + .then(() => + { + if(cancelled) return; + + setIsLoading(false); + }) + .catch(error => + { + if(cancelled) return; + + setLoadError(String((error as Error)?.message || error)); + setIsLoading(false); + }); + + return () => { cancelled = true; }; + }, [ isVisible, version ]); + + const leaderboard = getCachedBadgeLeaderboard(); + + const pages = useMemo(() => + { + if(!leaderboard) return []; + + const built: LeaderboardPage[] = [ + { + key: 'totalBadges', + board: leaderboard.leaderboards.totalBadges, + frame: frameLeaderboardTotal, + emblem: badgeEmblemDefault, + title: () => LocalizeText('badge_leaderboard.title.total_badges'), + info: () => LocalizeText('badge_leaderboard.info.total_badges'), + option: () => LocalizeText('badge_leaderboard.option.total_badges') + }, + { + key: 'achievementLevel', + board: leaderboard.leaderboards.achievementLevel, + frame: frameLeaderboardAchievement, + emblem: badgeEmblemAchievement, + title: () => LocalizeText('badge_leaderboard.title.achievement_level'), + info: () => LocalizeText('badge_leaderboard.info.achievement_level'), + option: () => LocalizeText('badge_leaderboard.option.achievement_level') + } + ]; + + for(const rarity of RARITY_ORDER) + { + const board = leaderboard.leaderboards.rarity?.[rarity]; + + if(!board?.totalPlayers) continue; + + const assets = RARITY_ASSETS[rarity]; + const rarityText = LocalizeText(`badge.rarity.${ rarity }`); + + built.push({ + key: `rarity-${ rarity }`, + rarity, + board, + frame: assets.frame, + emblem: assets.emblem, + title: () => LocalizeText('badge_leaderboard.title.rarity', [ 'rarity' ], [ rarityText ]), + info: () => LocalizeText(`badge_leaderboard.info.rarity.${ rarity }`), + option: () => LocalizeText('badge_leaderboard.option.rarity', [ 'rarity' ], [ rarityText ]) + }); + } + + return built; + }, [ leaderboard ]); + + useEffect(() => + { + if(!pages.length) return; + if(categoryIndex < pages.length) return; + + setCategoryIndex(0); + }, [ categoryIndex, pages.length ]); + + useEffect(() => setEntryPageIndex(0), [ categoryIndex ]); + + useEffect(() => + { + if(!isCategoryMenuVisible) return; + + const onWindowPointerDown = () => setIsCategoryMenuVisible(false); + + window.addEventListener('pointerdown', onWindowPointerDown); + + return () => window.removeEventListener('pointerdown', onWindowPointerDown); + }, [ isCategoryMenuVisible ]); + + const currentPage = pages[categoryIndex] || null; + const allEntries = currentPage?.board?.entries || []; + const viewerEntry = useMemo(() => + { + const fromBoard = currentPage?.board?.viewerEntry as BadgeLeaderboardEntry; + + if(fromBoard?.userId) return fromBoard; + if(!leaderboard?.viewerUserId) return null; + + const session = GetSessionDataManager(); + + if(!session || session.userId !== leaderboard.viewerUserId) return null; + + return { + userId: session.userId, + username: session.userName || '', + figure: session.figure || '', + score: 0, + rank: 0 + } as BadgeLeaderboardEntry; + }, [ currentPage?.board?.viewerEntry, leaderboard?.viewerUserId ]); + const rankedEntries = useMemo(() => + { + if(!allEntries.length) return []; + if(!viewerEntry?.userId) return allEntries; + + return allEntries.filter(entry => entry.userId !== viewerEntry.userId); + }, [ allEntries, viewerEntry?.userId ]); + const viewerHasRankedScore = ((viewerEntry?.rank || 0) > 0); + const rankedTotalPlayers = Math.max((currentPage?.board?.totalPlayers || 0) - (viewerHasRankedScore ? 1 : 0), rankedEntries.length); + const totalEntryPages = Math.max(1, Math.ceil(rankedTotalPlayers / PAGE_SIZE)); + const clampedEntryPageIndex = Math.min(entryPageIndex, totalEntryPages - 1); + const pageStart = clampedEntryPageIndex * PAGE_SIZE; + const pageEntries = rankedEntries.slice(pageStart, pageStart + PAGE_SIZE); + const showViewerEntry = !!viewerEntry?.userId; + + if(!isVisible) return null; + + return ( +
+ +
+ + ); +}; + +interface LeaderboardRowProps +{ + entry: BadgeLeaderboardEntry; + emblem: string; + rowIndex?: number; + isCurrentUser?: boolean; +} + +const LeaderboardRow: FC = props => +{ + const { entry = null, emblem = null, rowIndex = 0, isCurrentUser = false } = props; + + if(!entry) return null; + + const rankClassName = ((entry.rank === 1) ? 'is-rank-1' : ((entry.rank === 2) ? 'is-rank-2' : ((entry.rank === 3) ? 'is-rank-3' : ''))); + + return ( +
+
{ entry.rank }
+
+ +
+ { entry.username } + { entry.score } + +
+ ); +}; diff --git a/src/components/room/widgets/avatar-info/infostand/InfoStandBadgeSlotView.tsx b/src/components/room/widgets/avatar-info/infostand/InfoStandBadgeSlotView.tsx index c66609d..c179eec 100644 --- a/src/components/room/widgets/avatar-info/infostand/InfoStandBadgeSlotView.tsx +++ b/src/components/room/widgets/avatar-info/infostand/InfoStandBadgeSlotView.tsx @@ -205,7 +205,7 @@ export const InfoStandBadgeSlotView: FC = ({ slotIndex, onClick={ handleSlotClick } onDoubleClick={ handleDoubleClick }> { badgeCode - ? + ? : isOwnUser && }
{ showPicker && ( diff --git a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx index b3a8ab3..e6e02aa 100644 --- a/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx +++ b/src/components/room/widgets/avatar-info/menu/AvatarInfoWidgetOwnAvatarView.tsx @@ -61,6 +61,9 @@ export const AvatarInfoWidgetOwnAvatarView: FC processAction('customize_nick') }> Nick Custom + processAction('badge_leaderboard') }> + { LocalizeText('badge_leaderboard.title.total_badges') } + { (HasHabboClub() && !isRidingHorse) && processAction('dance_menu') }> diff --git a/src/css/badges/BadgeLeaderboardView.css b/src/css/badges/BadgeLeaderboardView.css new file mode 100644 index 0000000..0d87c0e --- /dev/null +++ b/src/css/badges/BadgeLeaderboardView.css @@ -0,0 +1,350 @@ +.nitro-badge-leaderboard__window { + position: relative; + width: 460px; + height: 679px; + overflow: hidden; + image-rendering: pixelated; + filter: drop-shadow(0 18px 32px rgba(0, 0, 0, 0.45)); +} + +.nitro-badge-leaderboard__drag-handle { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 90px; + z-index: 1; + cursor: move; +} + +.nitro-badge-leaderboard__frame { + position: absolute; + inset: 0; + border-style: solid; + border-width: 87px 96px 42px 96px; + border-image-source: var(--badge-leaderboard-frame); + border-image-slice: 87 96 42 96; + border-image-width: 87px 96px 42px 96px; + border-image-repeat: round; + background: #ece8dc; + background-clip: padding-box; + box-sizing: border-box; + pointer-events: none; +} + +.nitro-badge-leaderboard__frame::after { + content: ''; + position: absolute; + inset: 86px 95px 41px 95px; + background: #ece8dc; +} + +.nitro-badge-leaderboard__close { + position: absolute; + top: 12px; + right: 108px; + width: 16px; + height: 16px; + border: 0; + padding: 0; + background: transparent; + cursor: pointer; + z-index: 5; +} + +.nitro-badge-leaderboard__close-icon { + display: block; + width: 16px; + height: 16px; + background-repeat: no-repeat; + background-position: 0 0; + image-rendering: pixelated; +} + +.nitro-badge-leaderboard__header { + position: absolute; + top: 7px; + left: 0; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + z-index: 4; +} + +.nitro-badge-leaderboard__category-button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 7px; + min-width: 120px; + max-width: 220px; + border: 0; + padding: 0; + background: transparent; + cursor: pointer; +} + +.nitro-badge-leaderboard__header-title { + color: #ffffff; + font-size: 28px; + font-weight: 700; + line-height: 1; + text-shadow: + 0 1px 0 #4a4a4a, + 1px 0 0 #4a4a4a, + -1px 0 0 #4a4a4a, + 0 -1px 0 #4a4a4a; +} + +.nitro-badge-leaderboard__header-arrow { + width: auto; + height: auto; + margin-top: 3px; + image-rendering: pixelated; +} + +.nitro-badge-leaderboard__category-menu { + position: absolute; + top: calc(100% - 2px); + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + width: 154px; + padding: 2px; + border: 1px solid #8f8f8f; + border-radius: 6px; + background: #ffffff; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25); + z-index: 6; +} + +.nitro-badge-leaderboard__category-option { + border: 0; + padding: 5px 9px; + background: transparent; + color: #232323; + font-size: 14px; + line-height: 1.15; + text-align: left; + cursor: pointer; + border-radius: 4px; +} + +.nitro-badge-leaderboard__category-option:hover, +.nitro-badge-leaderboard__category-option.is-active { + background: rgba(117, 170, 207, 0.28); +} + +.nitro-badge-leaderboard__content { + position: absolute; + inset: 80px 38px 30px 38px; + display: flex; + flex-direction: column; + gap: 8px; + color: #1f1f1f; + z-index: 2; +} + +.nitro-badge-leaderboard__state { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + font-size: 18px; + color: #3d3d3d; +} + +.nitro-badge-leaderboard__state--error { + color: #9f2b2b; +} + +.nitro-badge-leaderboard__info-card { + display: flex; + align-items: center; + gap: 10px; + min-height: 52px; + padding: 8px 12px; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(231, 229, 221, 0.96)); + border: 1px solid #a4a094; + border-radius: 10px; + box-shadow: inset 0 1px 0 #ffffff; +} + +.nitro-badge-leaderboard__info-icon { + width: auto; + height: auto; + max-width: 25px; + max-height: 25px; + image-rendering: pixelated; + flex: none; +} + +.nitro-badge-leaderboard__info-text { + color: #3b3b3b; + font-size: 15px; + line-height: 1.2; +} + +.nitro-badge-leaderboard__list { + display: flex; + flex-direction: column; + gap: 3px; + flex: 1 1 auto; + min-height: 0; + overflow: hidden; +} + +.nitro-badge-leaderboard__row { + display: grid; + grid-template-columns: 34px 54px minmax(0, 1fr) 56px 28px; + align-items: center; + gap: 6px; + min-height: 36px; + padding: 0 10px 0 8px; + background-repeat: no-repeat; + background-position: center; + background-size: 100% 100%; +} + +.nitro-badge-leaderboard__row.is-even { + background-image: url('../../assets/images/leaderboard_badge/leaderboard_entry_even.png'); +} + +.nitro-badge-leaderboard__row.is-odd { + background-image: url('../../assets/images/leaderboard_badge/leaderboard_entry_uneven.png'); +} + +.nitro-badge-leaderboard__row.is-current-user { + min-height: 40px; + background-image: url('../../assets/images/leaderboard_badge/leaderboard_entry_self.png'); +} + +.nitro-badge-leaderboard__rank { + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 9999px; + background: linear-gradient(180deg, #6a8db7 0%, #4d6788 100%); + border: 1px solid #546b87; + color: #ffffff; + font-size: 16px; + font-weight: 700; + text-shadow: 0 1px 0 #31455d; +} + +.nitro-badge-leaderboard__rank.is-rank-1 { + background: linear-gradient(180deg, #efcf58 0%, #c28e1f 100%); + border-color: #af8325; + text-shadow: 0 1px 0 #7f6020; +} + +.nitro-badge-leaderboard__rank.is-rank-2 { + background: linear-gradient(180deg, #d4d4d4 0%, #9d9d9d 100%); + border-color: #8e8e8e; + text-shadow: 0 1px 0 #666666; +} + +.nitro-badge-leaderboard__rank.is-rank-3 { + background: linear-gradient(180deg, #db9c4f 0%, #a56521 100%); + border-color: #9a5c1c; + text-shadow: 0 1px 0 #784312; +} + +.nitro-badge-leaderboard__avatar { + width: 54px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + overflow: visible; + margin: 0 auto; + align-self: center; +} + +.nitro-badge-leaderboard__avatar .avatar-image, +.nitro-badge-leaderboard__avatar-image { + display: block; + width: auto !important; + height: auto !important; + max-width: 54px; + max-height: 62px; + left: auto !important; + right: auto !important; + top: auto !important; + bottom: auto !important; + margin: 0 auto; + image-rendering: pixelated; + object-fit: contain; +} + +.nitro-badge-leaderboard__username { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #202020; + font-size: 15px; + line-height: 1; +} + +.nitro-badge-leaderboard__score { + width: 56px; + color: #1f1f1f; + font-size: 15px; + line-height: 1; + text-align: right; + padding-inline-start: 0; +} + +.nitro-badge-leaderboard__row-emblem { + display: block; + width: auto !important; + height: auto !important; + max-width: 25px; + max-height: 25px; + margin: 0 auto; + image-rendering: pixelated; + object-fit: contain; +} + +.nitro-badge-leaderboard__divider { + width: auto; + height: auto; + max-width: 100%; + max-height: 2px; + image-rendering: pixelated; +} + +.nitro-badge-leaderboard__footer { + gap: 10px; + margin-top: auto; +} + +.nitro-badge-leaderboard__nav-button { + min-width: 100px; + height: 26px; + border: 1px solid #8a8a8a; + border-radius: 4px; + background: linear-gradient(180deg, #fefefe 0%, #e8e8e6 100%); + color: #1f1f1f; + font-size: 15px; + cursor: pointer; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.95); +} + +.nitro-badge-leaderboard__nav-button:hover:not(:disabled) { + background: linear-gradient(180deg, #ffffff 0%, #ece8dc 100%); +} + +.nitro-badge-leaderboard__nav-button:disabled { + color: #8d8d8d; + background: linear-gradient(180deg, #ececec 0%, #d9d9d9 100%); + cursor: default; +} diff --git a/src/index.tsx b/src/index.tsx index 26c24fb..543dfef 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -4,6 +4,7 @@ import { App } from './App'; import './css/index.css'; import './css/backgrounds/BackgroundsView.css'; +import './css/badges/BadgeLeaderboardView.css'; import './css/chat/Chats.css';