From 4b9b0094a61c76896bc383c7607ebd5a45b7e041 Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Mon, 30 Mar 2026 11:46:17 -0600 Subject: [PATCH 1/6] Add bounty icons --- public/bounties/aaron_best_build.png | Bin 0 -> 7932 bytes public/bounties/auto_clicker.png | Bin 0 -> 7809 bytes public/bounties/buffet.png | Bin 0 -> 7694 bytes public/bounties/bulk.png | Bin 0 -> 6925 bytes public/bounties/change_name.png | Bin 0 -> 6589 bytes public/bounties/dagger_pants.png | Bin 0 -> 7357 bytes public/bounties/doink.png | Bin 0 -> 4548 bytes public/bounties/empty_hourglass.png | Bin 0 -> 7096 bytes public/bounties/everest.png | Bin 0 -> 6017 bytes public/bounties/fourth_quarter.png | Bin 0 -> 6536 bytes public/bounties/from_scratch.png | Bin 0 -> 4269 bytes public/bounties/high_pitch.png | Bin 0 -> 7892 bytes public/bounties/hydra_space.png | Bin 0 -> 7332 bytes public/bounties/hydra_space_alt.png | Bin 0 -> 4553 bytes public/bounties/induction.png | Bin 0 -> 7637 bytes public/bounties/irs.png | Bin 0 -> 6376 bytes public/bounties/mmr_money.png | Bin 0 -> 6644 bytes public/bounties/nine_hole_hitter.png | Bin 0 -> 7498 bytes public/bounties/polycule.png | Bin 0 -> 6257 bytes public/bounties/see_more_deck.png | Bin 0 -> 5351 bytes public/bounties/showman_cycle.png | Bin 0 -> 8367 bytes public/bounties/singleplayer.png | Bin 0 -> 5453 bytes public/bounties/six_pack.png | Bin 0 -> 7888 bytes public/bounties/skipping_stones.png | Bin 0 -> 5483 bytes public/bounties/studious.png | Bin 0 -> 6924 bytes public/bounties/yard_sale.png | Bin 0 -> 6477 bytes 26 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/bounties/aaron_best_build.png create mode 100644 public/bounties/auto_clicker.png create mode 100644 public/bounties/buffet.png create mode 100644 public/bounties/bulk.png create mode 100644 public/bounties/change_name.png create mode 100644 public/bounties/dagger_pants.png create mode 100644 public/bounties/doink.png create mode 100644 public/bounties/empty_hourglass.png create mode 100644 public/bounties/everest.png create mode 100644 public/bounties/fourth_quarter.png create mode 100644 public/bounties/from_scratch.png create mode 100644 public/bounties/high_pitch.png create mode 100644 public/bounties/hydra_space.png create mode 100644 public/bounties/hydra_space_alt.png create mode 100644 public/bounties/induction.png create mode 100644 public/bounties/irs.png create mode 100644 public/bounties/mmr_money.png create mode 100644 public/bounties/nine_hole_hitter.png create mode 100644 public/bounties/polycule.png create mode 100644 public/bounties/see_more_deck.png create mode 100644 public/bounties/showman_cycle.png create mode 100644 public/bounties/singleplayer.png create mode 100644 public/bounties/six_pack.png create mode 100644 public/bounties/skipping_stones.png create mode 100644 public/bounties/studious.png create mode 100644 public/bounties/yard_sale.png diff --git a/public/bounties/aaron_best_build.png b/public/bounties/aaron_best_build.png new file mode 100644 index 0000000000000000000000000000000000000000..1db0625900a1d6d2d4d3c1f7832a701246f3e49d GIT binary patch literal 7932 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 literal 0 HcmV?d00001 diff --git a/public/bounties/auto_clicker.png b/public/bounties/auto_clicker.png new file mode 100644 index 0000000000000000000000000000000000000000..7c26afec37ce215c10db189576d73e039e2438ce GIT binary patch literal 7809 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
    *(H&Yl_4}yxv%R(4> z3WvGY7>bzMZ<|j|npz^+S~pqRbl6?EJ@AadLUp21ch?uiX`?UL;Z;&`Q@t6D2>0a4 zX6WxPbVMt__FTmsO6R#5gWbSVMW!|~pR;e~xIYjB)x>cYY@=T^oM>pJP^n{_Y9hPY zyYCHTP%vkQSk2R=J&HE)bkT}!KYxcId7)ntG*8#DZE?-$*FVmv|MruDZ-%OBHLmY{ z8d|MO>^#L-0}Y}P&KV#Hv128z@`srn5r(?YCLeMw_^FdMQ%4vCsNEn&BG!nV+Lbjb z^vppzkz--`Aa3ek7R`XFiJ~sPXLlgIjKs_;5cDflAz`kYv_;mYb1Ytz=j|`L-+R_L z>gP_%BQlfoljJK;8r6R`3t4f~Ol1x&tiot`Ev6UptiS*6wu@Ii-0UY++?8c0Ykto6 zPUxE6Ab9d;Rf(J1^$yYGjsf%wZ&vW_Id^VD?66c(E1inyQ3x-QSdAHS0sSmaEj*lBSs!ZCWoi7S>xz~o zR_Bp6ovVtgN`2{ixcS%;@jJX(OxFkevh)zl=mJSsDTNAo)Gg@vvS5n5^;lHvd|@fu zRoiB2jzlwr97_Gj0S2-@2{mJVo)<))L(v)QK$m4_2anPajq-Q#hr~BFd%HscQJ<^wFg`S1z?jtOJTHuvtS|`?=X{j% z#cy)8(d9RSez0b~?PaQzG-s!sKETiY2^bEa@0wPupCiA?aCTF@GPvUcep_Iq1R0Q3 z8x5_K@ag7A^vm?R)rGSNJ-K5vx(l*gdSwNd-H;Hqd)xkfKi3zj`T)Ug9H@q-89A=W zVLg=AMt_(^s4+zh+Qhnf+G3k?qDxrA$d3hG0d}V0BUWSdu$@CxvCWe&4R0&VfC0l9 zCuJZCA$z?Yh^rQCP2ctWoW-x7Fj;GBEhLj%`}!6&3<|rS1II!Q_(#8 z*>Kyr4z0?TGQg&I#D$N@KAx zVJF6Yljzp9$ERoZe_QxkP#(fxtZBZs#GCe2Lq=97R74BEIG_YJ4`t^pb=S;aIk=Y7 z@Lr+t^(tUKN7h70Y84;z%stWx7*&>4CAWU5`~v3SxdGuCH5byc_FTKf!X-~* zpnIi%2L=T?KQkXVb?+r;gjuBmXC~(*kimm2auu}T`3Ce5NZ{|>sHhMEW_{JnV9I6e zV1yoizdDr-o_&;V31*qa*i7O`F{d=iYNfft#FIkK>!i9iyt0)D>Bd0l_3&p2=Yg8` z@A-BxhlzbtHd%aoNHO}0d=OLm_A!LhT_SI!^z7UM-O19q=Q+76+Wx2rA_#lLhF}3C z1E8ltFPT1BP;{;M}7BQH2B5LagJX zIARUC@ET$?+F^J_n~tzVswujx#2bvHog8hVESw<{BY||Y$-;f# zmqC{~F?9peyskucK~kGDk9P8TiRk>w=LF4@I|#>2OG=9{zTf(Z$)p-U?5|X=ZF`(({Oy{v`7t!Cuk?PCpzP^s(+ru?V;)lfSoTs8f z3{M;7ep`go9A=xM^P<--wa#Am1?5e^QuAOiXr+m{@MaI+-cbAy{wUgXWp{)gXPs7u z!|6E3Zes7O>N+uihQj`!$R}%4pH&+_e7qjA+_-YG(N7wXGRb9unM!FRetKS zLFlb!?nUL0*P`ZrQ6v*96>G&>HuhD|$i>1L*XV(UyXBv;!Fno^8Z2cq*Ft#?zlvRz zNeBpoQqs=S2J+w7)z01I@45J#Unang*`=uKU3bj#BDFb0aLIzhE7yppXI!99vao%7 M4tZ4WK6dH907TAOga7~l literal 0 HcmV?d00001 diff --git a/public/bounties/buffet.png b/public/bounties/buffet.png new file mode 100644 index 0000000000000000000000000000000000000000..65ff456ef471d4c8fe6896b74d71e352a6410ec8 GIT binary patch literal 7694 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 literal 0 HcmV?d00001 diff --git a/public/bounties/bulk.png b/public/bounties/bulk.png new file mode 100644 index 0000000000000000000000000000000000000000..97f751b8bfa4f3d4385d845dc46167f28c0f96f6 GIT binary patch literal 6925 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 literal 0 HcmV?d00001 diff --git a/public/bounties/change_name.png b/public/bounties/change_name.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f858ab261a632c050f5cac485a74ea4ac16722 GIT binary patch literal 6589 zcmb^$3sh4__P&GwiWsWZ*y@^i8tbPOy4G)1lKKN|6>9y|iiEC3tjdAYpC~4Is9kGq z3maYCYCYkARx3qZsY=zD*V`iriLrZbk+0|vT*yUSYm3uPpR5;?#rCBQLl6CJF z)!vaeln4nyJj(|GvWKKeSOEx-{UnWMB_og@!j5qP@cXnt-V!#4FS*nN|8h@}M6VKl z?#gMjHcq-z<;9ZQV!RO0W`z%gTD>1UsOCf@7l6bmVy78FcL+=md=U;1oTmkhHYKy~ z&MI;1?at079Tb<`oz2 z7mKt0=Cd9ryyhZAb3a#5%r^Uu4CQK5??w7LzBt2%@~XmOFE!Px+k}+$Vi=1j=dejH z34l=nu#1uhm^Ub{WFEFQmY{uS-Gd4m9A6%8IDa*KiZkjXy9>f(-ACo+~z7rlkx(kub7aLCFnzcy@k50d0C z?hzqtT@zZ}=qOpaJpaiP4TaNg0ZZ_JX^tU~Q|LPxNEi;}{L&{O``x$?W_kuisi!z= z+|_AzbVEAgf?zm~Sk|Jw5p!&%EoPIH2|5>_XTBUwaUiPJUH61Onb4sJA}+4%pUxc z(AqF>8HR?}+o<6whO4<-j>jHUkF42ar{fl?l;jXF0z9tXCc-G?ZOO)iYA=WwPA;MV z+-Dl(He7OM7kqe8z-%}&ds9V=m^VB{@4CIKw#jtFTKJCj(kDwQ6g|Qh%6x2nk~(~S z+l$jgJ#2JDIQaZOT7sd4Yvr^T0ODw3#Y-a`OrmE{!40bkWBn3^zC@%n7L};n^Rz8q z$MzF+03?C2k2}uX+u=FXY4D*tY!~0SPP=E`q-thwioQ`6vgNpJe#{H!)!|F;I+t6U zeQOqA9t=qWgD%R%9qk{k6S&=D)$7kp*P4ahN=~S1H|tQSgQ>)DTwQ5!w|-UIP|rr; z0RIjU$wR)S1*VOQYW~$mWV!YPks1*`p6(sxu3zvnNzHMcH@V$-1U5Lw_`z zYI2N4bG5RLgnt}+h2kU~_(2{3B>|9wUh4xoEM;89Uw#tXDCWJs#>K`)bSTz*RH7QXcs&e+`eQmc zZhwB}74xgQ*gXBjWi_je$KG>eYN)(u&(qk&xKYVQKhL*weXath1wDbBcx(hC)#F8? zBL;w3%yS zW%KpSy}K)ipb{7#Bt#V9g)l%bh$kNjMSkiuWTmFghN+^02zq7avTI+cjiCx{jwgG- zGOKlg(ld0G2dyAxdYdG$Wx*B)Ed7pOB$n{_H3TQtY?hbm7lxy3%}wwK4OG^mCh z3aXY5+UuJ#u!6|638~$dN(mhFpQ`&v4-V&_%kG2JVVWKZ$E|-`wnI<%Rp>EO;Qgwa zE2yW-)Wz!Xp-Q!H4LeYJhxbl?K{Vba4x%0q%It{w;_xbX8IyyUH=|BlJl27grL}o} z=6KAVDV|o=+vDrE^RNkWG>e`1AnH7k#SosVH&?XxPzQK-g zZ`+&NE=nGz%KA11hf;oeIC z@`j>G&fYAR9DCn9x0PEc)u^^w}$ z2NIRdaZCFsjp^+5ywEg%lJk1m60FcJ`D*fNeCi^NW_z}i2S7;x#1hQc?yV#b>M`Ns zHStQ$7YnR&_(exzaaAq3d0Ta=eHkrbvCb*-vQou(SZ&(egKlv8p2&P$yYwCSN&u~s zMg=`!rS`2c4t%%U%L;FygnUUkk&f>Z8264~QvXkiekdF?BnJ3&9lG;j;5gC&GC2pP zL3!EoF%G^KV`_zC>JH_>nz+U3o=r4HX)7ONR$a(#w!>+oS4H&e>d|M9hv%*lO`^gd6PSaw~^^G1nnQhWVi zHJilmgN+OyeB}=n$luoqPKU0QzE#9D9*5U+vM z3qoqzCO0KbIC_S^C^7^NBn&2q4|*tv)MMnv+tM^5^>L^ckNjw>?%Q;Qw#1`!shlSr z)g|iDQL8CBf)N<07Uxbiaa)9WcfjGQ(359DBQNXpBwD3!jzLi(dSVCAvIgCt9By#b z81)!|L|9<3wDa*XyJ4n9#_%olG5N$hw$f&c<(=Q{|8CC>^YO8?2NPpn@)0|oD9p!I zjXEJkL9Sc$NE8aDpCXM#Cy_sp<`FT4hwbx#Ioml&`mh0DS zT>}Dv)>~VdJAy!pz)}&kY9;V97uLA|{3xItEl+}q+cd^OAdOIK^ApZtMD}37uO1h$ zkm<7D{GKOVd>q>|3ptlzfZkGRkZRR>;Gk;5vy~cFNFTFRs}hW+Gc;0g-Iy-FH4-c}VLOSnT=b0XA-1m6n``@nYx?ZV&IOXMP zBI6OYmI@2Slc@bD5~|HqG*HHW zLpghdjI+~EPyqcnDCOWP=o9Nfpk2E_pyMZj2!3U8nEQ@7RDEo2J1xASjL`?5+X(VR z9>WS>ck!(|duD)mtEz%P+jl5@b&=!(TVRhuL3X$+0UbcV%F0H1k`)V$TVKJn+2m#IGS6RU#9WwilVM27|_EslWa z4~@buQD-dCD{XYI%=C^UU;mqkL`B`I9&_B6yL-sPo^5^871z~i3=5{;p(Lbq?UKcxF-r?IBfdR z@hXR$UqnzTq*y{0Lhtawc-m_mFLe|ajnlJjdvrolJ68>3u zyfqM2nPgcPzdK`3g3hc#unNiXyxk6xmGhYP%{d{r6?J#bic>?V)(ayC^)TV(rVB&* z$6i&^rN#X))wUf2JF`9UtIDSmvR;;$sSbU+4wm-M%w2Y%gYuxYU`o`-KYNK8IOXZ8 zWI8}OTxfPV1Yw#uglT~LYmL+@(M7(z4mif8yp{k}fJ=VyjMti2{xX$IaC;&BpxpB^ zg$ove+k~MruVteo=Y9%Q0o=t}{?PFcck)0*(;14ieJLy+0N?y`ZMW-8fX+|?jNqsy znlM9BdHCLopu8Av$?Y-Nks-8Fa46+q2Db%3$nT>2xL4!ctcQoV7ZB(DWtDgq z$%rtMOb};gQ|&U&9)H%nMW)A`bDaxnghQLiJPFu{pfcZ*(tl^~4S&e9pc219NcG$U zFOtUEfNvN5Qe`~oRJb_4`r%nrue$g?&)|B6A%V7UtM}IKh&6K#*FTn$$fa}~XA{Iv zYv-X#*S=|06>3444B%+qQ zL@jdJ;rl0#XXaJglbDTJ%WP|7Rvfa?-Ih3U>d23j65gl5(_Q>N?9rRoAPv#qb4}nb z{+vuJyUwO|5|e6LcJ+EW7RrzD61;c(RC^QJ?e*nL?=^*6vVS1xcH_lNJZRQKsYj%0 zF5s{3&fWA}tYqswFf;D@_UOJA{Lz~1tD=F_Y--|fIgddSW6Y>uxukcdV?&a4=Er%> z2>e)Z>n=X`+Qk@^=cg6FMaWA)+?luR`D~1y(NJi3OhI%Cvk}E6C%C^At-=+&ra%YK z4A%lSLdeq2XA`J!N8oB_-yj2lXs;^?XVAbG`a=bVTe44bwP>&44?kQXsN>+IXtesW zf00yQ&Znm)(!xcK^V9Mk`A|O!L%zl6Wck&QaX7SL;WFkaAMuvNWCXFKB7hVpx+whM zQ@{?b&GX3gE}sO`u;!x6oBwV4Oq~@k=^1qK3lf!``^n_1t~n0T8wbr2j}}IwJ#VJc z$p$r})hVK6QEnCY#kM3EqalF2;ChE}P&0ZEVl!T9xsD8fhsiR{-?(_QAO3;JgE|$) zMt;BAY1xkBRoz)4Kabjt@w6+NTRA9I)|=065#mqvO?TVoD^o{En7+hhU^At<@YCg3 zL4g$2+eA0?-`17M8qH^~DHo13VdBM?YrxX!-nG1=#OiXoRtgu-Oy)vX#DMz&HpG>E*ZTZ{%vAKT+>-Q-#we0?3L1jpS5N(pFgFhL7b3R)zX}t0NgZiqhrvUPh zf&0Y6cf24b0rU3drgX?cFY}Vmiy@JNwh~_*WTWD4N}hyg%|-eMhr?x3E~|>I%B+9 zoA55`mR^9yNL$m5RV7tEP3cHcpMg*EXdtaY%@A968nUh12<&h_H7vb0!J-vo4i*jM z_wLR4sI|NP2KXQGWBW|`c-a^JNst|5CUaqhC;+K7l9c5|9gh*baju#ZHgxfQv}7LT zlFwy4lr#}iJ@XTDPHle+rwE{~{*GgfFGg~JI{y-ngOn>~yC;$x-e!UUTt^HtiYiI~ zSUnWNimPN-?ohqf$qR%9ps$3m3`V*~J?3b+J%7`IXsCh_*%;xE4<2;uwRGO=Ib49qt>B11C+D+iFc+Jc z+M9}^i^h$+Mh_^;V^*MXv{TYsr`>!dKV5Ir^i4e(3_BuD@$^5o}aLJy!?J`|ller^Ofh{&Vw z|D)zun+Yk!9tVK3TWuSa3$oBB`{R+V6`t{r$kg1sc8Q86G((ztkt9^5bvRZDK|5wqHSB5&K|Eo& z`ZIV*m4|r({zg4e%Q<$3xF#F11KO^4);UwJZyPl{EwtFvu^VG&Qcj)Ge-4Y zSyO*3lUwp&I?@lEioj>nha#fMU~J2dYN}Q6)z=S)ss3=oGDAQUWZmJdjWFhj@8hw6 zlJk-RV$U~asxL@~NI5KgV-!$W5jx*?rdDeLw650fu`1_LLYQ9T8##lhPT{geus%;{ z@Xo}|lnBYe8Lm{V@m2HG*CrTY<2-%Net^BI& z9UrFMh)g+S&c<$qvG4OYwYzD1uEAmEt3_9#ZibV`M8XumHrE!gwZzf{Ty zmvH!AP=8fJ7)h9eL*jN?LN7qOmw-i?&anU z6SLUfxx7YLM3`Q7J;2}v?56vbYUg6jqi_q;eEgPUGA@q^UxEgKk0M8Mm$k<bp#+&>x+{o zu=^qx4j-=EZcf_%DcnILnBhTV>?tf6w}1) zN3J$UFR$+0^W+^?OUf(ft=&qB)7!k5v`T6h9M6s8nzoHLnbf>2ALn}aLEhGWfc05J znBtxCfCBW=11q2pzrWj-qvb*G?zp`5@MGsNQPYryN7(^c1Hc4FuptPH9y^n8o`$vX z>B&S%vBVktJlis<>8^C>HO#5RXPS?A^?FEV1W0mU-dJ^-{c-T2NwE8ZRhjZ_Ya*9W zDArpIIz#*~Kkz?U0UUsqmNOsiuX=`u@2=UM#6-AY(yl4ng&0F#A2s&gHfR|PcJEH_ zS{iw;8ILexU~My&#gT$OqzJ`31giDL>V*X0&5SMP`~cJdea%|DKY9pa6Wil8CP^p2 z&I9VXexlb};nv#kjPNI!J3O`)Cd(!PI>Iv~lx%6{ z_wWQ&No@u>H1Q<72se@qKHr~{Zr{EOFg^~fFQmvV(Z%t%=EDY^WG4RQ2Pd869t~g4 z<+>ncr{~HA4UY%)ODagvSvRgaRr4rqZeA@^%$ZICgl#E($V2<%<3Qyis>R{Pw{H`Z zMNfVnHO&aZ>s*2I?*fDOwdY}z!R3Q;8iB6{8g!M;0v!u?m9(Je#SC99Z*J0^R&3|b z0(+Z2ar;_->={qZ5RTBKiyze_O`{KesqFI+yst=@^)ZSppyTG#xAm_an-*I#Sl!G| zMjmA*L^EAi7D_z~IEoPcS8c|h0D8&V*SqA>BX-q&RZAZyk{i8yaT{^mo05__6Fs@^UbGa>R!+&}%CjfxZL`IOl+9qNnW zPCe|iwWEtF^!i~jxX zze=xN&W&)P^8pL)cQYE@6_T?d;jbu$_1MB+&|~#~xknVA5eRNJ11V|_08AD_n=nz8 z#Dy%Z1LWhr#UX-&W3vj_uH7N(yCRO19#iWcu4zQ8-&yprd-iFWxcdv_*ymd%kMd$*2Pn#F| z-q#KY+e0*C9hLdscdzjmxz}&vF+w2}6fKJYIL?W%(n7NWJ*L<-T#hrm$inT5)W5G} zZk>%w>T3PIQvUIBNo-a`eM0PjPcVe00Z_#9%^Z(4#bG-pGYQ{A4U10UY+{+OL;(y9 z{>-}~xRXDllwY;L%o!H7FSrGdd2ggfp^ZxjXmtg7rW0VzJXvX~AsQ$h_3U6$xG&rr zeQOC13eAFX*kQOS{cwz4H8H*9={pSue|Rwt;~%U?LNjEj(LmS{-w)R5_qujfj^?Ht?j3Ko{ef{r6bUMd*?O z>ad#|ct`N{_MveB12dNCf{m{y#f7cu9zMC?dt?Pm{zztk7spl>3U4<8xNz<_0-k4j zo8aOG1p7J^G`&F*2Ny?%wVKH$YHhv60|mv%g-8Hi{{}sOj{V=+J3sSLl{U-7^)_}2 zARFDmU*^nLOzw8jvD&d6^if~s+eYpswG=L)O(kT8ixTCt7vFHW>OCH47ZhYK8v{2! zC{!=-N;x0bO%@>MUHLP$i2c_cyzx)829X_|vXVi*0Pf*Wm{>mN0FnE~v%C6ZJ-9aH zX!UL=Ref<+gW|_!d2KVJpNO*X?(}UUO4ylC0bQ50(-vPDib~GOnlN&3Tg1xTz!X!r zE%=QgU2?kK1oX;|GR3ch+VIDA&s6?mF1vuAI(Na4Ff2!sF9}hD1oh902Mkvo0RdL3 kC;;m}Eu+d)2r?yyAZ)_Z$cA2^e}k+~oi#5$>G{+D0BZkJJ^%m! literal 0 HcmV?d00001 diff --git a/public/bounties/doink.png b/public/bounties/doink.png new file mode 100644 index 0000000000000000000000000000000000000000..cb10e9b5d8e86cc18c25653077894d716bcc8e93 GIT binary patch literal 4548 zcmcIoeQXnD7=P}1T`L9JIkX7I-S9h_O*ASfr8k%kLNHZF`~tf;6@n6q7$A(b@0KN? zE=tfpmMCsP6Ba<7%Mc8()|ilqhOQBiDcTb>o50-6KD&PTyzkwux2>i7LrF$^?>+DD z`8^-^yua&Pt|v-oOq(+e0A?&-R`L`8k6(E(=itY{wlkvux$i75DK6XgbI%3GyLm6z zNT_qh{JG`EWhHreHrv8GzWk$hO|$W~bCS7Wlj#sKiUsfQzSy$n^ETi9PxIO?Za-NS zt^970KyllohKH%pNbpW|MvC&?SKo11}%%W zCm-uwiz%3%CIy%fwv|Rkfby)Cjn+V2wJYwO1#Puyla*q8bl6aqEGTdZ9h3;qvPE|YQ@kV#4S}VCD5AZxmlY6`&9SobEI$GZ62lRJIw{`^BmF~> zecd}kzVIk_>fQLzFB_95qDJO3;End!fu|d}a({ft0vt<7bJ(j|NN|3mKdxAaaP>&o zt610oas1SS1Vu?(QVuMqQjYD7NT~<} zN~lm`TNrzasiTQVfJQ<;BLM~Hhw zM+k5SB}5zs`O5cp`-We(JUL{Ilq9PLdP}=DRu!{U49_t$B>M-tBHfiLQpUV*c`lSbQ}(CjP>!)*KgpOaOgarx18xfN9To7hRb@k)Sf801_l(_2jqW>UE@ z@#q&tnm_?)kBOkP9l8-nQ33E0q^}a1qlr>D0_$#qP;^xmQ^abWM!x+=fMW+|lB-j( zA6Y5^{{3Wp))>%xIj#SCMR{6 zm=z(TPN~!}z-O0FnN^Se5Yrz;x2s+s#kaS83&$8d#%_t9Bur2AAI60K`raz4K*Z=gzwOLcYZZlin(C*y{9eaVF1I+j5~0?8M#}?2Qb^@a;k7 zJ=`{KH1@GCNZ%6*!TL43S&EU_;YG68-<8kdV+X1ceclVe!P4s+wT~V{Z|q8!^wct$L-ngegp12kqh{5`D0I% Je7>Z-=3nVQn>qjh literal 0 HcmV?d00001 diff --git a/public/bounties/empty_hourglass.png b/public/bounties/empty_hourglass.png new file mode 100644 index 0000000000000000000000000000000000000000..36d91ad70e6dde79929d4d2a1d723783fb8825c2 GIT binary patch literal 7096 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 literal 0 HcmV?d00001 diff --git a/public/bounties/everest.png b/public/bounties/everest.png new file mode 100644 index 0000000000000000000000000000000000000000..897fac332bcce25c16508e6371d5a2dae7b3af6f GIT binary patch literal 6017 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 VZ`+c@6wu}X4)zD_NV~kx{U3qbVRZli literal 0 HcmV?d00001 diff --git a/public/bounties/fourth_quarter.png b/public/bounties/fourth_quarter.png new file mode 100644 index 0000000000000000000000000000000000000000..3cd792ed2707ea5d441e1f009be6e054be446f97 GIT binary patch literal 6536 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 ruY0I;nq2>uam#-KX7zy@jmIM>7sD*Bbs0StmrX literal 0 HcmV?d00001 diff --git a/public/bounties/from_scratch.png b/public/bounties/from_scratch.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cd97de47d2a1d39b314f9a8abd327c97efe98b GIT binary patch literal 4269 zcmb_fe^3-v9RI%EJ?;{L(^MP;IkMEE1S%%1p zKi>P^Yq{A=qb9^n0D!2hWs6qvG=E}=hvlA!H+fU zoSN&LdDonzx`^e}v&9{*1vjI~`zAedlHPt2Pc=cr-ig!A8!w%^H6bhC_JMo*k*-V4 zZ*H00bvf;;>BT$8@n?whxLA!K}%QOGD;HZSu z13%M?#*|ZN8Lco^V2Meqn(gsS8ErAh$+Za988cPGKw-bt#;qj5VK4w79RN#U5Jbu& zLo?C}sGfdrfTB&=^(liJum%#-fMWlNO5#E^kqnF?di`e)oV}2;suCR%J$)%pfvK@G zwxY+AeB}aVSvqkH>O>QJK_C*Dz4ySOSG8t4mr3KYqx=U0!d$4@rVLaNEsB)@Ra{gb z7j|qb=k8VEGU+JTrV^n{mXTp-@Jd?eR-pHN8#^qixiDNY1HQWfB%Gma0@8u>k(EJM z7Qy`)C>%_HOqXA9<$&%0u_DpdDa_$OoPzz|&RAm3LS43$NybYKknZ}L(gF3=V~3w0lDmnD3*)jDQwg(J1T)TzMc&Hv1P;x*+U?{xl!Lp@Y|x zBEvt!V0mI#u9igMSu zq1H`Lq3!3^78(Zrh#EBS5?1!|Hv(lrJ-F4iiIdAdzAieW$~Le=>Zbqj0lyW&W~G7o zOnPJYFhAVa_J!K$c)wS5_n;#&6K0E^R@*^u!^&PsZOh&Jziobqhl93v3Y^sqg3aaO zmvAkuMeMHcpBlKf)$StAH{wseu|_=m&Ikr28U-$(q=rSZQedT(&P?+m^RxMl-KsS_ z)hE~*nmw&WZCg3lJNzRx6C~38yws(Ag?AI8i zqK$vL^IMFY#m?GtMNk9cI%RBum>tC-a=G7?MK#+mZl`Vp4PJtBdBm_**z1WwQ8VEa z_4Y{_0V|Uf7N5(C1mpu9Sow*}(;>T%1dN1Dxu#gC;54}RQZ#;Fe|i5ts1f+XEw=Wv z?w!q^j)N`ayAQJ>9RY^+YEs62nMmnEMm`u8cZdxEKx8aNq+N$e%QxLavRA;jI0VLTnIQWJpkJoZQSwYChi}gN-GKA2Aqz@9!ccycixzk}cr{CG!(uxebihZQ~ z1iZ6^%ncZSU<1J(Q;=Uv$|IXxw6uz~(l@zxloxE=3~^WW*WA83NbM~0V;|4D6s_Tq zkD^8OgrM?+iLH~OY&Z`!nQR(lp7~sLOm9Ew_|R7SG%w_E=0~G(x5yI5b~t6GEbf~m zBBfAJgbbVIBF%vM1~8fBa)`&B`LMc3rW(y&O@=Bla6af6k-w5k$;8`kgLhvMBjCvE z5$q=A#3p@}+65$E-T{W}jBB9jrG&6v1BT2jO_ky5tb#%^uhrAWvKBIe2jd8aMt1l~ z)c?vBJA$pm{j?CD#I?6a6qaq%)?Poq+Pf?N*H>R8BJ1Pp-$NEZTE*$kMILb0EI zC*<+tk$1*H&iz$4K-~(dz8E?1a(PNQW|bjO4#i}&9J~{boJfH7adJL<4(jH`L8BvQ zbUuSpOq{pf4$&!yy%*`^N(+fXIoGb%;H?jZJs=xIRahfscRDk z;{qoQ-FUsI&CPSFz;d{-t)5;8gUisE#X8dAES#SK?TNXo3M?Dol;?pZD;xFw?PRQQ zT^-t-*x7K!eL8yEWO4(Q!Wmf5B9w^oeH6SieZ3C9Yx79&iW=sz7fQrgz+f6;jlZ21 zdvlNu;zzW(3DRw5QFRaXa>&#Lb651J&)7GWs%s*z3_(7x$jmTbo`tt;>xg@qp(Eq}} z)>V6p-w-JZA2>$3Y3-DAct9WUny6qRDwrryR_ZC^BP>|rde3KOQb6onr;Wz<^FQsF aI24mt+mU;|;th_NgRBR$7k{+KQ2jTpHE}Hf literal 0 HcmV?d00001 diff --git a/public/bounties/high_pitch.png b/public/bounties/high_pitch.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd88e77fbed92cfad050c510de6109ef3b67b7e GIT binary patch literal 7892 zcma)BeK^zm`=9Dm${N)v=3z-E`9^v$N{kM*qKK3{WJ#hF@(_(}N_jYJPKQ#SAC70X z5_y~zm86Vpmax&vW@4UZv)T6h@V&0@b$zejIp3W>Tzg-;uKC=b`~A9K_v>}viKiWq z;C0Y-AP@+A;<&9d2($t?t^loF4SdW+(!{`rQm8ZXR}isFYYYU^A)K&1;u4uPF?8eU z1;*{IQ{ngjaKCxNaG)0cnD+j2$Yr>?^K0L{){s>q-(u_QaN|c+uZr(?rG3)HdOzNn zu9S{_mff}ai@~a=M;>YY;hEXBS5#z+?I?Pw?FxQt{M$ow(?sq52bk{;&Lw|NkHj8s zQ@PRiJgt`6cSyJ(Z6T6{?tXmCyp&}*YvGrlJiI`~`tN^h0eZUSy6hR%@MIJryf+5~ zdTa^2#f}{ykoB+s|KOcH@~u|CF+fDYT*mQrLEG@@Ei<0NeFa`Cn1B6?|N0*_h%dwU zW9#D99ExBV#Tu>#CDclXq$k5^njp~e;~-GXy;XmC@E=(YcH%?<`b`k5-)iC)(8~{z zW4ozm+uOM$Hu&!YUV41Z-rEz2lL(NpR&#BDTvxoR`9>%FLI5acixDoh_yWhuR<0EU z0&UY(0)aMe{L4fB{fCY+|60gPH%+s9YsRYllErIlwB&7&#gh!Ede8vHReM`*|M z(wyzO-|26Jix;M((o@(CI_se}SsEsBA{6OO>S9^11Hk=@!+i|M{hC^#m(q|RIUAmNYK_Jv!jZlX;sNn^K14^ddu8S2 z#zrd+<12IXK$pm!rRDQDo`0$h8b#u$3x5y~$U149wfGP+GLlJBQUn)oSj-luY#dF0 zcu;qXS^^IRX>ljL8aj)x{1$Ss<4S=J)ZwM7@cLYqW~+t8?lunQ4^FJv-^af6THV_) zpyI#;Rv@-oHZYdivTzwAKchLyz2Nus?U82wT#K~*JR8J_>U}VbZlNt4LQ{PVW^eA{ zjN};l^2RMhJk%uOZLyvsy}c78ydJzKB3p-62MN~6m5sjOiF#adrRFW;b5y#%|9PJ| z3)U@OFMT@pyA6Fh7$4fI0O8BGKKiFxw`z6_ul@6_YvdD1+F(JN^NUl2obKObPlrQg zr)}EOO78B|7~)iW%l)&n11##HX1@L5Jipc(jmg1|8!oLT3VU~Fma~zl3bVMY&&DzZ ze14CS;84L%%O=y+;4t^BFO186J9CbJ3;f1j;87I>Sag+4N+55_+UrGY}3u5h;Q6$ zC_KjgW4K!x1SKMrjI&GV0Sp*Ihv69?+I${n%rAvF?gU#N+#WEZVRG*xfh&=oEE7K5 zRg`vu|GYXBAGC0h1wA&bpv+CSVnD0QP7U?Bwnup<;`}5d?51)yERyj`tW-eNSe!(s zGDG`s>tr_T7*>xQu!!zT2{-cYeSjVk^{}OI@%Jq8lq*Rx%@Z*tMCB6yhM)>l6WW=0 zq3>QDFKXO+#DpYdOU@C;pU5h91`rsDCG4^M`601xFjPVuWMPs6$-*{usp^#&1u#6F zg8-3p0!!mJ@EV(}+JT}}vY3sWieh^3+MFo&ouTMGws*zC^{jq36w0nY;w;$<-9G72 z&hE4qNbL=L`D8tsX9P1HLeW7{uaa~Zu_-{nIfqOI zu`E~mN2FffAvJjJZIJ*%6B^sw?D31EH-&|nO+Qg1oc~Jn#{8FOeUhLy$Ms;NKTvn(>(ruB+W-JL(kk%FIqT1 zp_3og6&RoU{CIhlldGTh0L65;%0}-I_>Mu zwF_mvyIbLNUVPmav&N>BFpbzRwM)Sh55gU_Z< z+dGt*P4DtWpuzb3x-mPNdht~Jhu2ol?A(5L5CbIfV|vxG~EMP3ZGme@IqGeUc_rT5#W??SqZ|O zB_DE)3rMgHRS6-Nc$PLr4v|Mp$#BMlM;SkuUMq|wRxNW$^yvV3$IpV5D#2BgvW9xp zs~SPy0@8gRR_s6t0zbIAbp2a|eNo^r4?R3cQAn)_5UH|7P3K!BUURkEhY0w3czQf4 zsqRS#>5e^9jYds(-XLd2#TwmB)ljLc)D01>w>quO5|>bzmhD6Gdatca517?@LAOt( z_wBL1DRqV{K0v%hZ7?(fcNrI%z#Kmmw~r{SiE>Q#=D`<#X(2W7#}17spvBGeO8z~c zcIR~(&MEo3wHa0(2=0h$=V>NSX}oBW0x3XZg|YN$l9xPnM9b-d==}xPv+WG+!!Fve zuVx<$GbVILxmB~2`7Nm45&M>C=f_QJzm|9key@PVb&kyU>PLoQXoUms< zzG{ZOdI@gXdtV=7pNB zv#(EK&&?0Hq1q`Exh>556S2?HnwJ z2aQvdML;(HJY#?4h;p_a;6S2CbAQw1YH%L~yd z4BxY=_WSeh)!WL)a?%^8-0GRA=$Q|^$T{-kc!_S((>O|vU|neiV~X^n>G`baCIlaV zmiT>8Rz&GfA=XKyuGSH`F&&_XFSFwhE=oLFZ`^9J6ydr4;8&v75m8-#9g!3?`>syr z9&SSa(9X)ye3c=XUS8~vK%2D)TO;~P3x?SoV9WjTCJE8JFS8-$9# zJto{fp{DCW%F1OoKvKI~QuFErUHs`1$9`Q}L`FVcl?v0m`$LDe|n-avDN^cjGZp~lNYxOJSz zCyNIGwLzwYva02VgPR^O;a#1#&ksgn!Yz2uZhoXJUCWh6igMx!kkP-ia&O&OSc?Je z^tg-WDIwThR_FNXQ(V6M%|$tDE$6e`Y@EW^NyN&@MO~u)bT2;CD%eKqKG*j!{nP2B zMLw_g-TK(UQ~|hkNhENw>R-{wEBU4vBmYAwJrO>>tn3Q`3D*|w$K-*&ifD3~n8s0V zn8LZ^p-V$6k)-`zx)!%Aja;wb$>dYqit;9+IwwPF-_*Ng!DSalrHm=m^ zbW*8CN3ERu8&CABaGkhzFf~H{TvEaIF%jo~R0UUV-(9CoBGj48lqI&f7R}-6(7CA! z+w8Lc)6YvA6RxX|916NOU?I+?0R6&E78)L1UF0Qf2;M=A&pFw8%AwI8kCJ*=UC<6H zn}&?X1R<)-TZs8xxG(e31z57jwFkn%+7fe}zU?W&j>lM4ZNS415tXkI)6;pF6)(m& z?S0HNmvfs2wu`aI0{*!$3fNmG=ex}mFv$2DL%dv9>m;C>1oTf~LS^-Wod*sc>*VJM zyY>mBe!c{2mjEsLeu&dnosVkt?fi!4UToH7oyiWjC$Ys)`ARcd6w+2|gbolPM{;zM z6`*BVrGh`L1&VN;xtY1O&6&8QPFw}S3N8Ejl}v7#v*T00#ibA|IT4w3-Gy_*X7 zSCW`lY;)ZMm+pfzIBpB5cVyQ4&U14*~YF5 zA`+0{i)73SyD<_x=f3&yN-HmZfA=LSrA&B0{Sv{;$uVx?m8FMWH1%UFH|pkaoQz{1 zmTZ|@YQ<@!xEAHFK?YM1=VZ|b+uwZ0(aaKBSg#^Gp`&*cWb5?jHN$`cX^m~J7Qfw= zlus&g0DX+uDhdWnZ zkknP?r;)(}S)PiF;IdIC#Y`fURxX-GxzsJ3cdI1uvnov7C z3JJnvlddv8ld@*sG|?Q}-@i3{0%+P!l5+nIU#jjOvsx2aYBqLtVbaKW2&GLCr$#yWpORC! zZp`h`%v^@$(K=l~gD8pz5U18>)Ucd=dv>9S1S=2bCWmLfA&a)>UJG}XpACG**(7lP zS{jF&e#3`w5?&-;n}bC!B=YK^vXKuqU|blr>$g(Zmov^}*n7JCU))XIQ^MhAvwNxt zsKo&Yz2xznm5)Lg{Eh&vY~=81;~s_L&kvi3w}_i9ls85ZtR!W*r3577nwPDRWQ? z5?lT$CK6(SW-j8qHs$&NQ8#_oGLg4f z2$enZQOPetV7?THg`Ef|e%aJ;r=v+uPsChzZHdb@IXJsVsXS8v){gV{v0vCOZlL5bSk77WME1gYI znBWtzm{f9%^Za1+?fQ>1p8!?xCXV%tczbdF;|0m{7lUexaTo(&xDgRHVVT_7)v{~w ziVj-MHo((RKwTLAJ*gvbwX8VVi36Kf!1WnP2$0QU*lc>sB9SM0^PSPe5pj)C7qn4c zjV0rvfy0uuY5O(FtNsnH?^(c*(-mTA255nEF7lQT#@Ug5TSyft$l5V81ZHm*yE+cL z$}-^beW=`xd$hYc?ww&)r}0I_C(>6o=oK82K7|8}{S4w}x;s{+`_vY;2}3bi06f)5v7n`-Q?J z11LVx+!3-c0=#%Cl@6I2RIcPST|Mtdl|=2O=1dCxJ zl#0@vyNHl@!FV=im7PX$y7fm@sVW+f{Y#|7`jvFYs#{{1s|I*RCvBmE^t&IxfC}); z!RDL47lj$>n!JWGEGh2Va;_BxDB5==GNvT}vKJW>r36Zyqji!$_!NBpff8DoW5D|}ZC7P%-{@6gh*>e32eEcxvlLl<|2<-mp(7I(_`Gnj&xN5%XQc0UCfzyi zLNQ+>sIpOK*Yz^)PMBGuv|$DF7UpkNYdPsTH%9?i^BUakx2=3O_a`!=JWb}M1RFI%01b)NFj98XA9(q#3KV{HHTR166w1p%O;A>ei}a82SYt^Qbd- z?C{Iu1y^>E@psQnHkJp-w~Q0CGsIfYFK)@8+Q#{tgdz7LY6$h+>7QWbL^2aKFV$^aFuG+&9y1nQ76Kig%*#T-_v1D&E_r5bJiGeQ&1Tp#i>_Y z;}Uo&)dBLuFX-cC2NDCQ5`xuhf!BIVjkqNa2L=nl1g^$rDMvEeAV4Vj%-JMn)!wwJ z|M-s<6MZKEX#04cZgJL50mf|3?|V9K15V^St`DMGxv%_`QBl4FMd)ezgH`Qd*D#lS zplO~`=$#2bgavO`eOro4L2%yRXm27=B4>|YkQ^YI;hxG=GQ^=FAfVZk{|O9sIqKy( zI4u$KA>0g}CkiPu+tlxpQ$ZTJ9|?A9E6`5O)93-U?$lKI`nCj;^Wztjerzw17fIVy zTJ*#TSD4$|IB)Em6^9Hs5)@j#WTNWa01h+93Rsk8Y>b8|^T28a)RS+50WqV6Z)LHz zcf%)lIl8nnPVoe@DbnGtVC5byGAATqR`lR75m12eW~1yV_P|(s zrn{oOob5!pTk2>X1dKdyX3JIKi%yuRM+hZyxU5GS(*8m${j@!ru;k<_&;HjEZP}^( z=bNiy(1-inP>1TQwWB9!DZ|yzjmrsC`)u5f44d4TI@@qr;nXgpq9u+q_}{x7FE@-2 zFDY_lxQafFl6*FfZx?A&L=o}s8}{Zc@!F`26_Fbc71ws_Z*%uq+MUVRq{T3XmfwxR z?poY>1vy)G4DRO_zNI)^(@gG3-ZtYAk3#g@gJPWR4EQYct@@7*O@UZB_Cgfegv&RVwZ8Ib;vD4sh`0q~Uyhpo&Uzx&3K+4d`kBm#s`BjAos`su z?73zEyMpux$`G?^Au<{T&^eeDaoiMz3q;i$!7M7uBJo8cPXnm@(wv)BwBmC1$D`SD zkF0pp9LTIsasYh*Fl)}lMUfAkGOdVN#^VnH0<7+2lWAC0R!Qy4pwDtE-r_*%Y%a{l zv*P$%gh1*+oy=)dkc8#6(U!N5zqRC2BLBV2^<0>4FO~`W75tJbUvYBdA5T2$G`PUF P4|L+FgDvsbi+BGIuwQF# literal 0 HcmV?d00001 diff --git a/public/bounties/hydra_space.png b/public/bounties/hydra_space.png new file mode 100644 index 0000000000000000000000000000000000000000..bb24940df161adf74ce5c648885d914e77202d2f GIT binary patch literal 7332 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 T8=i-jfz0(A*L|>7`TPF`$#wl7 literal 0 HcmV?d00001 diff --git a/public/bounties/hydra_space_alt.png b/public/bounties/hydra_space_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d17bb99c6e95ab720882379e3f3fa861f98ef4 GIT binary patch literal 4553 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 literal 0 HcmV?d00001 diff --git a/public/bounties/irs.png b/public/bounties/irs.png new file mode 100644 index 0000000000000000000000000000000000000000..dff3edaee7cad665217f127aade6fba98bc4a7a5 GIT binary patch literal 6376 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 x{dxE@zBMC*6B2^x!Mwo>P|MlEC zdBV$d9b_E{1TsBx*uxJ5G6a@}ptWm&ha_c02|NrE{k(nv)%EX~2Z792AMtPtNO`h2 zg_V?C#6X4L6xQ`Muxw*5{&W!)p46Tw z3xS?kdY4$oyJ!bG`24+qPv;V?K%o2gftxZm{=)_BhUPteU<2iF07>2#$=`-r587wD z!C7~UE8nI;>U;C&y=jXt=HQ@#sbtJBPsQ0HbmiN{cf%`n3^Hky3Foc7Dk;9I6S>dY zHWHH04nrO!hrMXHhKmfWtHwbS1^f=i*qQ0~_PR$i!T1-RJZZquRPUS@UEA0#$ebvx zU#2UwR-Ak`0#a9HE$g6*HOKb%1$1{efj!x(VcD;Y&OLDxXU%n;-6hX)$X-U1m?UCQoSt3Rys~sbm?4NMQ<%9h8tVvA|f3qX(j_DiD}{; zgNn(f8B8Cdp8xmFAwCs(FE7t8Rl<~G?q50*x+jy9#gJMwXICc-CXtR@1c%hq6>XR2 zk9d=8zT$5c(p#`Cj&Nhf@HTxEL(Q++*JPp1P%fX+J$1AgeRQ=-q~q%DIzmhY;|xNe zx$B&k8I96x(?wG+Hl)=#P&ths4rr4xIKNCRw53gbhnte*?MW~G>G&|u$ygb2Z??9D zB{q+yRDR%9<&~1EIKWNjojQhXg?C?1!4+CFVi3jHpL=-aE(?#Fsg4#QiGu+Cdy;Q? z^}75O<{cegOB~(iomO_q-8V7Y@53510aeH6%56L3uOf|dZlHb<9cl}4ecJi)mjt(w zv5M)Lx#jiKpW6%(dlX+%D^@DCgblv*?~~KGT%4PHSsUeDCCvo=Pjc3kPkXt$8{rX&;(9Q1`v+Akvu&+bA{u zy5bmyx6GASI57jm&fiRYp$J-(jtIg+NUS!O6wNl6GI<)+H-qRkig=RkVh45@u-%SH zhAb+FtP0t;sb+(bF2*ozNGiXbH7X+ZyS9QK$t_;PoG7k$ZA!s@rV&I&RtZA#4 z_0}`SJj)>O>2QOJUnz#?bVlg+}hu?nxk}m#S9h`Ms;Np{qb1fSQf`Si@o;mLyQ>LmM%YU2jjanIA3c z7yaGZ{<$g5zw){svHetW-d>hZEyxZrin)uUq8z3eTEw^=OxCytbeFF&3xVW#^xeq3 z^0$DaDpi4vcj~f$>B0a#MwAD@k|K_C1+LhDp711z;&q7?jCETqd%)(HZHgc!NSz{YVn9G_d*Q^Wp>;x z8}IO;6~D@!DrO#ki~}xM@*%Wt(W9c~PvLFR`^o)vTW7$>I7ej5)*===2Yn zDs81AOo&GnM4W+W_CXIZq}y_C?D8!q9Ba_3;&F7<$ee3i5>3(a{DqSEs)$jrrsR(; z!GBDG|De&+-sPm@8FYy51fcL%bxIFps$zmy%>oM3TeaJetDber8MNA|O!Jau5dkzS zoL{umo@gVaSzYIZItc}De-`Rdhjl8@4(FurpZxgt!y!t{9O z#emM@cIWCTjgw>92I>;kk-qDoLi(SoNJS`pDVw6UaRRjVIl(^uOtroBwMP*zABe1ze^fy~A zB?e>3UCkLJ+b&fB7@i{T>`M$zQhec!@E{4wq?obJ-xo^3m{z=rgASjKF1R>`UhIz) znBtp%&ufZ&6D-z)@ro$|O)F4os$6xGlf3}8anW_q*=xk;yot=(2`Isz zFd8ZN3dJtive0tE9a>r1kP2x{>^VDYTkB$02HRcw%soGCt$R?j;Eu3>qiVjO$pkz+ zv+uMjRFx@zdL3(bMIC2$tGm~PoROxtNvx=M{#u^eX(7DtMFI)bWt$XxEuSnTG7i>f z9U;1~KMPTMda%W1Jp&wsQ`KJd@3PK_kK) zJMI~4V(2ul|NARK*j$D!ml?#ktuz5T@80cDNNUc%>{A~_^pc*vQNIw3Y|xxuqwQ-F z4Say;9=j#ez<!8w+g*P}sDp|%DH07X)YX`|2v0M8!^~^ez5U{ro_qbIro_O5iG*~E%irzS%oo+L0^20+ zi`ngAO8|kZabBtZs~Qx>8}K?|g6y}Kf)AcyGsD-foTOuuV4;;DpufZT1aw0u&tVDQ z&>842CR-MMwVd`p?Hh{<(3Kn-v6+381HP4*G{5z}n?w`bOw}qm+Km)ykHxv#1GAID z0&~LlhQRg&LbDB=^YYl5DR-zo-FO2B0W?}?bs&WkZ&UR6SkZ=29uqB^E~@E7U#cVF zY{JkXO~00#QRi+q{2H&66VM<2ZD&*ItnnrV4j4xW=wtDOC#!u3sr|umrDpote>gPV zx-8THuuSw;u2pBmRcFO4R}SpCEgI}YP%DK6blAIr(CKC6W*tFxS1L_2a@XZ2@AlOw zjpEXpqP4^Uz}{)l^;y=4<2OoOd5T?tU65gjFc83hPd;}bvQkQ`(G|Z#Y?FhZFUUJ7JT04o#t6K=;PWIl|D@N98p*1 z`CS>8(`FDJyGtL_z65+`y~8?S@_MOx<&AFoN0el^yB4mdY?I4=&W1xY9{O;oECaVM zTk)eyA_R#3Ivi9tZdAyK0stIQ$jb3b*|&%>cZ(^$O)Lha{AIqzxAO+76e}r8oV^q0 z_{Q9Ow?4{MaaQf?!rBQm51#t8MnhwhdzODsoQAl`p+!oa$~2z9!nVXgrq@#?z4{Co8(x>Y*$kW>(25@HDmp=It#HdYaaZFRJeZrZbw81x9voHA#khXBtz z#m_(vLIQ2Z>8+l7R^TOy@p>B?Fle5*lvPZ9-PM*mG&--PRWSq2bwlOM zwT$$(=dV4}?kQz-m*eiF8@3)8!=rZuZsTc^P23ml`AY}j> z@_v?x3TO91wO5d-i+HWZa%?c!YN9hsJMK!tB`a+B#Qrv^bWnFE-|w9bb#UfoBL|}J1&)xm$DL^-?nGkd3>IIDS zuF~L@l$i~W@s7)(Q~Q?lsmq zz$7XWbB8Ck>27&WXglw|v;$ijl89?`_nm@F0bj%B;d|(Ze4_fRl#kmeu^tX+EIim3Tce+8w zKibUfo>ud8%G=A5#X3dMd#4?z1grLC5{>YBP`nQZ=@`A(=9X(XX=E|2^TdR+q6(!! zoq?+2bf?4?=g`JURpOlEKiFJ9olDDpnoaCVy9d!6A&TQ_S%PvSFUeGM*$86cncIlf z(>!@%6a`FW;~7Aj@rA|U?rM=h->4aNR0*p0N$49g_a?bUPXWSTHZdGXa8T$3+ERkf zEQ2Jf!=loVsRPH+KAH4TLvbm-{byjv)f`5cV)rZ})%ZB4S6MD20{?JA`UcqY@J)wh;V2@U99(JvA)Gx3O(rE>!6~uDs-NRt@Vc!DYmiOzBBXN)p4}*1 zfOFqi=F)P*A@>rjl^mB%A^s2O=m0Z!88G>Lhx%+K{#wZdW1FrWL#l6DP7nV0SCX@f z4fqov=9v}14&Z=E9_{Nqpl0VtztO_gI5Is z1)0*@;SSuDzDn^QGCD8+s!mhd)bIMllGrg7@2`X7|$zLjZop1WyYUY;9j^{Wp zfjA^CP8YYlW%-l7C7I@HLUhwiT(1j_B9zB*d@_^>zS_Xcrw>{VryXZ(s2 zmq#OjK5EmX*k2^u2c1-`4}=X2PTVZdCi-?~hEWoPE}+~hDcoVN3?GuO%jL?SU8<|Y z;YIIxdXk^|_`3bH-^jzKZ*|9@e@q7O#b9amST*TA%fs*9sq`!PdW+`8)&n-Tg8|YY)eqUhX8j2r-i;26vo|9r zblFZzBQHeQ=tlB#7EgCznwx2}A;(7b)LV`57FcQuSW2ofdS^B85)A4+_={J|kBg#-+Kx$nb z`NZaR6*nc(m#s4-xbNqKhk<-~bOKOsKYFn0ymbGxz7akgnoAU8J7}*<#UB$3!RjoH zuDri(J5syyPh0P#1^U3XANvsc%nGpa`?MRjpN}VW-u?G?#PfZx!5g%y1wBWSU_sGE XmqNrUR{>CUpd*J)c+~xH{>J|RI$YHB literal 0 HcmV?d00001 diff --git a/public/bounties/polycule.png b/public/bounties/polycule.png new file mode 100644 index 0000000000000000000000000000000000000000..71691946bc0465e2fcbdb9fd9aeadaa42aa64e5f GIT binary patch literal 6257 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 Va6B#^AA=ZyC}Mv2(OC&u{{x_bnl1nU literal 0 HcmV?d00001 diff --git a/public/bounties/see_more_deck.png b/public/bounties/see_more_deck.png new file mode 100644 index 0000000000000000000000000000000000000000..8e65580fc40a03aff966d0dc8aafe48a5593d293 GIT binary patch literal 5351 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 T-z>e3B0(4be%$eChK&CM6xxVM literal 0 HcmV?d00001 diff --git a/public/bounties/showman_cycle.png b/public/bounties/showman_cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..3a325a2d836f623c16b22c571c4c3ce7388820a5 GIT binary patch literal 8367 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 Tr#Vf8@<8C?m7f$Y;-~!|KGLJ3 literal 0 HcmV?d00001 diff --git a/public/bounties/singleplayer.png b/public/bounties/singleplayer.png new file mode 100644 index 0000000000000000000000000000000000000000..55c7caea359bddf4ed7cd0820c987ef9fde26856 GIT binary patch literal 5453 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

    %$sg) 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 X`}a9w693i!<`LzBC2`+8r_TN#*3_nl literal 0 HcmV?d00001 diff --git a/public/bounties/studious.png b/public/bounties/studious.png new file mode 100644 index 0000000000000000000000000000000000000000..e43e537da49f8adf43834f4559d2e26fe488a9a1 GIT binary patch literal 6924 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 literal 0 HcmV?d00001 diff --git a/public/bounties/yard_sale.png b/public/bounties/yard_sale.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc0789e10ebebded14a246451093b42c399dddf GIT binary patch literal 6477 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 Y_;BZ%Va!!Q8OQ(#51k)UG@HNme}K?5#{d8T literal 0 HcmV?d00001 From f0cea58aed654d7bd497f3e97d9b1c76f5e70473 Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Mon, 30 Mar 2026 13:26:31 -0600 Subject: [PATCH 2/6] Add bounty section to profile page And also a bounty page, but not done yet and going to convert it to something else I think --- drizzle/meta/0010_snapshot.json | 153 +++++------------- drizzle/meta/0011_snapshot.json | 153 +++++------------- public/bounties/{six_pack.png => 6_pack.png} | Bin ...nine_hole_hitter.png => 9_hole_hitter.png} | Bin ...build.png => aarons_best_build_bounty.png} | Bin .../{auto_clicker.png => autoclicker.png} | Bin ...k.png => get_to_see_more_of_your_deck.png} | Bin .../{high_pitch.png => high_pitched.png} | Bin ...e.png => hydras_space_joker_challenge.png} | Bin ...g => hydras_space_joker_challenge_alt.png} | Bin ...pants_or_are_you_just_happy_to_see_me.png} | Bin ...ney.png => money_doesnt_buy_happi_mmr.png} | Bin .../{singleplayer.png => single_player.png} | Bin ...y_made_me_change_the_name_of_this_one.png} | Bin scripts/rename-season-leaderboard-player.ts | 4 +- .../admin/lobby-codes/lobby-codes-client.tsx | 5 +- src/app/(home)/admin/lobby-codes/page.tsx | 8 +- .../admin/permissions/permissions-client.tsx | 20 ++- .../bounties/[id]/bounty-completions.tsx | 138 ++++++++++++++++ src/app/(home)/bounties/[id]/page.tsx | 24 +++ src/app/(home)/leaderboards/page.tsx | 8 +- src/app/(home)/log-parser/page.tsx | 3 +- src/app/(home)/players/[id]/page.tsx | 1 + src/app/(home)/players/[id]/user.tsx | 103 ++++++++++++ .../_components/deck-popularity-chart.tsx | 6 +- src/app/api/logs/upload/route.ts | 6 +- src/server/api/root.ts | 4 +- src/server/api/routers/bounties.ts | 24 +++ src/server/api/routers/history.ts | 28 ++-- src/server/api/routers/logs.ts | 8 +- src/server/services/botlatro.service.ts | 40 +++++ 31 files changed, 460 insertions(+), 276 deletions(-) rename public/bounties/{six_pack.png => 6_pack.png} (100%) rename public/bounties/{nine_hole_hitter.png => 9_hole_hitter.png} (100%) rename public/bounties/{aaron_best_build.png => aarons_best_build_bounty.png} (100%) rename public/bounties/{auto_clicker.png => autoclicker.png} (100%) rename public/bounties/{see_more_deck.png => get_to_see_more_of_your_deck.png} (100%) rename public/bounties/{high_pitch.png => high_pitched.png} (100%) rename public/bounties/{hydra_space.png => hydras_space_joker_challenge.png} (100%) rename public/bounties/{hydra_space_alt.png => hydras_space_joker_challenge_alt.png} (100%) rename public/bounties/{dagger_pants.png => is_that_a_dagger_in_your_pants_or_are_you_just_happy_to_see_me.png} (100%) rename public/bounties/{mmr_money.png => money_doesnt_buy_happi_mmr.png} (100%) rename public/bounties/{singleplayer.png => single_player.png} (100%) rename public/bounties/{change_name.png => they_made_me_change_the_name_of_this_one.png} (100%) create mode 100644 src/app/(home)/bounties/[id]/bounty-completions.tsx create mode 100644 src/app/(home)/bounties/[id]/page.tsx create mode 100644 src/server/api/routers/bounties.ts diff --git a/drizzle/meta/0010_snapshot.json b/drizzle/meta/0010_snapshot.json index 062511c..861b7b1 100644 --- a/drizzle/meta/0010_snapshot.json +++ b/drizzle/meta/0010_snapshot.json @@ -97,12 +97,8 @@ "name": "account_userId_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["userId"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -110,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_providerAccountId_pk": { "name": "account_provider_providerAccountId_pk", - "columns": [ - "provider", - "providerAccountId" - ] + "columns": ["provider", "providerAccountId"] } }, "uniqueConstraints": {}, @@ -204,12 +197,8 @@ "name": "banned_user_aliases_banned_user_id_banned_users_id_fk", "tableFrom": "banned_user_aliases", "tableTo": "banned_users", - "columnsFrom": [ - "banned_user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["banned_user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -303,12 +292,8 @@ "name": "banned_user_ids_banned_user_id_banned_users_id_fk", "tableFrom": "banned_user_ids", "tableTo": "banned_users", - "columnsFrom": [ - "banned_user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["banned_user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -448,12 +433,8 @@ "name": "blog_posts_author_id_user_id_fk", "tableFrom": "blog_posts", "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["author_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -463,9 +444,7 @@ "blog_posts_slug_unique": { "name": "blog_posts_slug_unique", "nullsNotDistinct": false, - "columns": [ - "slug" - ] + "columns": ["slug"] } }, "policies": {}, @@ -520,9 +499,7 @@ "mod_branches_name_unique": { "name": "mod_branches_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -967,12 +944,8 @@ "name": "games_log_file_id_log_files_id_fk", "tableFrom": "games", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1068,12 +1041,8 @@ "name": "log_file_connections_log_file_id_log_files_id_fk", "tableFrom": "log_file_connections", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1081,10 +1050,7 @@ "compositePrimaryKeys": { "log_file_connections_log_file_id_connection_id_lower_pk": { "name": "log_file_connections_log_file_id_connection_id_lower_pk", - "columns": [ - "log_file_id", - "connection_id_lower" - ] + "columns": ["log_file_id", "connection_id_lower"] } }, "uniqueConstraints": {}, @@ -1121,12 +1087,8 @@ "name": "log_file_lobby_codes_log_file_id_log_files_id_fk", "tableFrom": "log_file_lobby_codes", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1134,10 +1096,7 @@ "compositePrimaryKeys": { "log_file_lobby_codes_log_file_id_lobby_code_lower_pk": { "name": "log_file_lobby_codes_log_file_id_lobby_code_lower_pk", - "columns": [ - "log_file_id", - "lobby_code_lower" - ] + "columns": ["log_file_id", "lobby_code_lower"] } }, "uniqueConstraints": {}, @@ -1174,12 +1133,8 @@ "name": "log_file_owner_connections_log_file_id_log_files_id_fk", "tableFrom": "log_file_owner_connections", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1187,10 +1142,7 @@ "compositePrimaryKeys": { "log_file_owner_connections_log_file_id_connection_id_lower_pk": { "name": "log_file_owner_connections_log_file_id_connection_id_lower_pk", - "columns": [ - "log_file_id", - "connection_id_lower" - ] + "columns": ["log_file_id", "connection_id_lower"] } }, "uniqueConstraints": {}, @@ -1227,12 +1179,8 @@ "name": "log_file_players_log_file_id_log_files_id_fk", "tableFrom": "log_file_players", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1240,10 +1188,7 @@ "compositePrimaryKeys": { "log_file_players_log_file_id_player_name_lower_pk": { "name": "log_file_players_log_file_id_player_name_lower_pk", - "columns": [ - "log_file_id", - "player_name_lower" - ] + "columns": ["log_file_id", "player_name_lower"] } }, "uniqueConstraints": {}, @@ -1332,12 +1277,8 @@ "name": "log_files_user_id_user_id_fk", "tableFrom": "log_files", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1595,10 +1536,7 @@ "compositePrimaryKeys": { "player_games_player_id_game_num_pk": { "name": "player_games_player_id_game_num_pk", - "columns": [ - "player_id", - "game_num" - ] + "columns": ["player_id", "game_num"] } }, "uniqueConstraints": {}, @@ -1751,12 +1689,8 @@ "name": "mod_release_branch_id_mod_branches_id_fk", "tableFrom": "mod_release", "tableTo": "mod_branches", - "columnsFrom": [ - "branch_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["branch_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1876,12 +1810,8 @@ "name": "season_snapshots_season_id_seasons_id_fk", "tableFrom": "season_snapshots", "tableTo": "seasons", - "columnsFrom": [ - "season_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["season_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1999,12 +1929,8 @@ "name": "session_userId_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["userId"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -2063,9 +1989,7 @@ "transcripts_game_number_unique": { "name": "transcripts_game_number_unique", "nullsNotDistinct": false, - "columns": [ - "game_number" - ] + "columns": ["game_number"] } }, "policies": {}, @@ -2176,10 +2100,7 @@ "compositePrimaryKeys": { "verification_token_identifier_token_pk": { "name": "verification_token_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2199,4 +2120,4 @@ "schemas": {}, "tables": {} } -} \ No newline at end of file +} diff --git a/drizzle/meta/0011_snapshot.json b/drizzle/meta/0011_snapshot.json index 062511c..861b7b1 100644 --- a/drizzle/meta/0011_snapshot.json +++ b/drizzle/meta/0011_snapshot.json @@ -97,12 +97,8 @@ "name": "account_userId_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["userId"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -110,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_providerAccountId_pk": { "name": "account_provider_providerAccountId_pk", - "columns": [ - "provider", - "providerAccountId" - ] + "columns": ["provider", "providerAccountId"] } }, "uniqueConstraints": {}, @@ -204,12 +197,8 @@ "name": "banned_user_aliases_banned_user_id_banned_users_id_fk", "tableFrom": "banned_user_aliases", "tableTo": "banned_users", - "columnsFrom": [ - "banned_user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["banned_user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -303,12 +292,8 @@ "name": "banned_user_ids_banned_user_id_banned_users_id_fk", "tableFrom": "banned_user_ids", "tableTo": "banned_users", - "columnsFrom": [ - "banned_user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["banned_user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -448,12 +433,8 @@ "name": "blog_posts_author_id_user_id_fk", "tableFrom": "blog_posts", "tableTo": "user", - "columnsFrom": [ - "author_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["author_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -463,9 +444,7 @@ "blog_posts_slug_unique": { "name": "blog_posts_slug_unique", "nullsNotDistinct": false, - "columns": [ - "slug" - ] + "columns": ["slug"] } }, "policies": {}, @@ -520,9 +499,7 @@ "mod_branches_name_unique": { "name": "mod_branches_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -967,12 +944,8 @@ "name": "games_log_file_id_log_files_id_fk", "tableFrom": "games", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1068,12 +1041,8 @@ "name": "log_file_connections_log_file_id_log_files_id_fk", "tableFrom": "log_file_connections", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1081,10 +1050,7 @@ "compositePrimaryKeys": { "log_file_connections_log_file_id_connection_id_lower_pk": { "name": "log_file_connections_log_file_id_connection_id_lower_pk", - "columns": [ - "log_file_id", - "connection_id_lower" - ] + "columns": ["log_file_id", "connection_id_lower"] } }, "uniqueConstraints": {}, @@ -1121,12 +1087,8 @@ "name": "log_file_lobby_codes_log_file_id_log_files_id_fk", "tableFrom": "log_file_lobby_codes", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1134,10 +1096,7 @@ "compositePrimaryKeys": { "log_file_lobby_codes_log_file_id_lobby_code_lower_pk": { "name": "log_file_lobby_codes_log_file_id_lobby_code_lower_pk", - "columns": [ - "log_file_id", - "lobby_code_lower" - ] + "columns": ["log_file_id", "lobby_code_lower"] } }, "uniqueConstraints": {}, @@ -1174,12 +1133,8 @@ "name": "log_file_owner_connections_log_file_id_log_files_id_fk", "tableFrom": "log_file_owner_connections", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1187,10 +1142,7 @@ "compositePrimaryKeys": { "log_file_owner_connections_log_file_id_connection_id_lower_pk": { "name": "log_file_owner_connections_log_file_id_connection_id_lower_pk", - "columns": [ - "log_file_id", - "connection_id_lower" - ] + "columns": ["log_file_id", "connection_id_lower"] } }, "uniqueConstraints": {}, @@ -1227,12 +1179,8 @@ "name": "log_file_players_log_file_id_log_files_id_fk", "tableFrom": "log_file_players", "tableTo": "log_files", - "columnsFrom": [ - "log_file_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["log_file_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1240,10 +1188,7 @@ "compositePrimaryKeys": { "log_file_players_log_file_id_player_name_lower_pk": { "name": "log_file_players_log_file_id_player_name_lower_pk", - "columns": [ - "log_file_id", - "player_name_lower" - ] + "columns": ["log_file_id", "player_name_lower"] } }, "uniqueConstraints": {}, @@ -1332,12 +1277,8 @@ "name": "log_files_user_id_user_id_fk", "tableFrom": "log_files", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1595,10 +1536,7 @@ "compositePrimaryKeys": { "player_games_player_id_game_num_pk": { "name": "player_games_player_id_game_num_pk", - "columns": [ - "player_id", - "game_num" - ] + "columns": ["player_id", "game_num"] } }, "uniqueConstraints": {}, @@ -1751,12 +1689,8 @@ "name": "mod_release_branch_id_mod_branches_id_fk", "tableFrom": "mod_release", "tableTo": "mod_branches", - "columnsFrom": [ - "branch_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["branch_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1876,12 +1810,8 @@ "name": "season_snapshots_season_id_seasons_id_fk", "tableFrom": "season_snapshots", "tableTo": "seasons", - "columnsFrom": [ - "season_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["season_id"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -1999,12 +1929,8 @@ "name": "session_userId_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "userId" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["userId"], + "columnsTo": ["id"], "onDelete": "no action", "onUpdate": "no action" } @@ -2063,9 +1989,7 @@ "transcripts_game_number_unique": { "name": "transcripts_game_number_unique", "nullsNotDistinct": false, - "columns": [ - "game_number" - ] + "columns": ["game_number"] } }, "policies": {}, @@ -2176,10 +2100,7 @@ "compositePrimaryKeys": { "verification_token_identifier_token_pk": { "name": "verification_token_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2199,4 +2120,4 @@ "schemas": {}, "tables": {} } -} \ No newline at end of file +} diff --git a/public/bounties/six_pack.png b/public/bounties/6_pack.png similarity index 100% rename from public/bounties/six_pack.png rename to public/bounties/6_pack.png diff --git a/public/bounties/nine_hole_hitter.png b/public/bounties/9_hole_hitter.png similarity index 100% rename from public/bounties/nine_hole_hitter.png rename to public/bounties/9_hole_hitter.png diff --git a/public/bounties/aaron_best_build.png b/public/bounties/aarons_best_build_bounty.png similarity index 100% rename from public/bounties/aaron_best_build.png rename to public/bounties/aarons_best_build_bounty.png diff --git a/public/bounties/auto_clicker.png b/public/bounties/autoclicker.png similarity index 100% rename from public/bounties/auto_clicker.png rename to public/bounties/autoclicker.png diff --git a/public/bounties/see_more_deck.png b/public/bounties/get_to_see_more_of_your_deck.png similarity index 100% rename from public/bounties/see_more_deck.png rename to public/bounties/get_to_see_more_of_your_deck.png diff --git a/public/bounties/high_pitch.png b/public/bounties/high_pitched.png similarity index 100% rename from public/bounties/high_pitch.png rename to public/bounties/high_pitched.png diff --git a/public/bounties/hydra_space.png b/public/bounties/hydras_space_joker_challenge.png similarity index 100% rename from public/bounties/hydra_space.png rename to public/bounties/hydras_space_joker_challenge.png diff --git a/public/bounties/hydra_space_alt.png b/public/bounties/hydras_space_joker_challenge_alt.png similarity index 100% rename from public/bounties/hydra_space_alt.png rename to public/bounties/hydras_space_joker_challenge_alt.png diff --git a/public/bounties/dagger_pants.png b/public/bounties/is_that_a_dagger_in_your_pants_or_are_you_just_happy_to_see_me.png similarity index 100% rename from public/bounties/dagger_pants.png rename to public/bounties/is_that_a_dagger_in_your_pants_or_are_you_just_happy_to_see_me.png diff --git a/public/bounties/mmr_money.png b/public/bounties/money_doesnt_buy_happi_mmr.png similarity index 100% rename from public/bounties/mmr_money.png rename to public/bounties/money_doesnt_buy_happi_mmr.png diff --git a/public/bounties/singleplayer.png b/public/bounties/single_player.png similarity index 100% rename from public/bounties/singleplayer.png rename to public/bounties/single_player.png diff --git a/public/bounties/change_name.png b/public/bounties/they_made_me_change_the_name_of_this_one.png similarity index 100% rename from public/bounties/change_name.png rename to public/bounties/they_made_me_change_the_name_of_this_one.png diff --git a/scripts/rename-season-leaderboard-player.ts b/scripts/rename-season-leaderboard-player.ts index f1f9394..6f5e14a 100644 --- a/scripts/rename-season-leaderboard-player.ts +++ b/scripts/rename-season-leaderboard-player.ts @@ -342,7 +342,9 @@ async function main() { await redis.del(getSeasonQueuesCacheKey(args.seasonId)) console.log(`uploaded=${nextObjectKey}`) - console.log(`cleared=${getSeasonLeaderboardKey(args.seasonId, snapshot.queueId)}`) + console.log( + `cleared=${getSeasonLeaderboardKey(args.seasonId, snapshot.queueId)}` + ) } main() diff --git a/src/app/(home)/admin/lobby-codes/lobby-codes-client.tsx b/src/app/(home)/admin/lobby-codes/lobby-codes-client.tsx index 518d83e..577e0bd 100644 --- a/src/app/(home)/admin/lobby-codes/lobby-codes-client.tsx +++ b/src/app/(home)/admin/lobby-codes/lobby-codes-client.tsx @@ -85,10 +85,7 @@ export function LobbyCodesClient({ - + Loading... diff --git a/src/app/(home)/admin/lobby-codes/page.tsx b/src/app/(home)/admin/lobby-codes/page.tsx index fb08c8c..2df9b84 100644 --- a/src/app/(home)/admin/lobby-codes/page.tsx +++ b/src/app/(home)/admin/lobby-codes/page.tsx @@ -18,10 +18,7 @@ export default async function LobbyCodesPage({ searchParams: Promise> }) { const session = await auth() - const canSearchLobbyCodes = hasPermission( - session?.user, - 'transcripts.search' - ) + const canSearchLobbyCodes = hasPermission(session?.user, 'transcripts.search') if (!canSearchLobbyCodes) { return ( @@ -34,8 +31,7 @@ export default async function LobbyCodesPage({ } const params = await searchParams - const search = - typeof params.search === 'string' ? params.search.trim() : '' + const search = typeof params.search === 'string' ? params.search.trim() : '' if (search.length > 0) { await api.history.searchTranscriptLobbyCodes.prefetch({ diff --git a/src/app/(home)/admin/permissions/permissions-client.tsx b/src/app/(home)/admin/permissions/permissions-client.tsx index 5cb8de5..3c36096 100644 --- a/src/app/(home)/admin/permissions/permissions-client.tsx +++ b/src/app/(home)/admin/permissions/permissions-client.tsx @@ -351,24 +351,32 @@ export function PermissionsClient() { > {group.title}

    {group.permissions.map((permission) => { - const checked = draftPermissions.includes(permission.key) + const checked = draftPermissions.includes( + permission.key + ) const checkboxId = `perm-${permission.key}` const descId = `desc-${permission.key}` @@ -377,7 +385,7 @@ export function PermissionsClient() { key={permission.key} htmlFor={checkboxId} className={cn( - 'flex cursor-pointer items-start gap-3 rounded-md border p-2 transition-colors select-none', + 'flex cursor-pointer select-none items-start gap-3 rounded-md border p-2 transition-colors', checked ? 'border-primary/30 bg-primary/5' : 'border-transparent hover:border-border hover:bg-muted/30' diff --git a/src/app/(home)/bounties/[id]/bounty-completions.tsx b/src/app/(home)/bounties/[id]/bounty-completions.tsx new file mode 100644 index 0000000..232bf23 --- /dev/null +++ b/src/app/(home)/bounties/[id]/bounty-completions.tsx @@ -0,0 +1,138 @@ +'use client' + +import { format } from 'date-fns' +import Image from 'next/image' +import Link from 'next/link' +import { cn } from '@/lib/utils' +import type { BountyCompletion } from '@/server/services/botlatro.service' +import { api } from '@/trpc/react' + +function bountyNameToIconPath(bountyName: string): string { + const slug = bountyName + .toLowerCase() + .replace(/\s+/g, '_') + .replace(/[^a-z0-9_]/g, '') + return `/bounties/${slug}.png` +} + +function CompletionRow({ + completion, + index, +}: { + completion: BountyCompletion + index: number +}) { + return ( + + + {index + 1} + + + {completion.user_id} + + {completion.is_first && ( + + First + + )} + + {format(new Date(completion.completed_at), 'MMM d, yyyy')} + + + ) +} + +export function BountyCompletions({ bountyName }: { bountyName: string }) { + const { data, isLoading } = api.bounties.get_bounty_completions.useQuery({ + bounty_name: bountyName, + }) + + if (isLoading) { + return ( +
    + Loading... +
    + ) + } + + if (!data) { + return ( +
    + Bounty not found +
    + ) + } + + const { bounty, completions } = data + const iconPath = bountyNameToIconPath(bounty.bounty_name) + const firstCompletion = completions.find((c) => c.is_first) + const sorted = [...completions].sort( + (a, b) => new Date(a.completed_at).getTime() - new Date(b.completed_at).getTime() + ) + + return ( +
    + {/* Bounty header */} +
    +
    + {bounty.bounty_name} +
    +
    +

    {bounty.bounty_name}

    +

    {bounty.description}

    +

    + {completions.length}{' '} + {completions.length === 1 ? 'completion' : 'completions'} +

    +
    +
    + + {/* First completion callout */} + {firstCompletion && ( +
    +

    + First Completion +

    + + {firstCompletion.user_id} + + {format(new Date(firstCompletion.completed_at), 'MMM d, yyyy')} + + +
    + )} + + {/* All completions */} + {sorted.length > 0 && ( +
    +
    +

    All Completions

    +
    +
    + {sorted.map((completion, index) => ( + + ))} +
    +
    + )} +
    + ) +} diff --git a/src/app/(home)/bounties/[id]/page.tsx b/src/app/(home)/bounties/[id]/page.tsx new file mode 100644 index 0000000..54dae82 --- /dev/null +++ b/src/app/(home)/bounties/[id]/page.tsx @@ -0,0 +1,24 @@ +import { Suspense } from 'react' +import { api, HydrateClient } from '@/trpc/server' +import { BountyCompletions } from './bounty-completions' + +type Props = { + params: Promise<{ id: string }> +} + +export default async function BountyPage({ params }: Props) { + const { id } = await params + const bountyName = decodeURIComponent(id) + + await api.bounties.get_bounty_completions.prefetch({ bounty_name: bountyName }) + + return ( + + +
    + +
    +
    +
    + ) +} diff --git a/src/app/(home)/leaderboards/page.tsx b/src/app/(home)/leaderboards/page.tsx index e681af3..f882c0c 100644 --- a/src/app/(home)/leaderboards/page.tsx +++ b/src/app/(home)/leaderboards/page.tsx @@ -36,11 +36,15 @@ export default async function Home({ }) { const params = await searchParams - const activeSeasonNumber = await getActiveSeasonNumber() - const activeSeason = getSeasonKey(activeSeasonNumber) const seasons = await api.seasons.list() const seasonIds = new Set(seasons.map((season) => season.id)) + const activeSeasonNumber = + seasons.find((s) => s.isActive)?.id ?? + seasons.at(-1)?.id ?? + (await getActiveSeasonNumber()) + const activeSeason = getSeasonKey(activeSeasonNumber) + const requestedSeason = SeasonSchema.safeParse(params.season).success && params.season !== undefined && diff --git a/src/app/(home)/log-parser/page.tsx b/src/app/(home)/log-parser/page.tsx index e0a673e..811c102 100644 --- a/src/app/(home)/log-parser/page.tsx +++ b/src/app/(home)/log-parser/page.tsx @@ -775,7 +775,8 @@ function FinalJokerList({ // Main component export default function LogParser() { const formatter = useFormatter() - const resolveCocktailDecksMutation = api.logs.resolveCocktailDecks.useMutation() + const resolveCocktailDecksMutation = + api.logs.resolveCocktailDecks.useMutation() const searchParams = useSearchParams() const { data: session } = useSession() const [parsedGames, setParsedGames] = useState([]) diff --git a/src/app/(home)/players/[id]/page.tsx b/src/app/(home)/players/[id]/page.tsx index 424993b..c618209 100644 --- a/src/app/(home)/players/[id]/page.tsx +++ b/src/app/(home)/players/[id]/page.tsx @@ -66,6 +66,7 @@ export default async function PlayerPage({ params, searchParams }: Props) { if (id) { await Promise.all([ + api.bounties.get_user_bounties.prefetch({ user_id: id }), api.history.user_games.prefetch({ user_id: id }), api.history.user_games_page.prefetch({ user_id: id, diff --git a/src/app/(home)/players/[id]/user.tsx b/src/app/(home)/players/[id]/user.tsx index 3551b0f..90cbf11 100644 --- a/src/app/(home)/players/[id]/user.tsx +++ b/src/app/(home)/players/[id]/user.tsx @@ -11,6 +11,7 @@ import { Youtube, } from 'lucide-react' import Image from 'next/image' +import Link from 'next/link' import { useParams } from 'next/navigation' import { useMemo, useState } from 'react' import { isNonNullish } from 'remeda' @@ -48,6 +49,7 @@ import { } from '@/components/ui/select' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { cn } from '@/lib/utils' +import type { UserBounty } from '@/server/services/botlatro.service' import { LEGACY_QUEUE_ID, OLD_RANKED_CHANNEL, @@ -129,6 +131,7 @@ const TAB_OPTIONS = [ { value: 'deck-stake-stats', label: 'Decks / Stakes' }, { value: 'mmr-trends', label: 'MMR Trends' }, { value: 'winrate-trends', label: 'Winrate Trends' }, + { value: 'bounties', label: 'Bounties' }, ] as const function UserInfoComponent() { @@ -149,6 +152,10 @@ function UserInfoComponent() { user_id: id, }) + const { data: bounties = [] } = api.bounties.get_user_bounties.useQuery({ + user_id: id, + }) + const [rankedLeaderboard] = api.leaderboard.get_leaderboard.useSuspenseQuery({ channel_id: rankedChannelId, season, @@ -786,6 +793,9 @@ function UserInfoComponent() { + + +
    @@ -914,3 +924,96 @@ function QueueCard({ ) } + +/* ── Bounties Section ── */ + +function bountyNameToIconPath(bountyName: string): string { + console.log(bountyName) + const slug = bountyName + .toLowerCase() + .replace(/\s+/g, '_') + .replace(/[^a-z0-9_]/g, '') + return `/bounties/${slug}.png` +} + +function BountyIcon({ bounty }: { bounty: UserBounty }) { + return ( + + + + +
    + {bounty.bounty_name} +
    + + {bounty.bounty_name} + + +
    + +

    {bounty.bounty_name}

    +

    {bounty.description}

    +
    +
    +
    + ) +} + +function BountiesSection({ bounties }: { bounties: UserBounty[] }) { + if (bounties.length === 0) { + return ( +
    + No bounties earned yet +
    + ) + } + + const firstCompletions = bounties.filter((b) => b.is_first) + const regularCompletions = bounties.filter((b) => !b.is_first) + + return ( +
    + {firstCompletions.length > 0 && ( +
    +

    + First Completions +

    +
    + {firstCompletions.map((bounty) => ( + + ))} +
    +
    + )} + {regularCompletions.length > 0 && ( +
    +

    + Completions +

    +
    + {regularCompletions.map((bounty) => ( + + ))} +
    +
    + )} +
    + ) +} + diff --git a/src/app/(home)/stats/_components/deck-popularity-chart.tsx b/src/app/(home)/stats/_components/deck-popularity-chart.tsx index 47e9456..5c63862 100644 --- a/src/app/(home)/stats/_components/deck-popularity-chart.tsx +++ b/src/app/(home)/stats/_components/deck-popularity-chart.tsx @@ -4,8 +4,6 @@ import { format } from 'date-fns' import { BarChart3, CalendarIcon, PieChartIcon } from 'lucide-react' import { parseAsString, useQueryStates } from 'nuqs' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { Label } from '@/components/ui/label' -import { Switch } from '@/components/ui/switch' import { Bar, BarChart, @@ -27,6 +25,7 @@ import { ChartTooltip, ChartTooltipContent, } from '@/components/ui/chart' +import { Label } from '@/components/ui/label' import { Popover, PopoverContent, @@ -39,6 +38,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select' +import { Switch } from '@/components/ui/switch' import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group' import { cn } from '@/lib/utils' import { @@ -271,7 +271,7 @@ export function DeckPopularityChart({ /> diff --git a/src/app/api/logs/upload/route.ts b/src/app/api/logs/upload/route.ts index 350c147..e2da333 100644 --- a/src/app/api/logs/upload/route.ts +++ b/src/app/api/logs/upload/route.ts @@ -684,7 +684,11 @@ export async function PUT(req: NextRequest) { botlatro_service .sendWarning({ title: `Warning: banned user match detected in uploaded log #${logFileId}`, - lines: formatBannedUserWarningLines(bannedMatches, logUrl, lobbyCodes), + lines: formatBannedUserWarningLines( + bannedMatches, + logUrl, + lobbyCodes + ), }) .catch((error) => { console.error( diff --git a/src/server/api/root.ts b/src/server/api/root.ts index 50f6c04..706a09e 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -1,5 +1,6 @@ import { bannedUsersRouter } from '@/server/api/routers/banned-users' import { blogRouter } from '@/server/api/routers/blog' +import { bountiesRouter } from '@/server/api/routers/bounties' import { branchesRouter } from '@/server/api/routers/branches' import { history_router } from '@/server/api/routers/history' import { leaderboard_router } from '@/server/api/routers/leaderboard' @@ -7,8 +8,8 @@ import { logsRouter } from '@/server/api/routers/logs' import { moderationRouter } from '@/server/api/routers/moderation' import { playerStateRouter } from '@/server/api/routers/player-state' import { playersRouter } from '@/server/api/routers/players' -import { queuesRouter } from '@/server/api/routers/queues' import { profileRouter } from '@/server/api/routers/profile' +import { queuesRouter } from '@/server/api/routers/queues' import { releasesRouter } from '@/server/api/routers/releases' import { seasonsRouter } from '@/server/api/routers/seasons' import { stats_router } from '@/server/api/routers/stats' @@ -23,6 +24,7 @@ import { createCallerFactory, createTRPCRouter } from '@/server/api/trpc' export const appRouter = createTRPCRouter({ bannedUsers: bannedUsersRouter, blog: blogRouter, + bounties: bountiesRouter, branches: branchesRouter, history: history_router, players: playersRouter, diff --git a/src/server/api/routers/bounties.ts b/src/server/api/routers/bounties.ts new file mode 100644 index 0000000..2a7c9dc --- /dev/null +++ b/src/server/api/routers/bounties.ts @@ -0,0 +1,24 @@ +import { z } from 'zod' +import { createTRPCRouter, publicProcedure } from '@/server/api/trpc' +import { botlatro_service } from '@/server/services/botlatro.service' +import { DISCORD_SNOWFLAKE_REGEX } from '@/shared/discord' + +export const bountiesRouter = createTRPCRouter({ + get_user_bounties: publicProcedure + .input( + z.object({ + user_id: z + .string() + .regex(DISCORD_SNOWFLAKE_REGEX, 'Invalid Discord user ID'), + }) + ) + .query(async ({ input }) => { + return botlatro_service.get_user_bounties(input.user_id) + }), + + get_bounty_completions: publicProcedure + .input(z.object({ bounty_name: z.string().min(1) })) + .query(async ({ input }) => { + return botlatro_service.get_bounty_completions(input.bounty_name) + }), +}) diff --git a/src/server/api/routers/history.ts b/src/server/api/routers/history.ts index dc7184d..afd31db 100644 --- a/src/server/api/routers/history.ts +++ b/src/server/api/routers/history.ts @@ -220,20 +220,20 @@ export const history_router = createTRPCRouter({ input.sortBy === 'gameId' ? player_games.gameId : input.sortBy === 'opponentName' - ? player_games.opponentName - : input.sortBy === 'gameType' - ? player_games.gameType - : input.sortBy === 'deck' - ? player_games.deck - : input.sortBy === 'stake' - ? player_games.stake - : input.sortBy === 'opponentMmr' - ? player_games.opponentMmr - : input.sortBy === 'playerMmr' - ? player_games.playerMmr - : input.sortBy === 'mmrChange' - ? player_games.mmrChange - : player_games.gameTime + ? player_games.opponentName + : input.sortBy === 'gameType' + ? player_games.gameType + : input.sortBy === 'deck' + ? player_games.deck + : input.sortBy === 'stake' + ? player_games.stake + : input.sortBy === 'opponentMmr' + ? player_games.opponentMmr + : input.sortBy === 'playerMmr' + ? player_games.playerMmr + : input.sortBy === 'mmrChange' + ? player_games.mmrChange + : player_games.gameTime const where = and( eq(player_games.playerId, input.user_id), diff --git a/src/server/api/routers/logs.ts b/src/server/api/routers/logs.ts index fb933de..9d67504 100644 --- a/src/server/api/routers/logs.ts +++ b/src/server/api/routers/logs.ts @@ -18,11 +18,9 @@ async function fetchCocktailDecks(seed: string, config: string) { return null } - const payload = (await response.json().catch(() => null)) as - | { - decks?: unknown - } - | null + const payload = (await response.json().catch(() => null)) as { + decks?: unknown + } | null if (!Array.isArray(payload?.decks)) { return null diff --git a/src/server/services/botlatro.service.ts b/src/server/services/botlatro.service.ts index 9af873e..5a3086b 100644 --- a/src/server/services/botlatro.service.ts +++ b/src/server/services/botlatro.service.ts @@ -421,6 +421,19 @@ export const botlatro_service = { body: JSON.stringify(input), }) }, + + get_user_bounties: async (user_id: string): Promise => { + const result = await botlatroAuthedRequest<{ bounties: UserBounty[] }>( + `api/bounties/user/${encodeURIComponent(user_id)}` + ) + return result.bounties + }, + + get_bounty_completions: async (bounty_name: string): Promise => { + return botlatroAuthedRequest( + `api/bounties/${encodeURIComponent(bounty_name)}/completions` + ) + }, } export type QueueSettings = { @@ -631,3 +644,30 @@ export type WarningInput = { export type MonitoringSuccess = { success: true } + +export type UserBounty = { + id: number + bounty_id: number + user_id: string + is_first: boolean + completed_at: string + bounty_name: string + description: string +} + +export type BountyCompletion = { + id: number + bounty_id: number + user_id: string + is_first: boolean + completed_at: string +} + +export type BountyCompletionsResponse = { + bounty: { + id: number + bounty_name: string + description: string + } + completions: BountyCompletion[] +} From 1675b50f54c21bf87a7ae35e383245993af919a4 Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Mon, 30 Mar 2026 14:35:51 -0600 Subject: [PATCH 3/6] Add a few extra icons --- public/bounties/good_ol_days.png | Bin 0 -> 6375 bytes public/bounties/maybe_top_250.png | Bin 0 -> 6359 bytes public/bounties/placeholder.png | Bin 0 -> 5589 bytes src/app/(home)/stats/_components/stats-tabs.tsx | 4 +++- src/app/(home)/stats/search-params.constants.ts | 1 + 5 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 public/bounties/good_ol_days.png create mode 100644 public/bounties/maybe_top_250.png create mode 100644 public/bounties/placeholder.png diff --git a/public/bounties/good_ol_days.png b/public/bounties/good_ol_days.png new file mode 100644 index 0000000000000000000000000000000000000000..63deb98b00b8223e005c2b2967899ff1330ad3e0 GIT binary patch literal 6375 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 literal 0 HcmV?d00001 diff --git a/public/bounties/maybe_top_250.png b/public/bounties/maybe_top_250.png new file mode 100644 index 0000000000000000000000000000000000000000..2d43a81e0e02cf1761d842b43371493378274e51 GIT binary patch literal 6359 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 literal 0 HcmV?d00001 diff --git a/src/app/(home)/stats/_components/stats-tabs.tsx b/src/app/(home)/stats/_components/stats-tabs.tsx index 22254a2..0d4abed 100644 --- a/src/app/(home)/stats/_components/stats-tabs.tsx +++ b/src/app/(home)/stats/_components/stats-tabs.tsx @@ -32,7 +32,9 @@ const TABS = STAT_TABS.map((value) => ({ ? 'Season Overview' : value === 'live-matches' ? 'Live Matches' - : 'Game Activity', + : value === 'bounties' + ? 'Bounties' + : 'Game Activity', })) type StatsTabsProps = { diff --git a/src/app/(home)/stats/search-params.constants.ts b/src/app/(home)/stats/search-params.constants.ts index 8479fd4..34f4871 100644 --- a/src/app/(home)/stats/search-params.constants.ts +++ b/src/app/(home)/stats/search-params.constants.ts @@ -13,6 +13,7 @@ export const STAT_TABS = [ 'season-overview', 'game-activity', 'live-matches', + 'bounties' ] as const export const STATS_FILTER_MODES = ['season', 'dateRange'] as const From 9ac40b5bc425c015abe92c09f7e5bb8d03a73da3 Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Tue, 31 Mar 2026 03:49:56 -0600 Subject: [PATCH 4/6] Change from link to dialog popup Looks way better and flows way better --- .../bounties/[id]/bounty-completions.tsx | 16 ++-- src/app/(home)/players/[id]/user.tsx | 85 +++++++++++-------- src/server/services/botlatro.service.ts | 13 ++- 3 files changed, 73 insertions(+), 41 deletions(-) diff --git a/src/app/(home)/bounties/[id]/bounty-completions.tsx b/src/app/(home)/bounties/[id]/bounty-completions.tsx index 232bf23..a19f0de 100644 --- a/src/app/(home)/bounties/[id]/bounty-completions.tsx +++ b/src/app/(home)/bounties/[id]/bounty-completions.tsx @@ -3,9 +3,11 @@ import { format } from 'date-fns' import Image from 'next/image' import Link from 'next/link' +import { useState } from 'react' import { cn } from '@/lib/utils' -import type { BountyCompletion } from '@/server/services/botlatro.service' -import { api } from '@/trpc/react' +import { api, type RouterOutputs } from '@/trpc/react' + +type BountyCompletion = RouterOutputs['bounties']['get_bounty_completions']['completions'][number] function bountyNameToIconPath(bountyName: string): string { const slug = bountyName @@ -31,7 +33,7 @@ function CompletionRow({ {index + 1} - {completion.user_id} + {completion.display_name} {completion.is_first && ( @@ -46,6 +48,7 @@ function CompletionRow({ } export function BountyCompletions({ bountyName }: { bountyName: string }) { + const [imgError, setImgError] = useState(false) const { data, isLoading } = api.bounties.get_bounty_completions.useQuery({ bounty_name: bountyName, }) @@ -84,12 +87,13 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) { )} > {bounty.bounty_name} setImgError(true)} />
    @@ -112,7 +116,7 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) { href={`/players/${firstCompletion.user_id}`} className='flex items-center gap-3 rounded-lg px-1 py-1 transition-colors hover:bg-amber-500/10' > - {firstCompletion.user_id} + {firstCompletion.display_name} {format(new Date(firstCompletion.completed_at), 'MMM d, yyyy')} @@ -126,7 +130,7 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) {

    All Completions

    -
    +
    {sorted.map((completion, index) => ( ))} diff --git a/src/app/(home)/players/[id]/user.tsx b/src/app/(home)/players/[id]/user.tsx index 90cbf11..9821100 100644 --- a/src/app/(home)/players/[id]/user.tsx +++ b/src/app/(home)/players/[id]/user.tsx @@ -11,7 +11,6 @@ import { Youtube, } from 'lucide-react' import Image from 'next/image' -import Link from 'next/link' import { useParams } from 'next/navigation' import { useMemo, useState } from 'react' import { isNonNullish } from 'remeda' @@ -29,6 +28,11 @@ import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' +import { + Dialog, + DialogContent, + DialogTitle, +} from '@/components/ui/dialog' import { Tooltip, TooltipContent, @@ -48,6 +52,7 @@ import { SelectValue, } from '@/components/ui/select' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { BountyCompletions } from '@/app/(home)/bounties/[id]/bounty-completions' import { cn } from '@/lib/utils' import type { UserBounty } from '@/server/services/botlatro.service' import { @@ -937,41 +942,53 @@ function bountyNameToIconPath(bountyName: string): string { } function BountyIcon({ bounty }: { bounty: UserBounty }) { + const [open, setOpen] = useState(false) + const [imgError, setImgError] = useState(false) return ( - - - - -
    + + + +
    - - {bounty.bounty_name} - - -
    - -

    {bounty.bounty_name}

    -

    {bounty.description}

    -
    -
    -
    +
    + {bounty.bounty_name} setImgError(true)} + /> +
    + + {bounty.bounty_name} + + + + +

    {bounty.bounty_name}

    +

    {bounty.description}

    +
    + + + + + {bounty.bounty_name} + + + + ) } diff --git a/src/server/services/botlatro.service.ts b/src/server/services/botlatro.service.ts index 5a3086b..96faa30 100644 --- a/src/server/services/botlatro.service.ts +++ b/src/server/services/botlatro.service.ts @@ -7,11 +7,14 @@ import { redis } from '../redis' const BOTLATRO_URL = 'http://balatro.virtualized.dev:4931/' const TRANSCRIPT_CACHE_TTL_SECONDS = 60 * 60 * 24 * 7 const GUILD_MEMBER_SEARCH_CACHE_TTL_SECONDS = 60 * 60 * 24 +const GUILD_MEMBER_CACHE_TTL_SECONDS = 60 * 60 * 24 export const TRANSCRIPT_CACHE_KEY = (gameNumber: number) => `transcript:${gameNumber}` export const GUILD_MEMBER_SEARCH_CACHE_KEY = (query: string) => `discord:guild-member-search:${query.toLowerCase()}` +export const GUILD_MEMBER_CACHE_KEY = (user_id: string) => + `discord:guild-member:${user_id}` async function botlatroAuthedRequest( path: string, @@ -76,9 +79,16 @@ type TranscriptLobbyCodeSearchResponse = { export const botlatro_service = { getUser: async (user_id: string): Promise => { - return botlatroAuthedRequest( + const cacheKey = GUILD_MEMBER_CACHE_KEY(user_id) + const cached = await redis.get(cacheKey) + if (cached) { + return JSON.parse(cached) as GuildMemberUser + } + const member = await botlatroAuthedRequest( `api/users/${encodeURIComponent(user_id)}` ) + await redis.setEx(cacheKey, GUILD_MEMBER_CACHE_TTL_SECONDS, JSON.stringify(member)) + return member }, getQueueSettings: async (): Promise => { @@ -659,6 +669,7 @@ export type BountyCompletion = { id: number bounty_id: number user_id: string + display_name: string is_first: boolean completed_at: string } From 2bcbb49b500c613c5182b310b7a70a3c656e632f Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Tue, 31 Mar 2026 03:51:15 -0600 Subject: [PATCH 5/6] Biome check:write --- .../bounties/[id]/bounty-completions.tsx | 28 +++++++++++++----- src/app/(home)/bounties/[id]/page.tsx | 4 ++- src/app/(home)/players/[id]/user.tsx | 29 +++++++++---------- .../(home)/stats/search-params.constants.ts | 2 +- src/server/services/botlatro.service.ts | 10 +++++-- 5 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/app/(home)/bounties/[id]/bounty-completions.tsx b/src/app/(home)/bounties/[id]/bounty-completions.tsx index a19f0de..f64cef3 100644 --- a/src/app/(home)/bounties/[id]/bounty-completions.tsx +++ b/src/app/(home)/bounties/[id]/bounty-completions.tsx @@ -7,7 +7,8 @@ import { useState } from 'react' import { cn } from '@/lib/utils' import { api, type RouterOutputs } from '@/trpc/react' -type BountyCompletion = RouterOutputs['bounties']['get_bounty_completions']['completions'][number] +type BountyCompletion = + RouterOutputs['bounties']['get_bounty_completions']['completions'][number] function bountyNameToIconPath(bountyName: string): string { const slug = bountyName @@ -73,7 +74,8 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) { const iconPath = bountyNameToIconPath(bounty.bounty_name) const firstCompletion = completions.find((c) => c.is_first) const sorted = [...completions].sort( - (a, b) => new Date(a.completed_at).getTime() - new Date(b.completed_at).getTime() + (a, b) => + new Date(a.completed_at).getTime() - new Date(b.completed_at).getTime() ) return ( @@ -83,7 +85,7 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) {

    {bounty.bounty_name}

    -

    {bounty.description}

    +

    + {bounty.description} +

    - {completions.length}{' '} + + {completions.length} + {' '} {completions.length === 1 ? 'completion' : 'completions'}

    @@ -116,7 +122,9 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) { href={`/players/${firstCompletion.user_id}`} className='flex items-center gap-3 rounded-lg px-1 py-1 transition-colors hover:bg-amber-500/10' > - {firstCompletion.display_name} + + {firstCompletion.display_name} + {format(new Date(firstCompletion.completed_at), 'MMM d, yyyy')} @@ -130,9 +138,13 @@ export function BountyCompletions({ bountyName }: { bountyName: string }) {

    All Completions

    -
    +
    {sorted.map((completion, index) => ( - + ))}
    diff --git a/src/app/(home)/bounties/[id]/page.tsx b/src/app/(home)/bounties/[id]/page.tsx index 54dae82..02fd661 100644 --- a/src/app/(home)/bounties/[id]/page.tsx +++ b/src/app/(home)/bounties/[id]/page.tsx @@ -10,7 +10,9 @@ export default async function BountyPage({ params }: Props) { const { id } = await params const bountyName = decodeURIComponent(id) - await api.bounties.get_bounty_completions.prefetch({ bounty_name: bountyName }) + await api.bounties.get_bounty_completions.prefetch({ + bounty_name: bountyName, + }) return ( diff --git a/src/app/(home)/players/[id]/user.tsx b/src/app/(home)/players/[id]/user.tsx index 9821100..9204ab1 100644 --- a/src/app/(home)/players/[id]/user.tsx +++ b/src/app/(home)/players/[id]/user.tsx @@ -14,6 +14,7 @@ import Image from 'next/image' import { useParams } from 'next/navigation' import { useMemo, useState } from 'react' import { isNonNullish } from 'remeda' +import { BountyCompletions } from '@/app/(home)/bounties/[id]/bounty-completions' import { DeckImage, DeckStakeStatsChart, @@ -27,12 +28,8 @@ import { TimeZoneProvider } from '@/components/timezone-provider' import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' +import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' -import { - Dialog, - DialogContent, - DialogTitle, -} from '@/components/ui/dialog' import { Tooltip, TooltipContent, @@ -52,7 +49,6 @@ import { SelectValue, } from '@/components/ui/select' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' -import { BountyCompletions } from '@/app/(home)/bounties/[id]/bounty-completions' import { cn } from '@/lib/utils' import type { UserBounty } from '@/server/services/botlatro.service' import { @@ -958,11 +954,15 @@ function BountyIcon({ bounty }: { bounty: UserBounty }) { className={cn( 'relative rounded-md', bounty.is_first && - 'ring-2 ring-amber-400/80 ring-offset-1 ring-offset-background shadow-[0_0_12px_4px_rgba(251,191,36,0.5)]' + 'shadow-[0_0_12px_4px_rgba(251,191,36,0.5)] ring-2 ring-amber-400/80 ring-offset-1 ring-offset-background' )} > {bounty.bounty_name} setImgError(true)} />
    - + {bounty.bounty_name} @@ -983,7 +983,7 @@ function BountyIcon({ bounty }: { bounty: UserBounty }) { - + {bounty.bounty_name} @@ -996,7 +996,9 @@ function BountiesSection({ bounties }: { bounties: UserBounty[] }) { if (bounties.length === 0) { return (
    - No bounties earned yet + + No bounties earned yet +
    ) } @@ -1020,9 +1022,7 @@ function BountiesSection({ bounties }: { bounties: UserBounty[] }) { )} {regularCompletions.length > 0 && (
    -

    - Completions -

    +

    Completions

    {regularCompletions.map((bounty) => ( @@ -1033,4 +1033,3 @@ function BountiesSection({ bounties }: { bounties: UserBounty[] }) {
    ) } - diff --git a/src/app/(home)/stats/search-params.constants.ts b/src/app/(home)/stats/search-params.constants.ts index 34f4871..e95103d 100644 --- a/src/app/(home)/stats/search-params.constants.ts +++ b/src/app/(home)/stats/search-params.constants.ts @@ -13,7 +13,7 @@ export const STAT_TABS = [ 'season-overview', 'game-activity', 'live-matches', - 'bounties' + 'bounties', ] as const export const STATS_FILTER_MODES = ['season', 'dateRange'] as const diff --git a/src/server/services/botlatro.service.ts b/src/server/services/botlatro.service.ts index 96faa30..48a3538 100644 --- a/src/server/services/botlatro.service.ts +++ b/src/server/services/botlatro.service.ts @@ -87,7 +87,11 @@ export const botlatro_service = { const member = await botlatroAuthedRequest( `api/users/${encodeURIComponent(user_id)}` ) - await redis.setEx(cacheKey, GUILD_MEMBER_CACHE_TTL_SECONDS, JSON.stringify(member)) + await redis.setEx( + cacheKey, + GUILD_MEMBER_CACHE_TTL_SECONDS, + JSON.stringify(member) + ) return member }, @@ -439,7 +443,9 @@ export const botlatro_service = { return result.bounties }, - get_bounty_completions: async (bounty_name: string): Promise => { + get_bounty_completions: async ( + bounty_name: string + ): Promise => { return botlatroAuthedRequest( `api/bounties/${encodeURIComponent(bounty_name)}/completions` ) From 0ad2dcfa8670495cdcd4387db5a538dd31618327 Mon Sep 17 00:00:00 2001 From: Jeffdev Date: Tue, 31 Mar 2026 03:56:38 -0600 Subject: [PATCH 6/6] Biome fix --- src/app/(home)/admin/permissions/permissions-client.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(home)/admin/permissions/permissions-client.tsx b/src/app/(home)/admin/permissions/permissions-client.tsx index 3c36096..6858afe 100644 --- a/src/app/(home)/admin/permissions/permissions-client.tsx +++ b/src/app/(home)/admin/permissions/permissions-client.tsx @@ -334,7 +334,7 @@ export function PermissionsClient() {
    -
    +
    {PERMISSION_GROUPS.map((group) => { const groupKeys = group.permissions.map((p) => p.key) const checkedCount = groupKeys.filter((k) => @@ -421,7 +421,7 @@ export function PermissionsClient() { ) })} -
    +