From 2dc4f122465b5c6971971f617288ee83a9cdbc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 3 Jun 2025 14:00:53 -0500 Subject: [PATCH] feat: download --- .vscode/settings.json | 1 + _package.json | 1 - bun.lockb | Bin 306119 -> 315788 bytes .../core/src/blitz/catalogItemAccessor.ts | 4 + packages/core/src/blitz/metadata/abstract.ts | 30 +++++-- packages/core/src/blitz/metadata/socket.ts | 1 - packages/i18n/strings/en.json | 4 +- packages/website-ue/package.json | 2 + .../website-ue/public/assets/sad-ghost.png | Bin 0 -> 2345 bytes .../src/components/Avatars/Group.tsx | 10 +-- .../src/components/Avatars/Popup.tsx | 82 ++++++++++++++---- .../src/components/Avatars/Stack.tsx | 20 ++++- .../src/core/blitz/metadata.remote.ts | 2 +- .../src/pages/[...locale]/avatars/_index.tsx | 80 +++++++++++------ .../src/pages/api/avatars/[id].webp.ts | 30 +++++++ .../catalog/[item].pb.ts | 0 submodules/blitzkit-closed | 2 +- 17 files changed, 203 insertions(+), 66 deletions(-) create mode 100644 packages/website-ue/public/assets/sad-ghost.png create mode 100644 packages/website-ue/src/pages/api/avatars/[id].webp.ts rename packages/website-ue/src/pages/api/{metadata => internal}/catalog/[item].pb.ts (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 76d627e64..e0a3622e9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -192,6 +192,7 @@ "TYPELESS", "ubjson", "Uncompiled", + "undiscriminated", "Unicum", "UNLOCALIZED", "UNORM", diff --git a/_package.json b/_package.json index de8f5957c..0aa464703 100644 --- a/_package.json +++ b/_package.json @@ -41,7 +41,6 @@ "satori": "^0.10.14", "@resvg/resvg-js": "^2.6.2", "discord.js": "^14.16.3", - "fuzzysort": "^2.0.4", "bepaint": "^0.1.0-beta.3", "markdown-escape": "^2.0.0", "@types/markdown-escape": "^1.1.3", diff --git a/bun.lockb b/bun.lockb index 87fce89e22ff823b12242ddbf634e8b7964d4310..12cb0af5ea80dca27859df7fdc3643232fa6218d 100644 GIT binary patch delta 66099 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 delta 60160 zcmeFa37C%M|Nj5XGoCTeXkujFm+VIN8HUHcO@!=~WsG44W0)aJX$A=+mF~DGODaX8 zkWf^TVoGHziY%q5)JJ_QTK})}UdH6F{@>sK`2K#!@jH(0!#U^mKCk_KE%$ZbGtcAx zCvSNBqv8)WsIzq3;cb_1|D^SV*V=zw_^0Q-Xm@UJ+omgHrj`9I_Tslo4<3wLSIDR9 zvxNgH`#<`4;gs58=?hnt$xcbXGbPjKYvA|!f<9l)*>Hzzxb_Hg6-D0;Uk_Js^|bVK zW%DIvP0Y-Ivr>~X$HOxzqy*{G;gawja14BBlvB>ctg&gsN!Jm*40`rUkv?A)0(B9} z!H-~9gG*tnpefiDV70Ckd>eKp_$yd;E7$%IR{AQi(uczp;m-^Ee3jw%VKrzQTpG@D zI)1xvJwg$LQPOadmZ-OuzLI+toTfrPUMt@qv2HY6^BprLv~tL?BuMmKHrEN zd_Ml=94&60@i)lsMKX1?5RFxF<1^E;(nn|c;?T=t-#IdEYzo!hK%-R5a9Hgw467O6 z&}ik)DN`nSmh+6YixSLj7fG*Yd2x7s*Z0e!t$jbrtF-ajJO7;rOVY|6*R26GpJuPLo{e7 zVRf#aTV83Wf}Ai|6(%QVOd2=Q=bKESa?b7=>QJ^Xr*=)JXVYEIOc|9j1y7X0mN&Oj zyLz&;mc!w-o%BCrtHR8bi8$2fJAkhAdtm8lbsP`A3(EtWU{(BBUB_e3Qf_oM!U_V) zFs`1{v()-NADzqT4r{u8icaTpcEvgkD39ITp3nR`@42C7$@dL!t&5} z4V;F=H+IS`4QDICuau^WK8KZXzsoPcnr|aghEE!WM?Rx~>##31bt?XYhB1aYkI(@P z*%!?m5436SG-NBR>An`${C=N!l|MM1r3AN%$Ny?TWdv39OPtTgu;hFUtH+yQyqU9$ zj4I%@1Sj1(SQS6e%F!RhRtKiQs$dYTh5cJ=XAVsYIqC1Ep&BA@vi7Wm|5ea5BGiLR zZJe>mXzLU_J}EORh00ULO-!4ZmXdV`x_Z49}tz~#)7iZFiW7|VTIa1X_-op znK5?kr13sqv+j<|%ffQ;pEo;`?F_6T+XriQuY*}>Idk9};gPV0wliD>uIB26V5K{q zXixI&oYx4jq;npJHD)thPKK4R3#^K3yZUvmeX*M}wx7f5`S^^iiOE@6zUqA)yDS`q zJ}zloMjFmb$r?T>ZR`kNsR8aXhHudN|E|B|`V+8Ry3e&Y!=|m@(6pX_;xTF26Md)Bos4g|JU(fRJw)$eYvj(2b9%59TMbpVl>PqJo`BWE2$#2!K=$))0gt+zoSHNiFZ&j{_8eHNR|TrP5mc{5 z<&}4J#lHm{k9;3sNh@Pgaz>_FdXfk&D$gVDW9t^M6V^~nxyxzLE?D^r-|cV@Sn(4x zn>MEy-)Q3H^5@8>ox7OdY1o$Oj%U}v^7yjpmOr}r@Gn@{GWUcz#js?O>58xX3@6)U zSW9YMj?=G4VHKMTt9jm8`)+Jin*po5w24` zDLyvN`ntdvLxJU!Dw_fYGq}^XI(|mt5d9$o5ZcTGqYT>gV^w zi@$(1{^K(yj!#M+;~SC5z&07-Tl0V#-jVYs0TpI}7POSdNTZR$4O|7T4VQ*DE^}^=jhEY7Pj*h`BaWk%5>bW(T~{~>YEqCg1Sz-_Jd1d7p~szm zf3wm_f7s>M;F83zg_UmdDrZ6+hBYv|VNJ9Nlq35(8dO2I!C#(mGK`_33Pfa3v9^X6 zo^)>bm(bO-Gq4K&?I|bSHrL*^+NtOX*Pi#Z6F&~trg}T9skQzYX8?YJHE_$}V%Y?G zkw9C+912i|UM|PO^2qnDCl0}tvA4rIPp^j6u&V2vp3lYB$>c+9>4UIK!L4C+?0Y<| z@{YsOUx%+(#8U*svmddB$JA`R;&~^3HY`uE^2TSRO!VFLg40g#;cy}GnyNLQw_c8^ zluTHflKTopPJi%(_Uwu&8waMA^e%$LU!SQ28#p+nj#y=vK zL;0zF&QKk3d3@~HjO3(=DX@JI8Xr3`b1J+3R?5*PHJnW|C5uPjcN}{stfg1+U&{!`=iOkeMWx81oy(l;hR5lcH?HS_KwOfd#4QVWO?<8GMW5UNk0%)&l`W@*hk<>*t_B4nhIM9 z$hE~!I2CXjOB$OrA|-&WhFm=E49Qto>AbW3)TFUv)3PS|+*en=8z@JcWR;JdJ#7c9 z9)AMI!0*87`Jq$J6iYab|4Sq6KoEa{P!jge!lRvop>Mrgko=xBHp}-1w$gnA%R?(+ z&5=~^+)^usrPW-TcjZyhbW*GethaP#Bk)-@= zuSbW)S;0na!tS-Y@zZb3<7YE#U!ykuJHxH0_)y^4aGx*1TF@xL|82OH*fJEXQwV`- zqO1cg;sRM%ovr;X5`u3N>WCg@Eli9L3s{K>A%B;El?zP^SW&H@!d7CdP+&0&tGm^s zRYKqlp`T2$OhY#$1I%NVw|7Hn)4d4tc_l$ye=g^l8Zld*1b>g^R5*n`#5 z>d`A9_$Q%;PO27h{+mizc^yLj!6mGyj-lX#?4|XI^IHcx#06i$YK~RN>fJgncoC~7 zR)p1?VJyzxl3?{{pWyFN%1Z1M^50v^%Iy>i9zkzxr;2GG7p%fMZEu$llMolw>K*Qs z*DEe~8mk3XxD~T9K9b|kKsy_AB$$n*Y*a+{`_Z>3fUYGIeL zl~5wNf@*YNK6_46t4Dl7@HIl+(eXDkwiTP>ZT5&QCM4(h?T&nl)z`Mvk@i)b78JG? zu8ohx=s{Gp-T#(VoeALhZ7xMEHQH|;N7v-g^m0)Cb zuOYoR#}~#>-}8$Iyou7&>d`tOc*Bj(*g8Gwj>Q7$mEd1;qm|ez6gY>_*Y+P8uaWavW8={CT^D&7WmrKaI4IWV zOGOE@Vv^zuVRW~m7q%+Yz~{@gch9wiS`u&98_d1QX$1?nb9`Y8&5$d_w`9TJ@fT$= z%ILo+dSTzcpc3eha+}@YzBv0Y&5L{y<*)fGH7S^;?XX~BgaQTLe6_%&tBdc47p&8N ze^V>>wvhkTrdA%roh9n_P_P-dXH7Myud}foVWu!e5 zN;56BmRZ@u;v+Fsw6o}sVaYl6tv6V$jkoV;=NOBnlx(uNY6q5_YESQApslk3vn<$& zrek%qtJ+0K%Y{_^;(|Y7;VlgdCB!n*9qk<_vJ)A! z;v@SLQd9C5N8nKuZjG%uuynF=M~3`$I$L>AN@pu-RLH-nvz0h16gxph#I#Vb zIiusOVw&zB-_6QP3;Cb#W<`w-1#abDaJv;fIw7#0&>%Y$!S>$I4&6@3iG7JsA6pCJ zlfiaqB%w4r^gf|vJJguFcaj~l2syF85pr@2VlIrb_K$5 z$jQ(aC(|f05a57BvP+IcsCOTqZ-6xanm$%yM#%qJA1fDX*w@O-2n914V$C*gzw6_} z`dW$OL;m0TTDjvxf!YH!*%pjX2#h7v*$!@`e*~@;*z*Dev2St@#~Zj+um< z9D4~lEhs+N%X=Fkr{t&ewQmX8<@p;Av7#o2g3E^T_Y972I>q_(hFZCkL;gR8T6x5E z9p>Ekn06d@reP(JGRo@RB+kEOn3X#v6fB(NOf#Q-glmJP1kW4n9VMj31(UEeL%9zT_ZXHYaUm;ac6?;M!2v!p*@JS&` zjb-nC{zb`F?p>ka`v~mDEFbm?e_(_ab$2KjKf=qy^7fA(VddV7hW~ z6p~mycw87xh`pY}jaK=SSkBI-oAWnVY)0;Fy#7dMcktUOr(vmPZjIgI0xx5=vKF*W z2>wK$t(rz@6H62}>N9u`}! z<~7Ut?Nlo-ClrWCbI&-zmW1Rz+p~fBSnch7XMdWNHzO3;pZg9g-QAkn<_5z?TZuD6 z{>U*_?#xhN(ik;;|BM9x#xYjZtWe4SPkrh;0Z!^=ZHnIhF7;h!c3Hh_fTe(d_{*4gUx8tom zsL2E?YHlc~S0wVT?a$z|Sn|Bxp};p-JZCbJwKAQ`NyQkXV`(z8|6?u3QV9XuC5NzB z-84sYC^pM0UCSXIi*tCdgup606rGR|JVHng4YS9(#zd!NXVdS8)tIkUzi}$(&Y0v{EH6$881gr_(AIH*->`Vh~P=I#dRSkB$`9F}%k``912aSD}N3*r+3cM)=q zKL-e@Dkpu>sZM$-X1U+&TFzXbgQe}mIZnNkAJ?0d#isduP3%$*%!vzjz|wTU>%^_W z(zrQZ{|ZYEV6+CuN8aTaMA7S6SZWFnSNP@~ES4(1iMiWpl->W}P%JGIyGy}!SQ>7h zy^KG>QWIImv*Y}gr(20u$e%Rb%7xyXZskFR?y;gC;Z4ImRw6Xx9xL~eQ1GRDoUN1r z)1xky8hnGba8_KfNw(uq$4bZ2gtGTJ|C8BP-lCBIhiofqamasDj+MAL6g-#X_@cPA z@UFOEtr=c_)x{jFmSlGx7haxWC7O^wYNnM7^_^+unNV=~Os6gMXl|VU=u9hdNhnxq zmeVAATlWu~W#ugi`5&5PMJ){lPZ8%dDTbp-se7G8#&Z)3JrS$9HhF)}y;jttA^-f@ zR^p?f;L+LMg4NdB;XW%5aq@l6NfPgI>^q6YD&{Gv)EuYLoSeBM^ulUI7Z@`hzV4r6 zMJ)>j;^$JH6}>DWa1WvO3i%JtwWEs9V^r;^US25p03l6+DBDHnqrA{5+| z>+IsJy$|BU=3BWdLV=$1dBC-zS0n_N5mKM+O)7X6i*t@M!~9L|w{lm8{Il-2@>Yg| z2kv*K1e0fIeB=Ti(Med;TF5PP;Q}l7@lfy`L=CsSZTh1hu%cFl{JkEq5?6%+Z$BXa zX)pL)A*V(>*5pAe>Iv$2&`NxQv)zM^OSrrBiwpcN%Uo>cZ(_C042C^qMLih`&VDF= zlbRPFxzKTFVSCc{z*6^_e5rAfk78-<|#*)eT0G2w%Lghg5CYEzrIM6Q6f620PpAH3^KH@D( zt>y2HGdb=wPS_Z`#RU&x-D)?By~`iB)QVaY3Qkz+^w`-+*I_wR zNPEYZSa*~FZ{@`w z_xehCf$mrwEH|}^RKUv|IETfFlDBrNe7-Ko&Rt~=mOMk5kHq=ESY<_R2>EL~VI^(| z1&2T3%u}cKr?C3x7gy{_)gJw9t4IR*axf3exq+!`<(_gz#wlPd))mKY!qP*O6IW(+ zfl>nFusF+ZZWT#DGu25H@wAi0Y58ib{E7p=V)eBaJl`tvnf#?m3$|f71?W6bbxlFX zr(kup3)iGrkL9F{SrZrh8mq5YaiGmw6|TFcMJV5=!P8jo@bDZK`z+JSPBo8^W+csK zDtv;ae)A-EI6iWnQz?C*dG}xqB+BX0S6E8uSPh@ccMye4!%}ZqRNSCHz`D|mO6&7e zQf4YvzF&f`Ua=^p#D)ShKQJCEq;>A!u))gPdXK-$^H$=vP~@iP3#IaApFv z&yEXr#EPRWoI$O);C)!`7;z^)ns4baS8Ah`w>{(^w9$%s`5yn`jaKf<%&tvV-pirj z{!Kn#2THMDj|7Wtb~Xm*l}l%=p2RsPj73-pUP}K5o2{rFA%Ec)t;8LnK+6}IzgCYO z3BfxFDGw(i?n8U97&7$QTRivk)Dj$r)tFS&!&~LYv3MuGBO&lTAx<}>um6(c&7i$k z-if7F^1>JYZO77Taa#E!R&Oi@c5^fqVSv0Zb{ z$iQ+AQfmn{w2M2y3_OMr0g-5M5O7(;94O5r;{uyT)tf`1a>l)%ai-hRN@<(=+6 ziFKv(KVqr#&Uv}sLE`LpjCT`ikIp#b%vZ5mV)1Cg@~?hKZ)Ji54&@IYce6!UDu{O@ zRCxre6_$PT@W&jsa*u}m$%n1HqoLs9!%j;3oE>}@tCN#*R$QRs5hj#<*BVQxGdg!I zj`f?c+Bm7&#`!NEu@XP#cO)M=-RDsuKF&YpLn{w)1){cR9u@A6^B?=rO8g|`AO4Y* z3vK+!%KHTGeB}J1sIYY)EiTyos8bOWg@^ZtvDgkjZ54LZ$~ztkG(Kkk+TwUZAeYbx zYya_t;B6l}GnEl(85ijDiK_>GAT-2I(fhblrk%oXj$65(hJv+E1-@bcl&A2 zzw?BZcrxVoeQM=Gy+5_`PKJU@K6SkAJiQ;pl7qQJafCkUbe&nsGHiu4j3}o;%dq&x z1x@~mP+Pk}%}+UlZl?%N!_we7&HLt*6?G;Qy!Etmr=dX%=Q7uFUe^4I#jmY-S=R21 zGq5bO1>9}1v@Y$}Ac1XIPIZ?EsdM~Vf_rkq&m3>qYdP{xtnS3+Puk!cD4MNKb9|p$ zd7p=ZT|W1gJmVjjie`H zSE|WGkpt~V{lF%y2709vJf#piujd(;>%VkfwDD-Qfk(qHt-LQo!MhPPskqZJxoezr z))N*d-0<_U=0r_$z#1MW0Uyv?0{e4oxLA(hi*@G|&#k zeJ!t%&OiBUEBC8VU@HPo{$C{oejwD*N%RdPW{0K{;*L(STL}%bL!~ch#HCFjG{Vk% zgwPOMYx1oIPvuP|)ZfVC(OkBLyp!rM><;EAIlYAHUli^=)EUc3GeOXE44( za19U!Y64x?Vn2FqJJw;PuLHz&UHw|j=<7F0`jZ{sJ#IQU+YU-l0kXt7KvxcsJp|fX!I7LJP?!W`$g;ntPu3nJUz#m*)Ec?G)yCAFF zpMm%nZ>s+4CKM~}vaq%fi~gu{w2P$HGd}z||YOb`yzQVg;M>BL?mSD}Ogv=dZu)_?ux>*u&+Xa53zmur4tT z&h`x_paMp^Jlf@PP6FQqn18-Zm$PJWi4~m45A}2!EDubFHJ4_?YQP*=mst9PuzLOo z9Hxc4$Q2%iRnX(G60U*Ou;*aS?#-^f6;=T|U|nKW{FGD2U`S-)R#7g%8tjYR` zbdA3Piue?chQC&X%L;zu+F~{22UrdK6;=;_ht(iI20>pqtnwmUyRZ^*6=XH62zs{S zqTPho!}350i7qQx%C!r!Dk|;jV%cR}`&z8{vcwmM>$&ORY`X`st{_%I{SCi%_>Qjr zzmMhr|DlTH@-A+Juf@7W4s+x4+4ldnBCbyOzsb(dZ^{3U3d+&&X>LBTJTTq0uf^JF z?{ni_&c0gsi>*Vfz7$zjIiGW5{=(LROQo~r zx2?n~!FD%QL6-E2tN(Xcwe29ic&D3BEc;cLUvqWXStAmZ;B`0RpIGU3x#|8ptlexM z>E)nz-Fo)B`S<%#!>#3)D`%_N1Frl}taJz6;*PlK3$o%rboGB?&4!QNbg<(G32NsF zSOt9wE6pjF&&c5VCsx5Bz`=UrQT1NLvO{=3V6xbb48{}YxJ zCcnak_#r(Y!)4hK*h&}a#s{mJ1O(50{u!CzCWL4M^UEIly7t8MKau-#iUFZ_c(O z)Y3j~f`4LF(AP~Tmfg>_#j^Xuk_Nfx{n>a9AxK>}DJS%QM5>0>p|R z0oQ`(!-{%tP-9cEZ}W z-g4vj!MeoSOy7r<|A5PfT>Th)J^GihF0q1N@k8^^cYz;j(f6?IANiqzewN{~dU(l= z{}tA0D}wH7=%QgAvdY2AR{_@cb0e(tZ$nt=6WsXLa8c~;h1~T|K%b`brML-3!76y1 z%adUK`KIcJ%WB)**lO5xSPjU9)zc-gJhB4T^4$pQkhB|Cx)0ze_~SzOUp+sGpcZ}w z>yRW-8H&S7SOHc~YQySTLzsWQX8cfm8`thAkxQ(Gb%NERlAO8=~@i{+6QU=7hGSI<^JE!+Yt!%J?2SP8em z%J?cQ5AB2b=X=l956j>ZEB_JK7R&w+R?k0n^@2?K*}mg$gjg9)xOPF7{wcbK;44@S zzTl=S$feN>skQ%YX8ixxGW-vx*ZMEm0F7NKw+H_xSoL4CLb<%O+Yqr_UJka`H>~)I zu3Z_{C6->r<*F`MbK}Lzf1|6{h+zDcp{6U;auXJ0WvJuE*M+qMHgVI572nLY|A|#k zb2ojwn?62*{wtz|D->kuEzvc5LvFlS6}EM4vC_43ZL#L1K2NVptoSZ2cXf5K%1PAN zhnbY{u*&vG+~UUncUblGQFgem%l%-LI{;R@Z+Gp%u&#nEDVZPIi8D14DsZx!upq0T zyU;ZS?s4P)iPfNNH(fziIkV8!z}c|&t@~k>`=CZb4bZ0`m0&TfORNM-U0bXQ9(8T8 z;+MO&Sov4FwpjKm*DlB^=LuJTLM>Ior(8j-f}e41v3j8I+t5{zRnT*;E>_PryZo}N z7i87516{6v2bP_^-%VJMRnTE{HRK~$6&-c$PhffM6s!Wyz-r(Zu6@ppzX0pH7Av2= zCFEl^|Zaw`F7(Aouu9Y z^2>f8zy14q`rp^n|Gu97_x1F@ucwD;Tjctm=6_#L|NDB{o>>3Bp0?fam)F)hK>z!C z`rp^n?(6D*Ur+!0dfI+Z{qO5(`|0djucft#O4rldzptnNeLej@`P$lkS8%NYHQ7qL z@2SLkK~@gdnYjY2_=>Jw8P+A1{_pGQe_v0#Q$jC&b&3CdJuOe@HMJJe|IM$bxBgNo zY?j~btP^%~SfrUyKWso)(CiaMnX0i+5i=DswX26kn-j65iZ*o`pkHrhh>DsW&c~MEzt`StqEESbD7e!@Ex5iLevr1IXTo#o#y_-N4%vw=J z6V?=}WCn>Un~kC>CfE$BYLZ0N%yvmp2vMW|R0p`J;rr@l5o*e@a0l*JY1sDvXb<0exz9%1fH2(#l68kqwKVU10l z7Elv212X3t5`DG>(alVwmgvpRJW-rEEs8fS5}+1lp{S)fFG?`&T0yPMQc-JjQ4})W zT0?EjDp6Z=S=7$-4nghBT2TiR)&}Zm28lYEjgTo5M*~W>r2$<`Qd@+*681>wW@6eQ zOo>OB)DGchvr9tl76>)kBlIv6+9Mp5a702+Q?&!a+?EKlJ0SEn2PDKNAT;ZU(8tW^ zh;UBASqc42qfQ7*S|KdzgfPIIme92|LZ{9MgUrIt2$v-MDB*U~t_#AN5W?y%2!qW< z2?N_8^y`W+)U4`?5ZM+X&p`ANUh00UxXQ^cVC2U61GT~Wy1O)q;^M0>4z}e zY?M%@2SUmI2y;wQe}ugf_DGm#Vg?{gxdma;0EGEwmxS6q5o!!XSYRd$L^vwph=d1C z)jVE!x7e*T@q^FhEO9J zVZE72E1wxH z{@Q2W5P#z{<)*?Hd?r);tCG1^?hPGsXYqGark8 z^qIzY!$0{87AiCb{6BRX8XG6uzR8fpMAS!O^+y~uYW{66dW1^C#(Hy9hnI|f3PK(Nz z7IUGpW}&E@IWH=2+RbBB*5pvv>Uj)PMRQTYz!?brauF(9tm|!%mWBhW+O~`0HL1QC873x z2sIu=h&2-)L^vwph=iL=)rSz~&Ow;{5JDq!KtlXngk}p7nwS|25za|CE1{Wb^f1Db zc?gRhMu;<~C3MY2=wuyRkYL(9g0N;j!s*EL)Buq6e)*@Vz zuzW4TUFN)mHLDPMJc}^hEPWPX;1dYHOUO3e)*(bbiLibh!VGg+!ZrzmpF@~s);@=j z`V>O+dW6|#(0YV2s}Xiem}7z)5cWz)-+(aBY?mWqULi%=uwPw47DH{OQ)yo5Dx zAoO?#;e=WG4#L3Q2)|1>X}Z0O5cwv;`gajdo68cmNf^8z;WM*#KSJsrgy{DW&YD5* zA(VLwVJCwB%P%TlJijZ*Ogl&{0g=nqh8??u@!`qWm6a9{mty;Cm>)OZhX*Bz}Yv z`98|}kLY@sx%`owBVq7SgmAO=sGRcwLi90&fEjd5&N;v-V#l$t?wmJ*A0zBNK#KH_ zNf9*LB}_SpQ1KIlA|~w0;A@&49jG1}@A^r%$ z2?;ltI-eq(ld#}Zgp%f%ge4y$v_6SY+RQtN(DfsP3lhqj7N-y{Nmzagp}aXSVa-v5 z9;Xp1nx&@^1|CEBT|#Bk?F>TX#|Z1sAXGJ%C2W&0_%np+X6Q)`$( zpCgnxPKuqMlcJUho<-Pu90!d(i-YQz?GmP(AVtM5NKwzEeSuK>Q-u8zVoljE5spfj z{w2aqW}k$)ClO-LAv7{m&mqL0LO3CziK%m*16ETrL)6S16E!!DzJlV+JW;$kEoxy} zd=0fU3q=X$yr`9F_YKtAEER>!MNu2m?E=)+tP-^|mqqPO?{A?FX052B3HuJ}WCn>k zn~kC_Ciowyt4R`dGuuUpCgvh^vq=+mH@ieVOxf?DTg(JePqRTRZqZZ!u) zeN3JIg8G^nqJHL>sK06SBQ(Iw6Ad({MT1O>pP<{!LecH!yyyH)Vf^#+eDC46{!(-c_b>I*UwxIVlOmPgCvL#LpUM9GIgR5&PiAh zg|NsRld!~((7FhMG4qNbbPY$iAYrL#aUH@X3CpiTc+8xau%-|~k7$JDW@$9SzyQMU z5>}dS*CRwmAgsS0VU@WoVVi`(MG>AfYl|YJ7Dk9JhOpWUDuz%d5@Dx=XG|~#VXuVr z7=*QEyM!r0go?!x)|s^82(_aS_DfiA%HDu*RKoNd5S};tB+M;>5L*IaqnTO)A^tjq z6B0I?IwcX#Nmx)4VT(B?VM#PX>rx0?&Ad_wU9U&DAYr>{Q5xZrgyp3XUNPq-tSO4n zqYT1Mv$PDtz+wo$OL)z6D~k{rgRs6V!Y*@J!Zrzm%OUJGYs(>|7DtFKkFduKDvwa+ z285jw-ZsGs2zw=@S3uZjwo8~&0-<6>gm+9@MTFWV5%x>iZ^~9eI4WU!C4~3QJ_&P6 zA;eZjIAEq$Mu;zsa6-Z%Q>O~TISC7@ARIBrBrGX|(7GzZM`m7Cgsx=~E=V|LT2w>0 zBw=|qgip+Q32VwB^r((-!Yr+hFt9wr?-EWr_n^oMe)q<9+7Y%%xTA*u1HKEckSSK% z9~nsFcW=@9%Elt)C$#auBeAUaUpps{O>4maduRWK;V7SV32xok$^S$6 z*4OL#`$pJBzI&@b(qE^;)^D5nM}`GDcI8t?yk?|rFT_#Tf0DnDf7qC<&{Qu)IYwLUM{NINK3Qtor?JE7{XKdZj$v>n}^r(lO|9@u!T@270^QJ*B|83FU|AqGE3w#fN-5YsnZKpZi>-U@Tool`w>i;&{ z`p*8?PR=qoMl;21#rZXpRn>3}(EvMx9jp>1q2SN!gG$%v%8w#pWj;}R_&DB4v-k&p zLd8G+bS`OiiPCR*^+g)G>Y9r`_;1LrkE~4kMR7&xT>44`CDm{K?o$NUO|GU-R#bMi zhOVYx7M63hMy{q$XcTj`#;&HnYyXbKi*q%7juMzkKjeC$ovW2ZYv5|_vt3aiuJk^m+`-lKsl8Y? zq5kYwLsABKpK|ZyYWjqz_d)*7uBOjOKSWqp7gsA!_$^!EgO{$BT>-)SIs<*#fGW{E z80Kb9bhS!oJKY}N>}r+KUUjwZXv$Iryyj}RxLQ@T*Ilibo3|R;E`7R6S8rFWPFVk? zw60s-%r_E#)7ARAS`D;4Xd1)*u2z%q1kG5kfo^%V2xq$5AXlr6wt=v&+q}=Y*TK-I z{N>);Va3-4hk@KS7(t$?2aZ#*dOpNWSD&yxW28%7Q#wu5(`eP;BsX0H!XKiklgX}j zllp%EQN2uY#fF4ysuZqKXbLt0`kDbXG}YA_6Q1T)oaSmx(7r@dqei3g&o}U-e)6#r z_tX1PttK^T9IDc^N>F1SLTk@B<$C7JLKbN^ND@xxNP%fW9Q*OK=wG8yP+a+Ql@HMt~GB z(p>(il3=9X!K$E{J?z4A8eXdQP#(NQL0WX2AU>m4R+sgrMhT8n}DL-v^Yr(Ui z9UGAIoh5`b4@;?OPK81NJ=mmO%j=D2;0=m~X0u4bMpo2p@p!>baN+jG$Y1Ymfk10o|(GgAPCk z5Z(9Nf?Z4$-6wQk&^JJQ3{HVF;1RG0{7$-TeU(TZ&8n71pNICbz^S~T19oz%t}PNp`~vi4W2e9w z@EQ05d<71IL*Ott3XXyG=Hj0mPd5?Nx2eqq^FS_`5AFvGKy^?9=zduX)CP4xUGODM zI0y8-brGO22m_ze^sV49co+OknoHm^SWMUSQR~TIijF5!3Fs!P4|e}Z|9%4ZlkiUp zIt`xzZxh}NwgY`}P!3oHo&b-5Wnekb_uJ{a>_VVDhz6%gZ! zs65aatpU(yway;We|* zU}_;o0J&B!J_-0|pQW^EzXe_cTC85$LWBcg7j--UG?e;=zq^3G@oy^7HvsC?sV9nP z5Cw3i{gK_mFwHWh!^6wk-=n37BH%iZMaHpU3`hg1U=$b$`hYmnXv{VCy@0;Muo+qp zxI4HRG{x2dFOje&cUQOzXbyH_%Q>1~+q8RV({6&%2xv8ERcLi+rD)Yu1MiSVTTpqR z)^`Wmj&uho3+o#kOMv#+S~;y?-6h@zZvovoc7r#-E}*R|0mSRDq4Tbur)q;*peCpR zZUogqHBc2)1{HzM*?N>I4XS`jpaRgNjLzkHM7ja!*((N=Fss7DZ^%|w6``V3q>7FO zx&hS(bwNEhEGNsUo+EXF)@l1D&v<0i8i7pt8GBzkM*&0Wl5q z0k?wQK!?R1peIng3X<(<9xJY|t9$8Eu}6WCAO+kGbhsP@`h$L8AQ(XXcHtvn2HkGu z5O^@S1E>dTsVYwb!@y7%!(r*FRE-=B)TnVF9gG2EU1Y&J%gMtkGZRbz*`A?-Bu)Yo zff9O&yzrd`bfs4TQ@~{4HB$Oiphl@v>bdeOUiRHU4VQ+UZTBD>L*w%>mYW;{ij=0H{lrz;U*of{WKiWQBo(Nj zr-2$E?HM4iv;~^kYe7dhEO#o;C{S>{KZ{*(y(`~ypcPP9`I4#MJ}|xjrvNRN4d4#Y z9w_m8prLslD5EM;1HB5oc&|{!ZFb|8e-ls|Rp?c&GF}APULne?o+^2cMo?R zphD!GwO|c+9&7;e_j;gldJZU0IM_^h3)l{}ftSG6>-h09P@xme!eZg2vnLW%9zAv( zBpeR=K^R~?+fSJ9q8|Z&fZxIA;8$=NTmnCXpTLJ85Bv!J3w#EC0AGXi;2rQK_yU{; z?`uTfBd{Or1AD=nK%<~boqhxC1_h@^N!qr@O{X-n--h2Rpeel?QeRdwdE_UQ!_+0rgm(IRsRh%27u?0P2+T>GC?Fyh@|AD*u4yjFaR_qJkAG z@!@Nv@e1`=1zs!Nar94s%27kTik0?bkbR6FN5R#N@CsAQy?BLHz}0C_pm{w!N%&J2 z1^--vE`V$*K9J395RsuhlEBrON2J_3GYenQ94Y>0N}s175!WxVmR6O~J6|0Xm*- zyVz^7Dpc#diQ{F`5-sRzrN4S;{?23G(5Nh31&8|GFxI~k$Q^Q#+$Gm~Yul?tE|#a{ ze!1K!>aT@eJtUc&*8KE!P(8ldc&w!{dyU`3_J#wfH9PfUan>;4bh^biKlFrgT7!Z35qoRu>)x-vw$D&Va{(bT9-|Mk}xN zUz1Fw5e9=hKznRG1>HngZ-Z-q8^Ip5*Fbf`ufo+}{fehJD2A=xsPSHd8xw8_ZUSoP z4zL|;16#m4u!j15Rmpf4Min>%R%7&l&;hguZGjq861@~C3-nM?39bnA3(7LU)5Yao zt%9o;jIZp*DPP5GeyFfE;J^FyJA$-&z*QsFFxe}?)h{gMt(ue{3+jN{pcbeH>Vo>9 zgy!AN1T?k{0S}Y*S-nbjW2{D?9wU_qcLQBP7tk5#*J2$(2hbk018qSY5CW}1E06&6 zYcc)mD;~rF{W?v*F4M2gx>3Gry`AuFU=SGS=k0&_@Yw9`7;55Jcqq_p(6kx`l0Y&T z4n}|!FcPGK8z?jl9u3BT8rV02T3`sc6KxWh2(rKgFdhsbuAiGGQ@{S4j5rlc0n;TV#SHLo$weT{$25bjPw+U~*$li! zzCd^b$bOz5a`{GAP*{n)glfH)SegnK%NuIMF7P^dgGTIu-vqm5gHDw7He3eYOZ;8% zG@!jV61=1F|AYj2U>~r+UV+GuVG`JGI|v^FAAuv_FgO4{0Pll$fn3~-d>RUGSl%PN zA9(q_JW8*$Tl|c_A{8M~PzJf}ED1c_^MG8aN|o+IptNd$8tOIV7~!Kp!=^FTSbLp0 zLAVZOe+oAY@E9pqyt#er_m#q5@S7b~!^@SgKva0-8@q*d}@@6uT7q_;pWsm{Grb+wZbd;M-(#SYK50+ zzP*tBd#s!Ry$|;o{QbVu{;(m98Z>Oc*8Lo{$B-?m=Q}xhkDq8xOydTPi1h6Ym>uM; z@IEQn`*XgEsK0acr=LG#=T!pV$$zMdJ@!ql%zbJ9ssf)sx?op4Lnbzc=D1-@y}h#exr467U7-Tz30 z8UI3fX|tzpcr*Xw5#~3<3hT&LhHOVOD=b<0Qex#Rz1SULat4K$HPh>b&+xw+vA90X z`7pvX6`zbS#S+8I_`i!VGwX+sY<`JSicrewv&(0F`$qf&S4s&lZ2$5vr}d~0M%+DT z^o?pbt)g8;3!6%@c&P#@ijz0~Ld&It3(tum1wLxppqZ~hVRLE|wZs)RRhq)R3Y*7c z;nc$BR)<(?}aA{g*9x@qzMK2J}+#>D@8a< zt0F0S7Ajvcy~rC$g~Bx4x@%X7G^ZL;cB@G9Dk=T9MVjZZD@-9r1#%qOl={%CkDU)) z$?-^}x$Y)Xz7%PODCdWfrY&~!ugFn~9Cv*){6E*tT3etMn!AemWq!Nr_Z(U}=}P-b z1TbC5&Nb%jk6N|1-+*0~VijKr+oGO&RJpXKyq90y~xg%(flea=TDb)M%PlvY6 zyzA?gS5nLjnqq3*BZ-w_rp;`6QxWzL|L_J-d z6bz`QbY_gH!WuMJ%Ej}|w7G(y?XD7>8iG{$BM@cy>E)4~z2OwEcbbfpR> zdEkcx7^%+Q@HA&7qs#b zV${Ld*VlZqx^$y7Vw&0!z7-`+g(kG`SyDukV%6%*X|Ft8QEQehrV%^D){>@I6NYME zNpmk;;UFnBG3L$w?M;)$pNMNKv7O~D#cxWQ6lMDCA)1GqYnCo~|6|F|(U9g&L%b5a200at^e-!G zYBvub>F-dvH4@ZXIJs^?kR8T$5G4S@@9kh>RJnzcIIQv)4vt{ zz3!PDe^^~=)aB*y*vomf?X~}DHWDUi&aASd-p#8uv>cvbUTe4Ua**}UWjLI z^36UCZ>9UCD>?i1s(X%C>vB&ajeQfxk@YGqR<72S%&_ew?CB=#xqZcp<&N~#G>UT) zCRZ}IDCN{jd`y6$E>hVn!>&-hvg5b6bJiVMvT^lISBmypbh3&W-<6zSS22ZJlG9(+ z+|hxY6{|W^wrtTwL#`X0TOenxs-{w3a=4>wdiA9*-jG+TW+8YUV%f z3h=P%rV4h2zjwaZFxTl7cGs}~$RwwF+Ubbs%Tc=hHf8DaFz7kAOign%fu`54X|8KU zUDIotwpX~Ze`zfOo>o|M4qeM#1%Hxab|y^&z8J#W4n6~*&VbO^t*M;3(D!`aJj-`OjKrHd86vgobGqd+VP*3z4=I`E0uO9MmNT+Ju|=D^n9ZBR<}8+_02=Q zD8ritZoU5D?v~@}?yRZs_jPzFoz|79uq)O%D#TWpJ!Hv)uXnjprvdk| zoYy;$rQTcQ?2TVxsrGNtkscVID|YCxdHtjBz8N_AjfyIxs97pu2Ef7d|uv zELo^F?>ebhz<# zKI`Ri;Yz+i3PlyV>k6Xn-G!P=2ea1=h`&H#Q~T|t4h{9H`7A3|rdIT-NTX?raLv@0 zyROc@pax5i8IW#T%3}(DUP+o-E2na%sw<-UOuiyLg(+POqk7vK-c#4!Qgh8?q=`te z^xo5k+HV=|KHso%2xn4$HQ87L*y`kZFJ(jYv7e_vD@tfT<4T8E+*J|)^-Wi@*$;CS z9J=est520@#XWV~b)4hY|FIjjrzn8u$a1vE1f>c3viWnqmAzL3Hj6CDKz^mTvZiK7 z|BQ?}Xs#jUOGt~ShSF(?k`t*A#xdGwss5eCYWF0>On0*$>J&#=?G zIv#F*_F||3(anvn0-+lPL|gFKaQt!WRnvN~HAb@1aqw!^ zA~&unz6i5dg2D^#EiA1jdIXQzngDmXv`=4=`0V)7tf)r@WzBM@hyhUNr$8`gH8%_W za^Rh(M+}G^ps*d`TZ!AUQ#W~#fpXZL4xp`?n;X_b2Pz)`vr~F~;r-HX^zlI8jnJzu zFwe7lv#z`uuHHsyMlpG^8Z0%Z5??sjQxCZUQt#1e=JAbxXB9$T#chPPgo91@7;hrHOo<{tcu z1@4Sy_WiP(v}T6}Y>x_u?&U@LP`KDgFYfYnSLbUtCWOxh!i^)I&m2k3ax|lfTcj6- z4aE*x2%{vWREieH63%L4;mu#voqrE>nEx&v@`JGqY)KdWFu)7%l7&B>c_Vqp;pJat z;7Z@RaXt9XqT}|E8;_=M+=yW*k<3U2TumS`4iQI1S|hU6k;5RE012W;Pue*Q`W%F_ zZ0u_EH~zjg?4jdPmWeCYB#>fLBseI)`Ly&G8!W5q-aLn1*GAu|WBj-=mL}hO zQ^|0ttJ<*_*#<}*)DFF=X8@l02}^%|xMD-s10;>rn%;cRoBY;@PulMFc*n|QUT?A* z0ra-s`Bt-M^^A1hnN_LK$q)%DB=U` zAn*6#-j!u#(|FXUE9aYA(ljL;Jow)(l!zR_2vI3c8{IV^u7T1T zl*fT9V_i~DKQmBF`_ac}t7+9wu9?=4IyKe1XWzMn282&PI>NYz0>KiIHlcBW3oiY3 z!hlFn+AjM@6A(M&_x1+Lj(*f&6xyBwf^9Rq*Bul(E%DS?1L9{;*l|&d=z%6TVv6(z z%Cmkn5^Xij`t#`9@aJ=#J3Y;PYCyR5r=(HPd$Xb396nssyW;E3jxn-7%X)7;l&-M; z-}d8K?UgHs*X+<9e1{#}XkFQ(IFU+a^nXS#LlLRN96GZ+P}Y^0)6ADC7JombIM?1e5GmO4Nh(-5+Hc5KBO@2Bp*F zrgb0YO!6^M()=k8Z8cvh+_jD7`d`~Wc#HvY%0DF-%r7g3va4dv9tZGIed4=HEs@Z6% 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 o$;T{n{!M9@N#^c{(%n(C diff --git a/packages/core/src/blitz/catalogItemAccessor.ts b/packages/core/src/blitz/catalogItemAccessor.ts index 256788d1e..0dca3cf8f 100644 --- a/packages/core/src/blitz/catalogItemAccessor.ts +++ b/packages/core/src/blitz/catalogItemAccessor.ts @@ -22,6 +22,10 @@ export class CatalogItemAccessor { } } + undiscriminatedId() { + return this.id.split('.').slice(1).join('.'); + } + static fromComponent(id: string, component: Any) { return this.fromComponents(id, [component]); } diff --git a/packages/core/src/blitz/metadata/abstract.ts b/packages/core/src/blitz/metadata/abstract.ts index 7b23a433c..9f274b5c5 100644 --- a/packages/core/src/blitz/metadata/abstract.ts +++ b/packages/core/src/blitz/metadata/abstract.ts @@ -1,9 +1,12 @@ import { LocalizationResourcesComponent } from '@protos/blitz_static_localization_resources_component'; +import { ProfileAvatarComponent } from '@protos/blitz_static_profile_avatar_component'; import { RemoteStorageComponent } from '@protos/blitz_static_remote_storage_component'; +import { SellableComponent } from '@protos/blitz_static_sellable_component'; +import { StuffUIComponent } from '@protos/blitz_static_stuff_ui_component'; import { BlitzkitAllAvatarsComponent } from '@protos/blitzkit_static_all_avatars_component'; import { load } from 'js-yaml'; import { minimatch } from 'minimatch'; -import { CatalogItemAccessor } from '../catalogItemAccessor'; +import { CatalogItemAccessor } from 'packages/core/src/blitz/catalogItemAccessor'; interface LocalizationConfig { namespaces: string[]; @@ -102,11 +105,26 @@ export abstract class MetadataAccessor { } injectBlitzkitProfileAvatars() { - const allAvatars: BlitzkitAllAvatarsComponent = { - avatars: this.filter((item) => - item.startsWith('ProfileAvatarEntity.'), - ).map((avatar) => avatar.pack()), - }; + const allAvatars: BlitzkitAllAvatarsComponent = { avatars: [] }; + + for (const item of this.filter((item) => + item.startsWith('ProfileAvatarEntity.'), + )) { + const stuff = item.get(StuffUIComponent, 'UIComponent'); + const avatar = item.get(ProfileAvatarComponent, 'profileAvatarComponent'); + const sellable = item.getOptional(SellableComponent, 'sellableComponent'); + + allAvatars.avatars.push({ + id: item.undiscriminatedId(), + name: stuff.display_name, + obtaining: stuff.obtaining_methods, + description: stuff.description, + grade: stuff.grade, + category: avatar.category, + hidden_if_not_obtained: avatar.hidden_if_not_obtained, + sale: sellable?.reward, + }); + } this.add( CatalogItemAccessor.fromComponent( diff --git a/packages/core/src/blitz/metadata/socket.ts b/packages/core/src/blitz/metadata/socket.ts index 432ddd8d3..7ecca8912 100644 --- a/packages/core/src/blitz/metadata/socket.ts +++ b/packages/core/src/blitz/metadata/socket.ts @@ -16,7 +16,6 @@ export class SocketMetadataAccessor extends MetadataAccessor { async get(item: string) { if (item in this.items) return new CatalogItemAccessor(this.items[item]); - throw new Error(`Item ${item} does not exist in socket metadata`); } diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index deba93510..e5c97dd6b 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -1270,14 +1270,16 @@ "no_description": "This avatar has no description.", "download": "Download", + "enlarge": "Enlarge", "hidden": "Hidden", "unnamed_avatars": "Unnamed avatars", "search": { "hint": "Search avatars...", "results": "%s1 avatars" }, + "categories": { - "0": "Unspecified category", + "0": "Unspecified", "1": "Premium", "2": "Special", "3": "Accumulative", diff --git a/packages/website-ue/package.json b/packages/website-ue/package.json index d850d814e..56ea0302e 100644 --- a/packages/website-ue/package.json +++ b/packages/website-ue/package.json @@ -26,12 +26,14 @@ "@types/semver": "^7.7.0", "@types/three": "^0.160.0", "astro": "^5.8.0", + "fuzzysort": "^3.1.0", "immer": "^10.1.1", "lodash-es": "^4.17.21", "minimatch": "^10.0.1", "react": "^19.1.0", "react-dom": "^19.1.0", "semver": "^7.7.2", + "sharp": "^0.34.2", "three": "^0.169.0", "zustand": "^4.5.5" } diff --git a/packages/website-ue/public/assets/sad-ghost.png b/packages/website-ue/public/assets/sad-ghost.png new file mode 100644 index 0000000000000000000000000000000000000000..7043f570446acff2a6d150a05772f5d01a9e65bf GIT binary patch literal 2345 zcmV+^3D)+BP)wJM_ys@6XU^>u+ss4Tz>_Dc0%fX_Kb57QNX-5GwNM z$B!R<9ivPuvFL%eX*z4uw6;r9KqG8IpTphR*%=az&_=AYv$Hxi3>|u)t0W`n^9}CZ zyXWd+K(r8xrmZ#=sY!AGQTFra&z=rxQE9PYBB)T^D5sYp?t=#pT%s__ij~Ghq<|XC zv7>5~DJK?81U+C~B4Ek0L}l}#lvpqkRIF~n(G-Y^3uz_9LNw7L-^$BGBn44M9iu~Q z*_bGRbg{mF|6aR&`*t@=OP&Ktm=CF9!9>tAw@oxa1&c35tR#Is6`;SjPj9ZQ{$k-` z(X_W~+jd(86Oj~I=A$sNR5cMvL0YU-Dt+3n8j*r1M65jeda8i_;{E&g`=kJJ7c0-c zo+=b&K5`SQ;J%(JwhOa!e@9V$|T6bL;y^yaO;uGeeyCU-@U zSAQ`xv1FJC&zlg(amZwHdGD}Vt&(oHL+|AVHY`3}ll8OO+)OQ&EK5F_Oh~Wi5Z@0z z4s(O82kqozo)E6cc!1qR@!j?dx&}>tsY56hDJS~!v#A3lj z(6e_>*4n9Bt#Ld?sbyV@9<#?7MkNUmPJ=4-^@hU{aos^+gtb~t(rl(0g35(7{Y4?M zXv%BQ1JhB-lB0GF2E)}oKr}TPjg>1*@?1!-FfK4HzR&J2pA4vncpcp1b!xS$umerf zU*r<&ruFq0tgem6lh_&<2ZY<*ZLA`i7tzhlSg~$mUk}2JM(bM|fi^+P#SNk*fUENn zDV9!~gFHYa*B#u16Zqd}6u7vYg{6MjE-5d-fsYt9FQmd`&Qc%<& zG80Bq7@<*iO)MFGJ(iY`k??op0Hr-s0StrVxI!Y~z$2ZZ{$wlyH(?h~lr|n9rLX5W z{gqHxN!v1lrH8fWtx0%2CXxyS^%qxS$(k^N<;Fn`0|)TYqb?C)9Zmg}{pJDD0|%#y zNCEsxi#F;LEo@Ro!C0p}3>aDIpi)-vLCgQ!aoiYM(Mn%eF5>Rw0ade^p5H)N*+=EOvZYT{l+ zliC!C>$=1q3#wG3IiDgi+T%@6=k1QgDrI9fI!$O)?KLe z-|MWtUgZVYU99qv(`9diN5RZQT>XW!3$b4XejNCuN`-2t6Da6~?(3FhXHKDEzLv+H!zs zV*Si8LI-9LUB|~gCCtZq4HlmMbQg-P7o&s%wq-5Hi$y6kcc>6$Q6ptYeL4%p+t0kX zn0eNGUWpBz^+4rGtnzsgwjTu}p{to-L#jLr`{j~MUc7iRvYtHIAJGT9BnIYC!iryB z;B~`Zui4boo+DF1D4tDG2z7dD_we-?p|C>9egA1hY?-KuW{QOSrHXgDz6EH zU?)8G+j!b!zP}tpsFyGISGrtkx4(XURNdK`(Y>t_*RsEe#V5qVS$Gw+k#w@@QI`BF zG-&+UZ00_D_Q$0X6}UHYc=&gV+Tj-AAnz+S)~@vA+W+Gf*9mdF~T^_|UtSHgt$A(Se=CVm^5K^taIKlS9{8Q1|&^_kKRo;`a8my1<=8fy}XGDJkDqfQq; z3q%X>$CI9^Sw##E8qR3=m zaGe&X)GbWOGy0L}c05%L3&- z>`b)3$P;BM^!2hpIkAAK`G9EbeU@0Dp%lSDunWt1-y0*%=3w3^DHcP-;->{BVluH$ z^6KklL8>=2&YSgEw|&er)}02Jh)VjU3 literal 0 HcmV?d00001 diff --git a/packages/website-ue/src/components/Avatars/Group.tsx b/packages/website-ue/src/components/Avatars/Group.tsx index 1cd9bf465..e562a8b10 100644 --- a/packages/website-ue/src/components/Avatars/Group.tsx +++ b/packages/website-ue/src/components/Avatars/Group.tsx @@ -1,6 +1,4 @@ -import { type ProfileAvatarComponent } from '@protos/blitz_static_profile_avatar_component'; -import type { SellableComponent } from '@protos/blitz_static_sellable_component'; -import type { StuffUIComponent } from '@protos/blitz_static_stuff_ui_component'; +import type { BlitzKitAvatar } from '@protos/blitzkit_static_all_avatars_component'; import { Dialog } from '@radix-ui/themes'; import type { MaybeSkeletonComponentProps } from '../../types/maybeSkeletonComponentProps'; import { Content } from './Content'; @@ -8,11 +6,7 @@ import { Popup } from './Popup'; export interface AvatarGroupProps { name?: string; - avatars: { - stuff: StuffUIComponent; - avatar: ProfileAvatarComponent; - sellable?: SellableComponent; - }[]; + avatars: { avatar: BlitzKitAvatar }[]; } export function AvatarGroup( diff --git a/packages/website-ue/src/components/Avatars/Popup.tsx b/packages/website-ue/src/components/Avatars/Popup.tsx index 610f6a546..35cde9458 100644 --- a/packages/website-ue/src/components/Avatars/Popup.tsx +++ b/packages/website-ue/src/components/Avatars/Popup.tsx @@ -1,6 +1,12 @@ import { Grade } from '@protos/blitz_static_standard_grades_enum'; -import { DownloadIcon, StarFilledIcon } from '@radix-ui/react-icons'; -import { Badge, Box, Button, Dialog, Flex, Text } from '@radix-ui/themes'; +import { + CardStackIcon, + DownloadIcon, + ExternalLinkIcon, + EyeNoneIcon, + StarFilledIcon, +} from '@radix-ui/react-icons'; +import { Badge, Box, Button, Dialog, Flex, Link, Text } from '@radix-ui/themes'; import { Var } from '../../core/radix/var'; import { useLocale } from '../../hooks/useLocale'; import { GRADE_COLORS } from './Colors'; @@ -13,8 +19,8 @@ export function Popup({ name, avatars }: AvatarGroupProps) { <> {name} - - {avatars.map(({ avatar, stuff }, index) => ( + + {[...avatars].reverse().map(({ avatar }, index) => ( + + - {strings.common.grades[stuff.grade]} + {strings.common.grades[avatar.grade]} + + + + {strings.website.tools.avatars.categories[avatar.category]} + + + {avatar.hidden_if_not_obtained && ( + + {strings.website.tools.avatars.hidden} + + )} + + {avatar.sale && ( + + {JSON.stringify( + avatar.sale.reward_list[0].currency_reward?.amount, + )} + + )} + + - {gameStrings[stuff.description] ?? - (gameStrings[stuff.obtaining_methods] + {gameStrings[avatar.description] ?? + (gameStrings[avatar.obtaining] ? undefined : strings.website.tools.avatars.no_description)}{' '} - {gameStrings[stuff.obtaining_methods]} + {gameStrings[avatar.obtaining]} - - + + + + + + + + diff --git a/packages/website-ue/src/components/Avatars/Stack.tsx b/packages/website-ue/src/components/Avatars/Stack.tsx index 91f71bff2..872cec724 100644 --- a/packages/website-ue/src/components/Avatars/Stack.tsx +++ b/packages/website-ue/src/components/Avatars/Stack.tsx @@ -11,7 +11,7 @@ export function Stack({ avatars }: { avatars: AvatarGroupProps['avatars'] }) { return ( <> - {avatars.map((avatar, index) => ( + {avatars.map(({ avatar }, index) => ( - {avatars.length > 1 && ( + + + {avatars.length > 1 && index === avatars.length - 1 && ( (null); + const [search, setSearch] = useState(null); + const [searching, setSearching] = useState(false); const groups = useMemo(() => { const avatars = allAvatars - .map((id) => { - const item = new CatalogItemAccessor(id); - const stuff = item.get(StuffUIComponent, 'UIComponent'); - const avatar = item.get( - ProfileAvatarComponent, - 'profileAvatarComponent', - ); - const sellable = item.getOptional( - SellableComponent, - 'sellableComponent', - ); - const name = gameStrings[stuff.display_name] as string | undefined; - - return { avatar, name, stuff, sellable }; - }) - .sort((a, b) => a.stuff.grade - b.stuff.grade) + .map((avatar) => ({ + avatar, + name: gameStrings[avatar.name] as string | undefined, + })) + .sort((a, b) => a.avatar.grade - b.avatar.grade) .sort((a, b) => a.name === undefined ? 1 @@ -75,10 +65,50 @@ function Content({ skeleton }: MaybeSkeletonComponentProps) { return [...groups].map(([name, avatars]) => ({ name, avatars })); }, []); const [loadedAvatars, setLoadedAvatars] = useState(DEFAULT_LOADED); - const filtered = useMemo(() => groups, []); + const filtered = useMemo(() => { + setSearching(false); + + if (search === null || search.trim().length === 0) return groups; + + return fuzzysort + .go(search, groups, { key: 'name' }) + .map((result) => result.obj); + }, [search]); + const requestSearch = useCallback( + debounce(() => { + if (!input.current) return; + setSearch(input.current.value); + }, 500), + [], + ); return ( + + { + if (event.target.value.trim().length === 0) { + setSearching(false); + return; + } + + requestSearch(); + setSearching(true); + }} + > + + {searching ? : } + + + + { + const paths: GetStaticPathsItem[] = []; + + for (const item in socketMetadata.items) { + if (!item.startsWith('ProfileAvatarEntity.')) continue; + + const id = await socketMetadata + .get(item) + .then((item) => item.undiscriminatedId()); + + paths.push({ params: { id } }); + } + + return paths; +}; + +export const GET: APIRoute<{}, { id: string }> = async ({ params }) => { + const item = await socketMetadata.get(`ProfileAvatarEntity.${params.id}`); + const avatar = item.get(ProfileAvatarComponent, 'profileAvatarComponent'); + + try { + return await fetch(avatar.avatar); + } catch { + return new Response(null, { status: 404 }); + } +}; diff --git a/packages/website-ue/src/pages/api/metadata/catalog/[item].pb.ts b/packages/website-ue/src/pages/api/internal/catalog/[item].pb.ts similarity index 100% rename from packages/website-ue/src/pages/api/metadata/catalog/[item].pb.ts rename to packages/website-ue/src/pages/api/internal/catalog/[item].pb.ts diff --git a/submodules/blitzkit-closed b/submodules/blitzkit-closed index c390ed62f..7f4ec5f5b 160000 --- a/submodules/blitzkit-closed +++ b/submodules/blitzkit-closed @@ -1 +1 @@ -Subproject commit c390ed62f367e7b5559ac45f5290eae313e7b952 +Subproject commit 7f4ec5f5bc17d7dbd778398e888bcefc846e0080