From 5f69d77bbe9c453612f4eb4a496e7d3c8714766e Mon Sep 17 00:00:00 2001 From: ZKWolf Date: Thu, 28 Mar 2024 19:23:19 +0100 Subject: [PATCH] Added more favicons for Apple, android etc --- src/endpoints/web.py | 216 +++++++++++++++++++++- src/image/android-chrome-192x192.png | Bin 0 -> 2816 bytes src/image/android-chrome-256x256.png | Bin 0 -> 4007 bytes src/image/apple-touch-icon.png | Bin 0 -> 2597 bytes src/image/browserconfig.xml | 9 + src/image/favicon-16x16.png | Bin 0 -> 482 bytes src/image/favicon-32x32.png | Bin 0 -> 606 bytes src/image/mstile-150x150.png | Bin 0 -> 2468 bytes src/image/safari-pinned-tab.svg | 27 +++ src/image/site.webmanifest | 19 ++ src/templates/debug/anon_matchmaking.html | 51 +++++ 11 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 src/image/android-chrome-192x192.png create mode 100644 src/image/android-chrome-256x256.png create mode 100644 src/image/apple-touch-icon.png create mode 100644 src/image/browserconfig.xml create mode 100644 src/image/favicon-16x16.png create mode 100644 src/image/favicon-32x32.png create mode 100644 src/image/mstile-150x150.png create mode 100644 src/image/safari-pinned-tab.svg create mode 100644 src/image/site.webmanifest create mode 100644 src/templates/debug/anon_matchmaking.html diff --git a/src/endpoints/web.py b/src/endpoints/web.py index c677055..9b661c9 100644 --- a/src/endpoints/web.py +++ b/src/endpoints/web.py @@ -40,6 +40,148 @@ def favicon(): logger.graylog_logger(level="error", handler="general-favicon", message=e) +@app.route('/apple-touch-icon.png') +def apple_touch_icon(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'apple-touch-icon.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-apple_touch_icon", message=e) + + +@app.route('/android-chrome-192x192.png') +def android_chrome_192x192(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'android-chrome-192x192.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-android-chrome-192x192", message=e) + + +@app.route('/android-chrome-256x256.png') +def android_chrome_256x256(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'android-chrome-256x256.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-android-chrome-256x256", message=e) + + +@app.route('/browserconfig.xml') +def browserconfig(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'browserconfig.xml') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-browserconfig", message=e) + + +@app.route('/favicon-16x16.png') +def favicon_16x16(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon-16x16.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-favicon-16x16", message=e) + + +@app.route('/favicon-32x32.png') +def favicon_32x32(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon-32x32.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-favicon-32x32", message=e) + + +@app.route('/favicon.png') +def favicon_png(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-favicon", message=e) + + +@app.route('/mstile-150x150.png') +def mstile_150x150(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'mstile-150x150.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-mstile-150x150", message=e) + + +@app.route('/safari-pinned-tab.svg') +def safari_pinned_tab(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'safari-pinned-tab.svg', + mimetype='image/svg+xml') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-safari-pinned-tab", message=e) + + +@app.route('/site.webmanifest') +def site_webmanifest(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'site.webmanifest') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-site.webmanifest", message=e) + + +@app.route('/apple-touch-icon-precomposed.png') +def apple_touch_icon_precomposed(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-apple-touch-icon-precomposed", message=e) + + +@app.route('/apple-touch-icon-120x120.png') +def apple_touch_icon_120x120(): + check_for_game_client("soft") + try: + return send_from_directory(os.path.join(app.root_path, 'image'), 'favicon.png', + mimetype='image/vnd.microsoft.icon') + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="general-apple-touch-icon-120x120", message=e) + + @app.route('/images/icons/fugue/tick-circle.png') def tick_circle(): try: @@ -311,10 +453,80 @@ def api_debug_matchmaking(): @app.route("/api/sha", methods=["GET"]) def api_sha(): try: - # todo generate this on BOOT - # generate SHA256 of PAK and SIG on boot then save it to a file and return here hashes = hash_handler.get_hash() return jsonify({"pak": hashes[0], "sig": hashes[1]}) except Exception as e: logger.graylog_logger(level="error", handler="web-api-sha", message=e) return jsonify({"status": "error"}), 500 + + +@app.route("/api/v1/upload", methods=["POST", "GET"]) +def upload(): + check_for_game_client("soft") + try: + return jsonify({"status": "error", "message": "ENDPOINT WIP"}), 404 + if request.method == "POST": + try: + api_token = sanitize_input(request.headers.get("api_token")) + if api_token is None: + return jsonify({"status": "error", "message": "No api token found"}), 401 + if api_token not in allowed_tokens: + return jsonify({"status": "error", "message": "Invalid api token"}), 401 + file = request.files['file'] + user_id = sanitize_input("test") + if not user_id: + return jsonify({"status": "error", "message": "No User ID found."}), 400 + if not file: + return jsonify({"status": "error", "message": "No file found."}), 400 + file_id = file_handler.create_file(file, user_id) + return jsonify({"status": "success", "file_id": file_id}), 200 + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="web-upload", message=e) + if request.method == "GET": + return render_template("debug/upload.html") + except Exception as e: + logger.graylog_logger(level="error", handler="web-upload", message=e) + + +@app.route("/api/v1/download/", methods=["GET"]) +def download(file_id): + check_for_game_client("soft") + try: + file = file_handler.get_file(file_id) + if file is None: + return jsonify({"status": "error", "message": "File not found."}), 404 + return file + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="web-download", message=e) + + +@app.route("/api/v1/metadata/", methods=["GET"]) +def metadata(file_id): + check_for_game_client("soft") + try: + metadata = file_handler.get_metadata(file_id) + if metadata is None: + return jsonify({"status": "error", "message": "File not found."}), 404 + return jsonify(metadata) + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="web-metadata", message=e) + + +@app.route("/api/v1/sha256/", methods=["GET"]) +def sha256(file_id): + check_for_game_client("soft") + try: + sha256 = file_handler.get_file_sha256(file_id) + if sha256 is None: + return jsonify({"status": "error", "message": "File not found."}), 404 + return jsonify({"sha256": sha256}) + except TimeoutError: + return jsonify({"status": "error"}) + except Exception as e: + logger.graylog_logger(level="error", handler="web-sha256", message=e) \ No newline at end of file diff --git a/src/image/android-chrome-192x192.png b/src/image/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..88e1bf99fd9f4335344ca6455d3a612c38481cfc GIT binary patch literal 2816 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 literal 0 HcmV?d00001 diff --git a/src/image/android-chrome-256x256.png b/src/image/android-chrome-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..e841ae54d0d6c304541b1499a404e6f4b0af57b9 GIT binary patch literal 4007 zcmZ{nc{J3I-^D+lnZb;$VMZa#*vU3_k<2i%WeH#V9!jz#A)!Im$WF3HWXT#5F}5OW zMY6=$DcP6C`uLvnJJ0gR^UuBSd(QiH?%y}sP+yaQmYo&=00wO>f)N0KXD0~2&lGsb zw*UUjV7KskcmSx5r#o_>I?E78T}=XT8X4c$dX{K>wDmM-mZ2O>@)CTZI~oAMNYEzW zP5j6I*to}9n>`H9k@0i!y>-j)LzC^J(Xl$tiD=bO_1VthsE>^DPtNhRK%)|pUc2j9 z>9iWL#M~|u7I$BX*LiDXR6@n`1YkM=d3h1Cg=Bk(+E4^cKqu>(oAN+p>-VXjmkl0I zD%Wn`6H-Rq8_f7{pSx#jH@orbQqbCA%aY1c&UOnff}Ty@@I@0C;{et7A+{_x{& zp52#NuE_ed7vzT9{LE`BH&hHmI$;^<8TLfLmkHc7Tj5s)h=qH0;;q>mzo3OB@%jg` zVL>Rs`VlAmTLU|BatdTB@{GhMPcuSn%?Qm(_-gtcDbRFub!Q4u`QxvR_SZS(D|>CC zl;kE%R~P6rDp?8pApqRn1!08uE9&HA01vaA0~}Q1m1z^2?~uH5AoeeEA@|5Czn~1{ z9J!f67mM(fvbch9=~i|m(NGj5oFr*$25l&_#RS(!w0C4mtk6J!&S#L%{pFl17a_As z)r-uxWC-gpE&Hd4Sp8To@3+_IvjOJD^N@&-8;ScJKu>)56av?Wjf&o7RW+%Sc!^(! zby5e`s<($yr3NZ4XA>2@*xQ{lBm`k9cwFuCMiJ&(6z>5J8f7X&mLrbV zEcZct$D@$mr|znrGULC$#zp%L#8J~v?g`o(k48dPQSvOwJa@J=dr3~C%3L|kyIPlc z@iRvp#H~FKPmT;uEh>=wZ66}+?zVqVSta+VA(P`ts6K=TD%|=i$T+6;orjr@EGY$a zoFJq(FiF(+C~kl?7cdS1&A+XLwp>}MfGkwVg94jrzdsB;`~6fP2Y=qCL@vRc3PtsgHxy>PeL4s5fh<*<0s~-xeFc9LsrwCR1T%TYj4ak4h&z$g0}V4 zFvH~<@s+O)f{%0hLJ;!`OK>L2kNR=Z%Thj7Sr7=3E)+8#R@!;ja>Ju+8Nc=O{!n}S z1p_3om3TE-%#%*Zd|PP1%m_#HYO_R+a8|=s>s7`4$Wu=)NEC$<8Tk04tbe5O_qEi& z+lqtPT3-i2;m7Y_c(@ujrhRo<@n>7y@TTnb$m-y8i0b#EInagWGemf^)B`iTUt-L!cUWVROt3R^^Av74YsCxPq{rs6 ze0z~2`gO|;y}_p&du;-ace`-JRUch^CCZRRh=aPo80i+F6tJGoh>GGbS=2$eVCWxU z+eHMF357$nFLB+?`+I;e!-Fj! zb<%i+;20X@D|sv4?;ddo2GJEB9B>~it%3FJogdF|+=eBZ>zo6D>p&Yi?}vCY^id^x zM0P`{_0n1rzz!D+ja|Lk%zmsA(B|(cj0K%vt}5Og26D3)NR z?1>(Sh4rHfO&G#}0SRRI-X*iCNhB|`t9K|s9J`@gKfPPKWb*9%osuq5uR>o zo2)RZC5e0^Hp&pB?o{za+86#cc9x|giLgK6e++IpQLd8;0gWl z1U3J?kvP!s^XQr`4G8#Dzx>$a@zW7^yr3eG$7<`9Y(LEe(w*b-?1O)+sEOrQ6jz=X zMt)xBat+M;6C-LdLZi+2Y(R+@qYz&7*3g|`m0VCZ&dg)oN5va$(b`^TZCWrRE&uFw zFrD)yxW9$v3#r4YmlxO9Gl{-q(ll4GbIV`$g+XCO36)VdHi68!P+6p*LfQiiyYk`q z9p1bf?^54+CF1%of}Cw7;0`bNERl(v7q?daem#hIQ*!7jOi|++ah>sRMAM4bx5^KY zQTCzxXeU8(6SU>*v!*)jO`Zyw$r?3Or7CZFB0ETJllpA{zH9*r)cu`F43NDQzp3%e z3c{YQITs(h-y48)YkQ#D4dJn4Xi{Y(#{s_g#_^|!FMi1WghlfZ)sxHXiz5}K>gd%!>g!zl z$JQ|nmN21UtAcsOYGoKZ7Wu+pCFX-xK+SV3c-j82DNRN#!@ta0BG_>}B| zxdGvSx;f$Zo&U9%?_1r)w{TkK2OXbc5T51QKWJ`m7^rrS8$WgoUMSX{&6s-~0fllm z$)&GqC6psblRKZNtWpCur@|NdaDO^$+EM$Fl)qHBSB)c+Iq6XRL?Yv9e^obD90>Ne zvw5_ONc}aalcab^DJ~J74wXOZnEFQ>aMfyBUw3h075Mn*;Mq-_$fe6>tyZt`qY5u|nP-$uy;_9~nOm;tq*(Ftspcr&~eje(_93Ay2kz>3GBo zSKE|}Q>{(1&>-aP+Q8_@C4tRJ)gTL8u%?fEz>M`b!N%Gzo&}k}!0C4Sr5n6VtSw6@ zz8+3t{aB!6C)#i1KriUTPEyUhRp8*L>q2JEigh7#;Da1;N$ZD(&#@_|-Rp~w7W6DX zVYVA`>sZ`aW^+UmI(LO$K2~jJBMWs*FEN7ty(`Pfd?-xxPt`;x0k=0kvqiR(&WBqt z7`Kv$+ne$?Cgog{EJ}5%@rA=nTY9j*6N8neWz!5`P9MHUZYEsf| z*<@0EK=J&Fw5ME5OxbQA-o@B&tZi`DZ)p=T{ry5LF?J>9oIeu{RZ&l&w(s{XZi)fW ztA}RO#RU5RO()7Ax2x~(ZOsBl$l~W2Z1sWJ$>w!M0=vxVhbB&w>7%+(G0t~~&+BSf zvMI;b=%MLA`L9IJ_>ee3VvvDmuF6SimHb8O(^tGbza|?zY}c)FDjeYStEc;ywYU8k zuienw7%Qdwo8rI+c6LLPoZfu!=c7k38{4V0nqR(u+Mlc?fz-K_m_+3@)5_JdB4i!H3erkCzd8oW&M$g*~bxP6P zs*^PD8IK9R0+r7MrUC~{%in07iwohuzB6pL>GPcYl{Z~fWA$R(=lGNLELWQ)|5Xtq zV%MuCFve6zfBPpABgYSyT#Ij?=%Ps@rCF>^G6C4m`H}qm1f8M3Hb`XX$jVwoF9tE+ zQ_x>B0+5d$4<;kg)>h{`EMB4q3eCj9{6xOMq|v@>&JDqP*UQaSRoKoK47nBA-)50Y z5VLkpK_^TrysSd*^GS9FuT!`=nv}uoy-h8vfm`;nm{BFQ3Rdcm@5UnfB47 z#tCCtUlwJc#IT~6EBZ9)_(V4WcGzFpIH9x{1<+-D^E>KFe)1%Dur6`U%mA1jYdRq_ z33UlrGXrhoU6PY~Sj^#&QD$Y|F$DYR>dEHKnh)=4PewyH?W~4n%>EHAm%A3)H={1O z^2M*>eO>$jKCGlk|Hz_+0gUMI3-o*(DoUEdtCy>o$P4BG%zQG1_jHK85IR`*(%Mbs za|W9`u7*B_=IwMKq}@AtlTn}cR=>w_?wpLel&9jaw4;9xMc=@7Fw&4fKa#=`Gm<*c zHtcFEj8G?hxJY(VW)CbS+Ck7;QYX@2$;&Pste!KRo(r8sDz))HbXIt3=sbB1|L^<=lebm?q2^gGU8ZyaVZ%Ssmn@O z1tppPl*rM{>zy%X0Vd`?Mh<=$FK&hcP!xthlGMBkzC6{9oMHGpsm?=i&F1O~| zNUjT^a*5F77KUmr$N9eR`JU(d(hMg@*`ORfvuYpgd0`DY6TTI`(m>S5wvgq)BD7k zyG?^}osJJa%4qo}Lz~#~a$1PaB4|FMb7WXgByl8tn71^qlpkF1qcT0Ey{bq36)FXa z(hHsMjUMigycL$VF|L`d8$PhQvmKthy%7#nNK&in`j;J3`vjjBUy2jN>WGQeKovOi z(jtYQk7QWi`|Xn`W(b-V7AJ(g7S^~-(>twK1se%uy>(x(u7TF1t|}h23jhhZBpB#} zNh9^d)i$v86C)H$)Y`n@wm^=}P~chr={z;_C% zoV|%os)Qux7x)JI9e1IAjy1S&G&p6Jp7GG+8DE~$;TILM$BIP5tvybTO0xFuNV#Hz z$I>Zrpyi;W5Ugw@7mQmulD7yQUUtQuDLnrv# z3!KFHxc2Ft!Mgg^ANg)4SE;}e^{I~}cf!2qEt)+yEXZTere)FS%~Q$q6aAcoIyKuZ z!;!8p$%ZA|M6Ogowvp(qm4>uO-#yJ1hVw)?>IQ*L->dy4H`nO{6Li*4ur6DpL{4Sw z%Mdc`x%p^grv`6A4iK13^j3~w#&KBdrT!{jqBTf+g?DvP@Wo$Q_a76@eVtO<<_MNs zu6)avk4u8&+ME#~QG+MgSGkbX#TPC0hO}Um8P!LiF;eh5uS6x{l)vAUUnDIlRM|cJ zw+qbD8G(+6vG=v2QLL|fJoOobht!;vr^}PWq)6HWX}&`JfcJ1NbP*#2vEMRGA>l&w z4cE2;JoLBR9#smsL{tmT@aSw)0!b2>&x*yNW@zLyvc>sq@zy(M&J4|ctc^+OO2EA{ z0Wi?5#pf}0N#k_yRL0xAJwbHH*Z(|!v-%WN1~24iLurhi z<;{0WWxMPwC+ojW9i%0we%5DXI$wKd2e)@oA#BdBAz#`;r9M4eiY==@xbRnYz&zCqZekcu$;rSfEO$4+U3 z6|475%JmAw(pZ+UU%s}My5Wby-Dgl9^W^2UVutZM^@8)4K6mh*n|V78ydYOZSmAL2 z1&Tq;>92NDD&W>VOA@8^w})rqze+B;_acdRQ|KXXMGd!O6N1|8MI20Tmbg|S&BjY- z`t6l=RH?{>j5}H0E7mg&lHb%D=3c|3 z_H#X$AokDp?$=DiytM6fyR~QHW4y#fU13sAh*^~_8Yw3!KptNk$aFNAY=U4K1LC(N z`!BG6uB+Ht$mA8$U*=WZ8L2ACt$&-W?8V9q8rFyDJUb!+MJ5jYeqzI3_M}rZCd!11yey{{s@LIu-KTOH0G!wlYc}sQ$a@{1}eZ05X ziug5hc-yfrqW(Oap93y9U0Y;8f^ozeOg+tIwbV&Mq|3|29W0l%&&6_euk%j9{f@wL z@6lGJ$THMSC>6&#O6F@yg-`9Li-x(X=4E#G0jCZhNs{DD^ovF!P5RT46>i)s6`oTf zz824|2&tA}DIDI8u4>GwSy}aPEpXs>c;7zFxN)t@m-v40`#>x9+<)La7v%i8-tfPKD=V|PKob3<_fq~Z*_PjD~bTRcpa6XXvPx*3+$b(~5z!lh6DkNq3G`(c> z#!TY58$s5)Q1AI!U}sj}atxkML56$7AWHN@Q`r>%2g&=tZbQL3p;8YcW*z?W5;lZe z!zSwrr*<1FLnGS0+dLbOm>%?^oQC4bD?i7dPg%PbqY`xdk#o$j+(8B3fu*%?wmrhTy!++8LpBVJ&_OwWI3m|n$n6_R}#zYRlYbtn2u*HB+6^d6T9 zYR-3b`MRx?)Pe}bxC@hZh0B*4hQRxUiCrtZo_n*d&f_HMtpD7G7k8H^37*P&{Hyfr zgM;%M8Rty)_9PQ9URMYQ0YGXZ(Qr)^9I1mx{DILzW6)Zvnwl6*&0|}&S^oo&g1mh% zhyQ=TzvS?#13>w|3uIpsA(ZS%3jT*d!8Ntv2oxTni_!c8gVO%@h!$|x>VR>Iz&n%e zJj3LJuLNE84Is#q!-EO(zQJTK0N{G|mvyjUh@-M{w@pv4#he}B5KLIzOBe!!oO>XC z2qJG9gMRIO2v&`k?-?8JV)inRGl4xZ=CrfwfN#*F + + + + + #000000 + + + diff --git a/src/image/favicon-16x16.png b/src/image/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..aeb43ebd3d55c4765859cf20d19688883f5bb4e2 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UASkfJR9T^xl_H+M9WCik>lDyqr z82-2SpV<%Ov6p!Iy0X7umJu}5-POJHKTxRN)5S4F;&O6A1CyJ^S(c@(OBV8oX{r1-L_AO{t;1H z_upMCA>~0c*MT*y%xXIhOG-{;newmx|G((gMj&8(v}eBljr%$KeldHhFYdHdUKOch z5YNQ$x%D~*p z*bHKcDf<&&pq}umkcg6?#Bzm#qWrYXoK%I9%7Rpd%z~0+28N0`k3aEn6ozSNobo?? z#`9?q1G6%>UNX0^vat7L5oTcpmj;u=Da^{7LljQmxN_pinIkes*iScjEb!7}cqJ}a U^2y0`D$oiBPgg&ebxsLQ0Hz3{{Qv*} literal 0 HcmV?d00001 diff --git a/src/image/favicon-32x32.png b/src/image/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6bbce356943f4e805c1808ffb7961653255ea4 GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVOS+@4BLl<6e(pbstUx|flDE4H z!~gdFGy8!&_7YEDSN0doGJMVZ%V$4KE>9~< zyg9*3F7%U1HpB1bybn~=^R70=9V!T5cd^hr)%xSTOm!LmPca8;(}S*z0_kcu&N8GZ zh`m@VUn)|Q!ubAt@PVoRGiE#OzL|1$^{r};-@6PiEfAZK+pfJRL4Vcj2R>KWCU(fx z)X%i-Xi&@kwyNH3A>#*m2b~M@y`n#C&WJa^SoQZr$}0cIv!~wA`pI5z!()EGL@F=- zUg^i$m|b(f>@1GI{^@J%()T~NbL^>ND!tehX_PjlLiZw@t9cSI7*tDKBT7;dOH!?p zi&B9UgOP!eiLQaMu8~EEp}Cc*iIs_|wt<0_fq~SwZ8K0bgX$5hX#19-8f8yaN4Aam!<$wB&=hGktW@T=@WNu+)VeiQz%)$yT4JL)gr+Par$jZP zWQH0^yg!r5DaThoWs-H!yRQEE{qwu7uIqWO`@TQ-=kq-O+}C~Ie;p+gloT}-0RT`U z5p7)n0HXZ!%F9TQms}&1#K;66ay$e84Hux_C>tcP7M1AY2mtXq0FaUa0AD0f${YaD z(EzaE2LNV;000L|TAVE;2`PUEf-UeP>q75iNhC)jIoiq1Nh3C!8non;{{R4a63O<^ zu`{pUzd3nMGk8b$$EDV+q}aydfWcGB#k9c^;;SaShaT2{v+bWvY596SmB-8SUdy*_ z`Ue74Yjv(ngZrF2=X1t+ld3~P6}(6%^ka&Su&jZkU=VuAbO5o6_E}t9e3UhkK7P

{T9ZeUQwDh>C$hUm+$o)ysZi>=n#cZBLkJ?D68)Ru=3Kx(cQco zhZ#0kU|D+VEK~Kq z?>UcwFsP8vw)1;F`{UH2om4R~7+8RJ5=*1@`u9yd=gLO46whJQNV{CsEtH`G&pG7o zhPkaQEP{fg$C0+NT-?8nHapl0yNL^vm(YkEExd+{(ugD8?pqifo7!qo^VPOQW_&xj zYGUrCdRmmM&{lsOie*qqCsTIRIC$GjF{la#Iw?Utx_J^0X@@JSf|A<7eUuFI)G#k6 zZ{kma4NNLlID3vNE+|ij0ZOv21tnH5z0$MKheQnz}&<4C-~>JhthB7<>4$+9dL4_wd@{7Gw9^P z%j4c$upM@X!q1A&OK^ohT99IJlwplw{4oA@f(8mfMaXCzsR7$as0vil-r;Te4n8a4HV!6Su+s0aN~4~xy)8|(L*#^srB z^ZL)5{*VFrZ7i`;e~MZxq_$37X8VCt7yB}D2tshE3i7bIcw{7TW@93`t3vbIFK)Bi z4SV|>>VfVI?1&>LOsewgPu~r;8crkU z)H)=leT(4r+q6@0&lkbcW;M=nK|_v{beO(x^P}&Xux@N!On7`fIE3%?!~5?m3!w%< zva4>-CTzNw4Zw2m-9w$Y<3r$rz3iiApOU{uY&4fvRxW`*=nEe-2S#%eb~tB33H7FB zx9L40o5Tr0yi86(4F-sE+UtjFlIJyKaCNuxZrEi&35!0R&oZD{`TbyCxT~2u>(a!W zDh}~Jc0bepLHk6=@cMrbzk>?nQh68M)-}bHQR`IRjdF?Ze%fPuNhOPxvrDnMG#s;Y zQYwqe-Z|d~`d#2;|Li#fPuv686LWq)sO(=YXriNGC=^-krT11r*9%wVK*NtB?|>uj z+~ zuDO>Ud^I z`u?!>ncVt@hBYy!|HF2_b4dPcY%p%vv~^8KH)p+P@n%%Lh)&KkUo<)hf0wW;J!8tk za#CjhQ|^v7GK+2M7dk?B+(|$`HNy?i~*j%B;Kfg zCnsszmuiRfzyDmt}K}yT0~h)BWv`0l1*ZXveJu)sfM+XEC#4 z4#W0k;BCjb{c9>^ZwFn)yp}p#_>zqXQ)dz@RZE254gg4DOiGelx6znF&@OjW$E0HCFFS z)|LMeL_`LJ2F3k@CifHNgi%P{#U z_dR=_ISG16(=LEC5{jZiRgfwUmsO=zv}{vMcmdML#$#Fn;ZRR!ZzrNtPLM*pei#KT Wz&F#Dt+7`mUjQUKvTdEUU)sOytyh)+ literal 0 HcmV?d00001 diff --git a/src/image/safari-pinned-tab.svg b/src/image/safari-pinned-tab.svg new file mode 100644 index 0000000..ef48fbf --- /dev/null +++ b/src/image/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/src/image/site.webmanifest b/src/image/site.webmanifest new file mode 100644 index 0000000..de65106 --- /dev/null +++ b/src/image/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/src/templates/debug/anon_matchmaking.html b/src/templates/debug/anon_matchmaking.html new file mode 100644 index 0000000..01515fa --- /dev/null +++ b/src/templates/debug/anon_matchmaking.html @@ -0,0 +1,51 @@ + + + + + + Matchmaking Debug + + + + +

Matchmaking Debug Information

+

Length of Queue: {{ len_queue }}

+

Killed Lobbies: {{ len_killed_lobbies }}

+

Queued Runners: {{ len_queued_runners }}

+

Queued Hunters: {{ len_queued_hunters }}

+

Open Lobbies: {{ len_open_lobbies }}

+ +

Lobby Data

+ + + + + + + + {% for lobby in lobby_data %} + + + + + + + {% endfor %} +
Lobby IDHuntersRunnersStatus
{{ lobby.id }}1 + {{ lobby.nonHosts }} + {{ lobby.status }}
+ +