From 3da36de9f61f5c7bddc5b70be65af6895e9830be Mon Sep 17 00:00:00 2001 From: "Jill \"oatmealine\" Monoids" Date: Sat, 18 Nov 2023 02:55:39 +0300 Subject: [PATCH] web interface holy FUCK --- src/commands/recipe.ts | 2 +- src/web.ts | 18 ++++ static/assets/jillo_small.png | Bin 0 -> 16458 bytes static/create-recipe/index.html | 59 ++++++++++- static/create-recipe/script.js | 145 ++++++++++++++++++++++++++ static/favicon.ico | Bin 0 -> 36534 bytes static/style.css | 174 +++++++++++++++++++++++++++++++- 7 files changed, 394 insertions(+), 4 deletions(-) create mode 100644 static/assets/jillo_small.png create mode 100644 static/create-recipe/script.js create mode 100644 static/favicon.ico diff --git a/src/commands/recipe.ts b/src/commands/recipe.ts index 2f325fc..1527fc1 100644 --- a/src/commands/recipe.ts +++ b/src/commands/recipe.ts @@ -23,7 +23,7 @@ export default { if (sub === 'create') { interaction.reply({ ephemeral: true, - content: `To create a recipe, go here: ${interaction.client.config.siteURL}/create-recipe/\nOnce done, click the button below and paste the resulting string in.` + content: `To create a recipe, go here: ${interaction.client.config.siteURL}/create-recipe/?guild=${interaction.guildId}\nOnce done, click the button below and paste the resulting string in.` }); } } diff --git a/src/web.ts b/src/web.ts index bccaebd..b2c625a 100644 --- a/src/web.ts +++ b/src/web.ts @@ -1,10 +1,28 @@ import express from 'express'; import * as log from './lib/log'; +import { CustomItem, db } from './lib/db'; +import { defaultItems } from './lib/rpg/items'; export async function startServer(port: number) { const app = express(); app.use(express.static('static/')); + app.get('/api/items', async (req, res) => { + const guildID = req.query.guild; + + let customItems : Partial[]; + if (guildID) { + customItems = await db('customItems') + .select('emoji', 'name', 'id', 'description') + .where('guild', guildID) + .limit(25); + } else { + customItems = []; + } + + res.json([...defaultItems, ...customItems]); + }); + app.listen(port, () => log.info(`web interface listening on ${port}`)); } \ No newline at end of file diff --git a/static/assets/jillo_small.png b/static/assets/jillo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..5d89a8dc9b5a7340a17788d7ea2b70df5f7809cd GIT binary patch literal 16458 zcmV-QK()V#P)PyA07*naRCr#sT?L$7#nu1Mz0YmkU6YM(+zBDXlO|ZuV5Px=7AP%RN}&*Fi?z77 zxW<9F8*$&wTGsu!+&kaz%-gqF-wpJec1bqx-MKUWd*=8#m!Zv=V=zqO68;MyQm50( zcRq5XcIssd8CdX3j4^;KC_b_jvpDz$D0~!Tr;J|Wl_R>n1YfoSA_rLt!6hLD( z>TlzW-KRI`Vuy{)H7@<*)l8$+K$ay)k|h45@%&@&?cBP4|0vob2cBBx@;n||OADmI zUuT*0vl!Uh46sH-hq341f65%6mD_3E_VN>W=E2wap?#;^s;auUghi_yo^^fM;2g8z zdIt8K1jN$!H9FZHpA_zoOR$=(Ha(0+E!Svdi7~K1KxJ;1pV!wp?I({{H@NKHblOq? z{E(`$r&qb%pZ4XR|I6=8w^(8|s`7>;vk75gmdHgn&X6vcJ`yXw+yq;=1p|g;A}%os zTCE0u|I0^5Hm=!201|z@v(n|crAy%F8ja&r#yvj2jVED}C^4!`R)z7gQuLNhWYrt&^fQ;;Do;N5SQPE~5N$qH$ zBUZe*$>ZC*tK?Y8nffd}V^%Lmv%=Mv6-o2bT8E?he+h0+bIr9Frl=}jGZ=KKi77GW z-~agrR9DpFwdX!XAfO;KHyL+4xCr49Rsz0c(+_*2h`t!un=4%IrQHFaq)Plh;K)i$ zjnh2!*3)tEsmZ7=ug1}RM^JF&G;{_XE?qneCwA|`3r~KaG}JYF02Fgcy?m9!ceJ}j z&ovrHbB2$#4B4v0Flbm3h7M0cFMzk3PE~o}#L=qq{rk$om{$o4aE<_1zYa+J(KQa= zk^gV-M*!M5li^8;v760SW8{RX`I_I}bqPLvV>y2Ke!IB+m`Q_i+XGjKzb||AefzF$ zhy4J29C&P%%kyTJz&`;IajZYONg;7{qvo^C_%b=xzl-|*NcC}7v>rasj7s}Wm)bY9%-@O zv~(fM%}d2|kG+S|GnLRAb-3o1Iha0g92)AIvF!2pJx31|)^Uzn&T;E1w|hsIz|%j@ zHk*fW9(c@bF~!fiY}(jGw=HIe_8i8Ge^>^W(*?a=kJ}%+1Cu9bV9O7?@%lf$Y_vBz z+yL7rt9J!^e~zPRRts49oc;fKB1 z2UY3$2{bo(uw%;^rTT0W@lW`{)~brSWVOdr^eeFK@zU95qJ&Nh+8Lr3i&)lT<=d+9m+kH_VJ(P=ci#UwV%Y%$s{nmt-xbmI)X z_WWnqyZxxp_(n|_h$Z)3hCo2YN3So(uC0fg8|#}37}%F4m*>UL0e82+(+9ImrUkNu zJF@$yjF~iZf_2ulm*XFQd=XpMZV{}&7GcBl?>>ewlcK!)>bHTPR_t{8{Q)N!b||v$ z)-}z|^`RTgHtT0fkp81(h=@)O=aZ&nvDi2>!lMnHKyQncy~&5V>eh933uAqq6I<37 zsP=l7YMyRz+l zx}>N%216#7@z<#6uptA7_shHSp*vAlSc+%vc^Yn)8(OUvH~;>6K7GbOzU8NV%6qSU zXRoViB=%j(8UN!dr*|#ggf?q3>Yvt0(u1nR`0&xGjQD$8qFJz+wv^s+^QsDz6*c$D za_G9!;s$KnT&Q|oeo0~YMpAI+a<}_z%Ni_Zll}q@HUYpe0Lct6f{9a6!hwxSfPcQm z>pk7w10dPA+hll31(xXbT1(#G4E=qNFUGzd$MDe`%i(r;g*J2l}H0^l%Qqm+gh+$#&9E_bYT{Yjkh8p z*&_IQPlH%aRk;%$SKsWi6UVBsdq)Wm_!Wh7{`5+h=gHZ6eGZp!3u9~!V>|(nSf;)~_^mtTMbdrsh!ch|t@ z^bo*ygOk%EF!91{==B;TrdpxV_Q<})8f&ZEa5Ve+!U>=#Dt_Kmiem>VpfXmXs_Ii< zJWpcMm0GPFq0?)0wlD*?h8cVYy+#fARb5q8v)oYUk`#q29DJQDsds;G_Z_Dj5|xK! z)ohdg4uCx-Yh-g$YOLwur*CEn$u`sh-GMTViNzDcN+F^Mr??i#3`CLBL} z1}{GOp}VHCo^%m67`w;ibbn8DCyuQJBc1`kVQBSxnR_L7idg-+iy#na|%DqV2e z`z|Lv9zQm%JB^C6Ca9e6F&Z=)gGo0qF5arm?iY*j2qUywp#+IxZ}#BO{&KbObS)V_ zKB)Xvr`!9;2EapXk_^JxW^+7Km5(^%BTQzaWx-WbHJ2~GIOslUH7vPs6DR=%|9N{A zHmu$ax7%xXxqRCLOuDWs1Fu`)>4_Jn#s3WwyT@QOXl{G_ZVVeoEb`n?J&jQ8m4e#- z`Si!i<{$TYIp^e;_)OC3??u2nhXc!WS~+UOm^4lQ0deBus8}PcVY*&fO+~3gXgKFH z8XMgBVdXJ6ojz|uf=$iIi#4QYL^7$xf6{R-dRTjQlmyNc)cOL7x?5H7$ZC&g8(K88 z*+%14VEj2*mLp;lBF)eK>u!XFTSC*2&fAJ%b!9!CdH8KqSJrc%*KZF5)X$wx*PZkr zJKnd)^FG&VTxd2M-_`1LVKWxZ#y(NbFIAK^rkznBVA2Qy+mmn&_&Lf;>_WHiVub#&%k>{STuBBNl2XGl z_2OJ~2YP7Us)}ZH>!w0ybCc&3IDg&b^1Mxk;7q-~pCq$a0E{x4^yZ7_j@8_>bYa`& z5Z~5^{$cZv`|!r!zkt{4R|9^F~FMv1kBy8%^5iaT7B%sp*m8ex$p{CtJE@ zHzZg|mF$JTx1+YUn^OWRR(yMyXXV7OfkP5{Jusw_Zr^goQ&;Oe76>SBu5x+*eK{aG zO@>tfCNajeI=xnY_O-i_k(1QAdw`V!JdOT=d|59)^B-*8aDdpBqAF?w6h3B!$5VLT zz|#fu!%VkWtd?gjVYbNmix*(dRdd_S!x3mK1^2tezir#FpTF?L2Xs^Vbu9<~jxqKZ ztyT^nH7;Gw=@%Pfje_c9;!Tj{_RpR`Z*KIVq0ZeW_W|v>?Qst+>NXwvn`7gT(v z9)}N>yXtFPd;NaptyLb+hciv4krLD&0hpP@q?EKc_Rseo0z2o-3#nTgpU;oxMkgM* z>lM^hH*!T$eVnW7S2#VhTh`YJ`(9NG(&>#h!+$L{>&T?^6zSoA{t0HQxpgANQ4Q4{ zw3k#>#eFv~<0S=^oO2#f!JlQojf}CR{sZFJ$gycmqd6y3b$S^Vo32HtX9)OJ-qh$} zZfDjcyQo;8#uz4{t7EHM~S7WiZvcz6l zzk5=O3v1-zAT!DaE1r?90vU)&LrQdUgi_B(2#Kfuj#@l{>MO$ib zT^gyBXG^MuTe!HOTv0hEZNRQN-I=R^=3fjvT}b-4-lYA=Y%%wnws1PT{CA6BG#ka7 zT=5~$P$UE_4UgN08-DXByq=)`t#ZDGfsc_jvS!eb1k>#Z>)5=@91gmy;3|~JOwbAO~&Vq7Q^DytW@jmkKe_z24n^2<*ERl9zbaP?U8q} zW7EOVue6$#8iqLri>`LU zrPq7%R|8KI%rfhzYh?K~i`ATV^_|ygre8V(Izy0cD9zjFt{6De+x8dc96cyxryW zk#Og-R%))Uu$Lb>SYBLL?KDLv#14%~jIs6`(oeedhPg1w4xzzy98QN@xCgeb`Mh-%tu^42tbR12M4&1f)Ss`2j zM)#%pZe8i}yw%&i`?9#!Ic6CQ7swjv18bNi>4y7nlBfRWB9N9MG#gJ-yL-8u9z3%2 zWfY&O1Xoo^GK1A(;40@T#j?{fqmY#oEuD|BB|mp%MKj7u8lcx{kenKhs2EFEDq~Lu zR_L=%noxbM6IFE@FpU9u`2#R((QKG3rcNh1w9$k6PT{HFzYh2V@DZN@_Kk6SN41Sd zboT(x3wRM4G#OS)k~B4EV5ao=YmYIjRR`5sD~za)gO1?8mVGXqNkk0kSy4z$jX-#$ z5f-aKJhbx}WEho~H=*EUjj(7_(jt(W9w{7eU5uWB4N-!VKqwcRN;7TjRi~i2%X!Yj+0d3BXta=UzpjU%U>1}?XZu((u=o-zibr;dRv2StT&jWm@3ZHTMz z)LH!X4{xEdzL^Xraz!5qsJMJ>7opFtHhW$aADUpU(YTOH_&g>qf?aj`?D|;YH3kJRWwiJrB62(_n*@a-v&5J`qQdmzGD)HWS zN6YQXwtszw*4bxvrPJ1O(w(dBuN^Qo|z!sxO5@1`=@kC#dS4}c;m${ zaq?I(ylxL{;YLiHk_D?(4+62d*#n!+0ISW=qth%jIRRC2rXFVs>PQVlW_C0(bE3Or zH-cbWt|hN2{60lU-NJ%eUQ|%WNS&lP$qb2#jl_~i?!>4mqdV;-=nyO>T^+{`7UH=_ z--Er`DKsolkc0C|mEo~fPS1zkxe0z1tC?-qU(7jsPXfZVT8$wgIa=x}d`>!PXnqwoXeMEiY@riKA5@ErcRkloS;m z)AhYuE^MWGGMq>b(g~|L+k~@ajUb^)M4&h5aq*=yaPxz|>ujZ}3jFm2@VML}z`b+x zAq4z^p!bw0K6qqnctBme((C=9H(q*P6hF&oOlII8Fop{`5YQWR&Y0M6tJ!Lj=3PD+ z<1ZX0atAvOaw2V7yB9yL+=<4zdKe5Eq2(wFhsmr1`RT*LgO+eNyt;Lr1bkUZBaR)Z zL_@6;29s9s`K+86kt))|Ab~2AHAk$5?n|I~+l{z>EywHurZ z;CF96fR~^7uSn-00n1hHPYGqgVANpX-~|7!?ZsrQ&{HRF=HjaQ=t{TurJh($pMe+g zQ>OlxbL8mt8lIXF$w!P%R*oO7(KsAnTAdaXrVPWy^TtAN&;9P=(_-r76#N;px8j^^p7_+!{ zH**rz(~<17ZeuIv;*+4AkTcYo5(_i8kfoSYiLCQZ#kW=^CKa=W&a zLE#!iM1|qfYo;MSDGK{`9>ccvKf`Hv!yixum3!Q7C`y1bf(2_xN(t|?E>A*{_;Jyh z1_S~O(eW{mWErIeC1|L#i#c=iVuhANEQEgVW`w|}kK66PqTCLrQ^ClIBQbi$EO@*D zm@OulZ5A}vHRAO@{~d?+90fVX;^VF4Z56j@sCQxQierAa$4?FtI$2Ge^GABJVEY98 zT(fql3i+Slm`tFL8k>fk0Z}lSwL(kSyQ35*j@3d{7-AD5pphBMN^0Tr_{7;G>Z2d> zzmpJ5NU|Y3!qlfA1#OHBr?aJvIDM)XPG{avWHjE+B-~}O>Jx_KC+R4h zM!7Mhq0p$Wb7S4AQ>dwO!0q-!tC53A`Z5!deFB1nr@^Qdx_4h$ivV3wQBu?(_&No$ z^+qFd24vxq8|EV^H5O~XScUID+lc1cCP;b>GP9yEaA;yHDBaiyJ;rQ_XEfA#(B#m< z?Ir)10%vnG>Z+=ROv%WO!hk{TLy9Fu4Segy0_OKCs;Y7lKGlpV^Sesz=ycS&dNLtu zXJEOBNnx@1qf+GDylB`W^uZ)wPP(y*-P=mBcV~&v7&KZ5VPQsO<;EZ((Ix=@CBx?p z;7nniU}sGYlou-@CLszJFSroX7fgl0sKcrK2k^xQYp`?EA;C8+;YJJ`9FOdr7*J)& zFC9evWu=WMDyWCU?xCy&==CxZlfp1;WJ+7Fs&KTC1-x$UNz~W5NbpiliWiJMxx(pQ zcHR^({P1Suot*PqC5Z)wjY!VSADN;}NU;cTL%`QmI&olc1x_BT5)@DTb=ZjHKI`UP zEzI8R1?9UGlh3@_D=0rK!iF(ZhGX8~WiFa;@@NkUszeU8@b1_G8sjTH6z?z4@cKn$^k^o&UK z8xSYl5j_mS@2Tc0NV%QAN$Wa(qzZmtK)9iag?1&l=~QgrR7h@X@_eccs581e>21@q zL$h}ayeP6#0?Qa<*)!@NAaZc%RJpjnT2ztP!J94WtrA#=_p{sRzoyavGHf8{ZPaJ`){+ZC~TUZ={hDTQv+4||1$?68v-BtzC}#oT@mty2{gn?EucVpdcitt+u`%szORo5#dWgle4?GjFq|q$@ato>}8{l$!5l|&CiEIg30Pk@);PZG| zLXa}1&CW$m{}^=i>Crv{eigMR=s^h4wwzp&*@HS~?Bi%35@TO2Zn4M$>D7UI&<5SNyYnB-*08V&ZY{vNB}{}2sT zm9UW4a$qK|z5Q}T#zX|Q7{Ov3T|Z+c!5Kah)%B`)P`0ROLG4iq?XAmWJGSGMyOyH( z=uu(R^&b?A_yj8wlPMlxYZbh76UtU5`{aD7o(OXN+7l=*YYYLubA`(@t|M>k#2iBI zUyUr?7#nX*8#^IGB8{LUf3L4`g9^lms_AAF4kLqu{M&ZB7nK!FN@aPoOurNNHd!pV z>tC;<->6aWxjjN27_C-VBO(Ml@VVXC_WgHQ^VYwim%K>JPQilfW(%Rp{cfQ?cE@y? z-iBJ^D7^KjKf!HxpuVC4^_3M^vg`#+z3S?A59_tN@5IWt-w|pmC*G*4$Qc-mi)Q8^ zF5z6N2~oYv=|^3a`@E>0PT$5KPocCps9po8R9&9*UQ2OAxuwthv{ox!l9Cn?H-`AT zQH!`Fvrx~1#~!FW>kw2-!i1>0xzPic%NP7{1plN5LW7R_kcs1wF?2Y7`shOuvP&N{ z0JCno850&PB=cB&k9ctLp7p3ZwhhS{iHJ{*1yci1y-nSME~rx%jk~XT66FQ$>&GG! z6Y=JOL&Cok8f*UjBHn-MSrN7)(24T6#01-!FeRhiL!tsW;`Ma8yBZ|#^ag4k!Ngv@ z?jZ4P-B5tS(={RBy`0JEE1k~DwsUl%_?ZSnx+LST2EBHAPH7U#zyJUr_(?=TRR7q> z{1M4aXV3_zSV(^-;d8dcE&wLoyYN&^&_@xBKZ+ZMtX8sQle4lgXwn5(`S#mF(1k`^ zdO99>=RNcveJ;kSHWfoD-z_5iL19Xux0cOz3BaEH)p+`@XF7dGCu!MF>ybNhWb0?u z`&QzUWiMd+`u(umU1F`Im1hiy#k|V~v@^Cu&8x1MTA5~WLSh=2y6PE z(471#>Z)DX_`@ljIzbLKaa&bkYW`}cuQjKU{;?DA6!73s|6(@l#tqI-vh~Z0V^kU` zDmYql!zqors=_HOxytfpp&B+cxP?oVo;>BbP==S?PAo;n>|2&##oO<~+0;JiNoz3T z{x{yl#7iz|1%}&8!OM3;^}E4+&c4KrvFtCOW9wR~o@qabo!$J`XEE=#+k_mUp_FXF ziOs9<&dXm@Wu7>F^hs=z4HwVrhs^9?)kjOb{>Q@jGYeqzjvCHCUauR;` z`4OBvTGz(PT!#(DV}m9CC(nVg&779ADwDR&x~SJflaQ0kh<7Z?-jakQ1w!T zMMuE^3d>PuSahrzhYwVUj4uuiCSA4&Yu|KWp=FmB$wa~o|gg;Kb-%LJ*e z$emJ19=Z2T9R2xNm%vZG`dTbm_B>41paB*r*^JZM*5c#WSK#EaBBAdS1GPmMaN*2c z3>}f!3Has)uW%EK>jMf>GQxx)?n-?o!u$U7BRKSPdFXWee2_AJXj4w#HN_i^S8@pt zM?@I2M~_Q4Qf99$TrW!C>3ondtuF5@?I|EapHZ;G;|XB*_F`0)Hvy6sDR~2NV)yP& zz-aY)JpRR(7**3Z_NxheuH=ie9MIA>czcjK~(| zz}oLmVCR;iVA3|w=yZ7!I~JgIVl}f(`X!7>_eDmTQpZiqFvP@J5fN>GEle+fCrh)s zoOomR`a6}u?A}p~>M94Aq(OXU4hjx*ZmeN2Tkyw^KgRHB7yn}5>B4Wm*oF6BqQ+9~ z2MO(dqekPtH{L{4Vvv%Rvh66__Y>aw$5%LYyd(%b=a6->0DbDroKEv70gki9cEQhM z6U@Sh?9Nyu;#>aZQT)97tU~S$aGYA<_6+D%ot$Gd-XqCa8X03r96u?;5E*3_<&mVv z)1V{Q+}PQOX}ekie&6m=RFpS^LqhtXp*X&4SEq+Xz~A-itC)P*<>!EJEQC_nJ}o8m zkh^k8P>RLs@Au;USHBWkQE1S2ZPC%l$sdk;-*{6PQbFLiq4ww&>a2l-`%a?1wpjpA z4!IFyQZRerfKGK;gdh2&C?8g+m7Nx z{c2?3w&*xZ;`qs#dh%xz@RSum=cu~EC8)lqLA-v?j$%|++J$h<${&uxgNNa=x35ew z*=)GwZ_nZ4>&}&Ns&&Vq6t{P6P&`#pRp@ovPLY2Ce$96~@$p-$;j)vN&V})$(P|ME z9fOfGX5hEaJlm?WDkYoXDB6dwKK==t*ZqvD@;U)Lp)_D{Jmy|Hu$9O{dnBc*q22?n zMuH_w*Q0C1;qc+@mv=ZC>fJ=C3b^|F6)x{NmQ4Vw7V=kHV)T6`6Q-YdtIx8O|94q zr6SnpjRa?HO(V{nIxB=)a(Wz6QsX*hc~J!FpU->_M{^K(;_U{L2@$bzSa{c6n7;UW z@h}9%pZN*i>f^$Fy!?xeC^=IlJf1WtFK5mr0}+?dJ}Zs(6wL7?RkBB#Lq%CL-uw5i zdaoxyIf)+G=}!L+palAMqaDQ)@Gi6Q_Y$xqCeD&DZgQ4BJi^F`$5VA4@j4PRT^0Qb zN@Gkoy(mt4U~j3&eTj$;$DGBBux;HQoZPd!b&~{6VpcY;f8t4un?JvGQA+U!sC6gA z@00{ZsdC2;7l~Bw{)5sndHM*%#znRRzpA1RfBn;ksII6*z~_TTr-vmX9C4{>xZ|al zklH`*-28=W;jb$YJqSL2Yb8z{D}fpaI>X3vojE@bnYry%Ngn?Jey-S-Y)^SN5+^1#YaY&85s)JaJ``Psup9S;}Z-4 zPj26RyGl@6(jdM+?xN9Hbo+JKyrmFp-v0oO#zt|eH8Ki`*;%-C*^9^=GNg67z^Ucn z_OtN&1K7Xo1it@l18S-pg>OAAGXe7#O%a{$$iNEO6_n@l=0Cr|&wC2tcDg{xRpBvl zn6u<}n0ez(!WkDF9D#z>P#Z|&s>NF`eT_qVPr>UAM!F)ROhU8CAKf8+uV*4}{gn9o zhBc?1+cp-KbLujvvL{x!`&ijM+i1L(Nx0u?)klvWpRP+ui(tgx34Br+$%O97PfhNF z?VAeF)Z`J7oa>fei8)u!#Nh%jK3et~>dGqw)rZBzVARZ+SoFYyAYLyP>quek^##}9X)dd_Q!8KKS?d*uG)EX!IkIKgp`YsPU#v|}GsRYCf|L0E9dok+~iZe4;} zxlgzYXw=m-Vb#~0v3~U)xSUk;q!H!pSKc@ic|$Tq!YG;W^zSrC02iFDL1}XsqSJGc zH+CFsQEgZTnfzs2q1FVO_0d|_e7jBLbCwiV2;ema8N)^-;i6f&!h6|Ue4#CNM2yD{ zRpY0XC(zjBb_W7#t)#L=-Sxm}2RvmJK$VtpV6;vro5xJZFl6V(FmeKgMHmEcCyTYa zK~@`i<*08AX+G9)8*aMy8cdu%R$StA1yE%-f*WHImyy+?;su!}ch@6u;#>0nirW!)JO6!-ZR)#p*(4=7Fdeba~_ zZ|yKzfu9A~B(w204n7AQ**dMP88t3FBBy_hhV)mmUJ3Z725+}L2FUMGR8WV5Kc9ui z>xV5o42y1AhzsXT6uIYuJs3>jvOd@-i6Tj&yoH0iY5-rnR4_Lo_+8*WE1z#g9xhU;z_C1S^Y0X`J5A~l=#PNhO7 zvz~lANB8VF^Q!9de$-Wk_c`E2vorPgU@R6KQL@D3yuk?(!$+pXYV|U#Hl5(@?;!)Wd@@GlctXo0gZ%|_*N`LV8h!Ibji|>Dir`6DBWu*<+x2sf?s%tbF3>iHLSKPb+xr16t z@M$A`1fJGbTh)L~Kkmbk{RM&*Wap(~!iB?xG4)H>OUDO8Li*cJHsGuO{0Mu4L*y=) zEIQnD`xr#Wc3DF!+PY8#uI&h^)1iN(7&94>m1mn;tWAC}An|KMt#}3S!QeK3oO2!~ zF>ID(^*@|zu8E8^O&>5gen?hsOrPr`$vwPldl71@DL%@Ol9h~WZ@&T~C!TAoMd=wL zl-I}6Sl^73M~a2Ojf@UMdUhfrB5hrE)9B-r?Y?$k_X)i7>NhApbyfhc(aE^%>Y*av zp5$A5fXP4a=oE`3;M)d(=o$)!?AcMQc)beY?1!qp>~wn{re0?P_&FBCg;4Q(&SB&X zA5pi|J!Zr8VUebr)6yeHX6MG}sp(E%3W9}zEvyqpl+UNaY&Bu=(kn52;e~Bjji+7j zgT8>}b^B0USdOZSdZ9{2$3+N(%3}R>xsi15%|GtN+b@5EhT34DhJgRg<%2L_NPN5I zar7BQq{>UXCYp}UJmU8h20T+(N6(YME>xIu2{peKz*8fAiL-kFu4A0Nxx(%KoVw4& z#+aTCk1$?qFllv^o*bVP)~5ymlts09Ljh`QoT81&=*h!z)sjm^=78Xt)bP$to9y1T z-1cEO>@Muuau{2F`dKtfrr-;u2@V{Vjo(~31yM2KeR+0Weuw%Hy#Lzw*sx|-Yv?j6 z#)NBsJ4#rxZ4+;aqKUVMa*6tK)6${_Y}-;8aJ&2zZ)xJdpI18Fln4yWHX6rprar{L z1jVm%dOn_IF-$e-wfC6Jx|w=|RzrqVsF_=DHzZz9=?%Mgl%TQRDRO6KT{aEZ+_0ZSI_#CqA zQBfM~bW5q&!$u}!#=QO_w=$$slA7Px2bXxq`6>9lZp{hG4J9fgr_h>8r+Z!aOwy1<%d6_vb;`Mry8vcx6=cAvrB*!pBRPvpID68_{j6c zT%5+Y|M?|;TGc}B93r{(f@!&kiM5EnX_UwnEXxd>Pb)@ItPonzo}DE)dZ;3xs$2uG zV_<X+T5=l@RZ29 zWkW&0=Tk^Otzry!3*du38skDRPX5_`3~V5iAVo%*b>k*w$P{;tjx)AOcmkX(wZ1gt zB&Qh_@0J$T2|-Kz{)T(5Mr3q&FguJo`1Rm*b2Pg|h>k{9ZnDTCCWGpQCq58a4JNYz zOYXl6`J?;yhI6~msSNb3m%b8eYG{ykOy&Mmk@!Ctt>9DD_?qQM15T%pR3txRjGE*H z2X)(1WxkYgb_ruFPG(FQGcjG8Hz-~k8Eb6qlt@5MopK@aU`|fHXWUV$c?s)JDl+hVBu_L)k2 z`u-a1*myvss1X08`H78DH6PWk{trfLGf?vCu333Zt*v&DPEYLSy;k5w^vPs+gfaF2 zox1o0oBx7oIW~$hQe?fYbninm&UWh#R_@h{Zg*56NWbR|%@MwON=%K8CWjVLe$RaAWY{o{GEYaBg>LBdR&@3a7Y4+Nid0& zjnJS;D8Z)(Hq(y3wY`oqXsPR6WjR%SI7Ke}$VvIgA3G2U3E{9>bOJ#7>1YXx4Nx(3+ z^9FX+ZtIsEfUX2A=c?$vydeZUn`6=Shbq6tB#f|F4cf_5v!#rz2oY~>(_K_Zck1ij zM-{x&g2}R_elt~-4%F8_)yS3~IU#A>2r zte7!xKqsT=m!RJ9nj;4*uy1#XP)IniO8`%7#%(rC;q>w?#uAcJ!n6}F$YQCP;h^%H zP+29RT~px}S+u`qkhVj7zp}z1szRK0j|gVdAQh2%9Z0eUVUZSO^-Doc|5Q-lN7CCx z4r73_lD#-vR3iSAwR%*P)uZ6lS=3cGiMg~|YW^dM+}}=rG>2t_rC^v0Y-JT9cN3MP*Y`x!{HIGRj#O__dy7dP{)T>bG%KvB>`lcRfO8$ zb(HzENvdc`PKgkXFN!XiOghw5+eJ}yaBc)`Odr2X~#zuE*ig)W% z?`5)%HS)wBtyY7OPt*;n-@tgp$A^h*u+Si_NHqFC+bB*zcE1>m7?bvkN=19ys{np| zL5o|W1$gnwAdBe+aQ>Xcm~Pm}WX*&r=`143*t$>x-f8!V*GK%4L7EIvG_ioLdKr+4 zO2HFSIgcN$0<{(odHgIkGr}Tm!DFhb@cV*p0|JgJxuavl5fc}IJ=>17o)n_+ISU5C zY}WS(BxN)c+auu9G9tOjtm~B4_)GTN@fxa9-@36N#N+pgn@k7HT8rs=0-k!M4Zq!seu<@r;qJMy}x;aO3MiQQQ3f%wOW#Sajpt{z1mkfr*qW^yp zmVMcG=sScR#i94_qZW!Bt$IAYen>VOF5?idWzgphj8`XLlx3!#1*Bz!w3_Y;&U#w} zm87p*d(smKDEeU|Qdm|_=dc|uj`%$_ji9_sQN|;5Y=-Os8N%SAthB)+2Ou*e0#b)p z3X*>Rhg<(4EZY$9gNG#vff*fR7Ho{{Gx9k0wV{7+`|9iGq$rR^bLwPG3-J8SP|Q_h zHkoFC@z?1ky6Ksb(u65l`s7qxpuV>;_dtQmhnUT%P9;a^&1eU zj2@q^4Ozl;8mO>=8Uc}zrT6?b)H~V*)Tx0)?!YXh<)mQLW&Z)n|pIV({ zyG^EiF#d1GFeob8qNkT-Q7&O*v>{kjOs^EC*ECkSsTix(9PVimv{7;uY};6%czp^n zW1rEet(`PAJ1#LPOeUUBh6MpmgT7ohH_Etkf}+c0frzh2**(^rtY`d(Q{Bj2{E zkP*8BP_C-{#a7^38a6*FNz#29tz^l_ijwG^t45~A{7@b7z%?)haGE=V*AP?!ZS%~ zB=y%BGa>zdlC{tgc%M&E_U|oYg{Nzo&l{lfoN~^wy`9cF*KD{5jJ?1lHbAG-Xolt| zGU{qa3n#UbqA}v-h!PV`7AU`@Ex#u!r#4oH_m_*-wZSf=a4^OhKo*0#77R9M4}n0f7JT)b!`Ox9o`>Xwd03EHgWb^&b%5&Q&UO`wo5%a`qRW zsSCbyqp>x=vYrDUa#h*Rm^2L>i@+fKw*+#yH37MqlQDkywFoF)eE9X9Xr^BDYCyaT zaQxH}xZ&=r5ER$v zTzMA2G{&H#dIO3>Qd_~uXtSVx;*~`GRO>|My}jAXE6baBRfS#gdi+{?CJg*5&ZT84 zlvD=kcE*rTz1pZ7qE=%-M#?CR7<37S=FJwsef;g+I90R-Dpy2}(Wps7amxeOBeJ^; z0s+29fKMLDWskpyGX-Y_K~NfAYHlnt2PR_t>_NyJ*!4@e=)TY0{t5Q1J0YxM0zW-7 zO0-)4wS#!d;R6-w>60~**BhW$&^c8VRANq;*LG}d`@5uA%;CP^cC!)ykR z(Wo^UO*%<$(5MadE~Tl_EmMaMC7_D;RjR-q4(WGVm+Q3OV3^MsZlY=&szsn_v>F3X zP8cFj9Ck0{~rgq!$%3t2a z*7ZLNYu0GdW9*DP%(;Fn%r+y!V=O(kTXZzJ@z5o2psunBerot8F-)13gOs%M51xmX zNDuVH(JFq7GKYNuQfVt2>Rlx4=(TACQ!t^aFJ)`tPTE)txFk~j z3=obD4mdcljRT*$U7pV z75??%6{xB^EkGw>`oObyV%V5Ly%HT!=_hY~g|9wXE>4Zfs>hIVnYilSixA%{aAca1 zjiSNNn~&qYrP^c;%C<(M#k{L$;rgYQ_nMw( zZ*t(HS3kqL<(ug=B0eP?W2Wcff`!8nm(srJerMn$NQ`>#P!^gL49$JJ4evkuCF-k! zm5KBk(vf3Qd+JNyX!uM_um=7{_y*sk=1LRyRAHb(9MjTE*pn&S}!$2(arISU(Obf< zK15kjxzK#l^O7+Cw_`APT!v5=dmfa0OQ4guY3m{m;NxXq;=6a&34agyddRw^{K?)1 ztt;eJrDk?i8miIAYJ7rqZ(OqV>W9BOBHD_~wdr$IMHx2l3MT z3*h%TsV-Hy{;n(Kc~?#ElG+JyDiZtQoAvnO-S0&lmEOMAKR*)-mrOuTeyng2_cj>Q zLShku#dI7ee=bu0eAA1Py&>2DiChb#$EAyx19UZl6*8`t#-t6@jY8K{J9i5_^(6}gd=D|kE~Q|83%en8=onPYTj}ux!~7k_Y?JOc0DD}P zb$O~1FzEFb%)96jb!`4MOe5=9>zjYUvHQSh_~iThK`(1*?9q zAFuuK9lq(ieT<4I=oH4sTh+{*Xl69(7{wB(QiS5a4Gk_)3qU<4DV8AGdjg79FQ2iP k_0PUvRMWX@Mw{jQA0b8aDC + + + + + jillo + + + + + + + + + + + + +
+
+
+
+ jillo +
+ +
+ +

Recipe Creator

+ +
+ loading available items... +
+ +

Drag items from above into the below lists:

+ +

Inputs Ingredients necessary to create the outputs

+
+
+

Requirements Unlike inputs, these are not consumed, but are necessary

+
+
+

Outputs The result of the recipe

+
+
+ +

Drag an item out of the list in order to remove it

+ +

Recipe string

+

+      Copy-paste this into Jillo to create your recipe
+    
+ + \ No newline at end of file diff --git a/static/create-recipe/script.js b/static/create-recipe/script.js new file mode 100644 index 0000000..3b498a7 --- /dev/null +++ b/static/create-recipe/script.js @@ -0,0 +1,145 @@ +let resolveLoaded; +const loaded = new Promise(resolve => resolveLoaded = resolve); + +function e(unsafeText) { + let div = document.createElement('div'); + div.innerText = unsafeText; + return div.innerHTML; +} + +/** + * @type {import('../../src/lib/rpg/items').Item | null} + */ +let draggedItem = null; +/** + * @type {Record} + */ +let itemLists = {}; + +function listToString(list) { + return list.map(stack => `${stack.item.id},${stack.quantity}`).join(';'); +} +function updateString() { + document.querySelector('#recipe-string').innerText = [ + listToString(itemLists['inputs'] || []), + listToString(itemLists['requirements'] || []), + listToString(itemLists['outputs'] || []), + ].join('|'); +} + +/** + * @param {import('../../src/lib/rpg/items').Item} item + */ +function renderItem(item) { + const i = document.createElement('div'); + i.innerHTML = ` +
+ ${e(item.emoji)} +
+
+
${e(item.name)}
+
${item.description ? e(item.description) : 'No description'}
+
+ `; + i.classList.add('item'); + i.draggable = true; + i.addEventListener('dragstart', event => { + draggedItem = item; + event.target.classList.add('dragging'); + }); + i.addEventListener('dragend', event => { + draggedItem = null; + event.target.classList.remove('dragging'); + }); + return i; +} +function renderItemStack(item, quantity, type) { + const i = document.createElement('div'); + i.innerHTML = ` +
+ ${e(item.emoji)} +
+
+ x${quantity} +
+ `; + i.classList.add('itemstack'); + i.draggable = true; + i.addEventListener('dragstart', event => { + event.target.classList.add('dragging'); + }); + i.addEventListener('dragend', event => { + event.target.classList.remove('dragging'); + itemLists[type] = itemLists[type] || []; + const items = itemLists[type]; + const stackIdx = items.findIndex(n => n.item.id === item.id); + if (stackIdx !== -1) items.splice(stackIdx, 1); + document.querySelector(`.item-list[data-type="${type}"]`).replaceWith(renderItemList(items, type)); + updateString(); + }); + return i; +} +function renderItemList(items, type) { + const i = document.createElement('div'); + i.textContent = ''; + items.forEach(itemStack => { + i.appendChild(renderItemStack(itemStack.item, itemStack.quantity, type)); + }); + i.dataset.type = type; + i.classList.add('item-list'); + + // prevent default to allow drop + i.addEventListener('dragover', (event) => event.preventDefault(), false); + + i.addEventListener('dragenter', event => draggedItem && event.target.classList.add('dropping')); + i.addEventListener('dragleave', event => draggedItem && event.target.classList.remove('dropping')); + + i.addEventListener('drop', (event) => { + event.preventDefault(); + event.target.classList.remove('dropping'); + + if (!draggedItem) return; + + itemLists[type] = itemLists[type] || []; + const items = itemLists[type]; + + const itemStack = items.find(v => v.item.id === draggedItem.id); + + if (!itemStack) { + items.push({ + item: draggedItem, + quantity: 1 + }); + } else { + itemStack.quantity = itemStack.quantity + 1; + } + + updateString(); + + draggedItem = null; + + event.target.replaceWith(renderItemList(items, type)); + }); + + return i; +} + +Promise.all([ + fetch(`/api/items${document.location.search}`) + .then(res => res.json()), + loaded +]).then(items => { + const itemsContainer = document.querySelector('.items'); + itemsContainer.textContent = ''; + items[0].forEach(item => + itemsContainer.appendChild(renderItem(item)) + ); + document.querySelectorAll('.item-list').forEach(elem => { + const type = elem.dataset.type; + elem.replaceWith(renderItemList([], type)); + }); + + updateString(); +}); + +document.addEventListener('DOMContentLoaded', () => resolveLoaded()); \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..28a815393975fdd4ba5726f1e920aadab7741783 GIT binary patch literal 36534 zcmcg#2YeLOw~l|`pCr3!v_K#bdT#-w_nPdc(R=T`7pb92uTm^@q$vu5ARr<|5ET&% zs3?L`L{I@Cr0ni_-* z3H9;uDTjeWJ|AH4IRAw#QX8-S7Z@0u&(}YCv7fQTTyehAE-66q&apG?@+j8e?m$qQ{ zH}dxP){NsjtGxMbiY(v%gVb$3Ljpq*Brtb^gca{038P+@+2?HgM=runwWcFUzk=a;2!zm3vh z&{nD5aitV{VXOof=x8$r$J>lSaaN4fp#1H=&tI%pA5ZvXcih)#ZVimjU_8Mf=7M3x zxc*3_8*Tvfq7{o24jo_ha^}A z&3H%lUa@4v-7yb5zVpi`GB9zUghg~0Vw1mcXQ>^NC}R&?k_9)D+~Vwt{R-f|<#+eE z&pUeAnm4>N=|GKq#d=B2E^DOem^a;yCZl#stsbvPiMo>{cUWf$%+uBun76GhPk6T{ z5!FX+tQ0q|fE%2ib92mbsFl&r5IxJ!VEzWUk=BVhhsDom`X0yoO8a}>3F{S;D zrY`=0(e<@s`fWf!bbjEq-p}9kox<9V9q~)Sc#Lt|-(dQZbnWkN8jDdoIM|#U*Z2>w z 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 K8!YV#i8p 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 literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css index 399f018..db33617 100644 --- a/static/style.css +++ b/static/style.css @@ -11,10 +11,9 @@ body { font-family: 'Balsamiq Sans', sans-serif; font-weight: 300; width: 100%; - min-height: 100vh; text-underline-offset: 3px; font-size: 16px; - color-scheme: dark; + color-scheme: light dark; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -23,13 +22,19 @@ body { :root { --text-color: #111; + --text-color-light: #444; --background-color: #fefefd; + --background-color-dark: #fafafb; + --background-color-dark-2: #f8f8f9; } @media (prefers-color-scheme: dark) { :root { --text-color: #eee; + --text-color-light: #aaa; --background-color: #111110; + --background-color-dark: #151514; + --background-color-dark-2: #171718; } } @@ -77,4 +82,169 @@ a:hover { @keyframes popup { 0% { transform: scale(0) rotate(40deg) } 100% { transform: scale(1) rotate(0deg) } +} + +#content { + max-width: 1000px; + width: 100%; + margin: auto; + margin-bottom: 6rem; +} + +.header { + height: 3rem; + display: flex; + align-items: stretch; + padding: 0rem 1rem; + flex-direction: row; + text-shadow: 2px 2px 2px #000000; + margin-bottom: 2rem; +} +.header .bg { + position: absolute; + left: 0%; + right: 0%; + height: 3rem; + background: linear-gradient(#444, #222); + z-index: -1; + border-bottom: 2px ridge #aaa; +} +.header .left { + font-size: 1.5rem; + flex: 1 1 0px; + display: flex; + align-items: center; +} +.header .left a { + text-decoration: none !important; + color: #fff; +} + +.header .links { + flex: 0 0 auto; + text-align: right; + display: flex; + flex-direction: row; + align-items: center; + gap: 0.25rem; +} +.header .links img { + display: block; + width: auto; + height: 100%; +} + +.items { + max-width: 500px; + padding: 1em; + height: 200px; + overflow: auto; + background: linear-gradient(var(--background-color-dark), var(--background-color-dark-2)); + border-radius: 1em; + display: flex; + flex-direction: column; +} +.item { + display: flex; + flex-direction: row; + height: 3rem; + gap: 0.5rem; + outline: 0px solid rgba(255, 255, 255, 0.0); + transition: outline 0.1s; + padding: 0.5rem; + border-radius: 2rem; + cursor: grab; +} +.item:hover { + outline: 1px solid var(--text-color-light); +} +.item.dragging { + outline: 2px dashed var(--text-color-light); + transition: none; + background-color: var(--background-color); +} +.item .icon { + flex: 0 0 auto; + font-size: 1rem; + line-height: 1; + background-color: rgba(199, 199, 199, 0.25); + border-radius: 4rem; + display: flex; + align-items: center; + justify-content: center; + aspect-ratio: 1 / 1; + user-select: none; +} +.item .right { + flex: 1 1 0px; + display: flex; + flex-direction: column; + line-height: 1; +} +.item .right, .item .right > * { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.item .right .description { + font-size: 75%; + color: var(--text-color-light); +} +.item-list { + min-height: 2rem; + display: flex; + flex-direction: row; + flex-wrap: wrap; +} +.item-list.dropping::after { + display: flex; + align-items: center; + justify-content: center; + content: '+'; + height: 1.5rem; + width: 1.5rem; + outline: 2px dashed var(--text-color-light); + border-radius: 2rem; + padding: 0.5rem; + margin: 0.25rem; +} +.itemstack { + display: flex; + align-items: center; + height: 1.5rem; + line-height: 1; + padding: 0.5rem; + margin: 0.25rem; + outline: 1px solid var(--text-color-light); + background-color: var(--background-color-dark); + border-radius: 2rem; + gap: 0.5rem; +} +.itemstack.dragging { + outline: 2px dashed var(--text-color-light); + transition: none; + background-color: var(--background-color); +} + +.subtitle { + color: var(--text-color-light); + font-size: 1rem; + font-weight: normal; + margin-left: 0.5rem; +} +.subtitle::before { + content: 'ยท'; + margin-right: 0.5rem; +} + +pre { + background: linear-gradient(var(--background-color-dark), var(--background-color-dark-2)); + overflow: auto; + word-break: normal; + padding: 0.5rem; +} + +.note { + font-style: italic; + color: var(--text-color-light); } \ No newline at end of file