From be18cf83b771f672e5239310dd88a1a81dfbbc84 Mon Sep 17 00:00:00 2001 From: Sakimori Date: Mon, 28 Dec 2020 19:48:50 -0500 Subject: [PATCH] built rudimentary css grid for games, loader.js now directs updates to appropriate grid square as they come in --- main_controller.py | 25 +++++++++++++------ static/games_page.css | 43 ++++++++++++++++++++++++++++++++ static/loader.js | 41 ++++++++++++++++++++++++++++++ static/prism.png | Bin 0 -> 9697 bytes static/repeated-square-dark.png | Bin 0 -> 2168 bytes templates/index.html | 32 ++++++++++++++++++++++++ the-prestige.pyproj | 8 ++++++ the_prestige.py | 4 +-- 8 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 static/games_page.css create mode 100644 static/loader.js create mode 100644 static/prism.png create mode 100644 static/repeated-square-dark.png create mode 100644 templates/index.html diff --git a/main_controller.py b/main_controller.py index cd96288..0c36ce0 100644 --- a/main_controller.py +++ b/main_controller.py @@ -1,24 +1,32 @@ import asyncio, time, datetime, games, json, threading -from flask import Flask, url_for, Response +from flask import Flask, url_for, Response, render_template, request, jsonify +from flask_socketio import SocketIO, emit app = Flask("the-prestige") +app.config['SECRET KEY'] = 'dev' +socketio = SocketIO(app) @app.route('/') -def hello(): - return url_for("boop") +def index(): + return render_template("index.html") @app.route("/gotoboop") -def boop(): +def get_game_states(): return states_to_send -thread2 = threading.Thread(target=app.run) +@socketio.on("recieved") +def do_another_thing(data): + print(data) + +thread2 = threading.Thread(target=socketio.run,args=(app,)) thread2.start() master_games_dic = {} #key timestamp : (game game, {} state) -states_to_send = {} + def update_loop(): while True: + states_to_send = {} game_times = iter(master_games_dic.copy().keys()) for game_time in game_times: this_game, state = master_games_dic[game_time] @@ -41,7 +49,7 @@ def update_loop(): state["update_pause"] = 2 state["pitcher"] = "-" state["batter"] = "-" - if state["top_of_inning"]: + if not state["top_of_inning"]: state["display_inning"] -= 1 if state["update_pause"] == 1: @@ -91,4 +99,5 @@ def update_loop(): state["update_pause"] -= 1 - time.sleep(6) \ No newline at end of file + socketio.emit("states_update", states_to_send) + time.sleep(1) \ No newline at end of file diff --git a/static/games_page.css b/static/games_page.css new file mode 100644 index 0000000..92fb9c8 --- /dev/null +++ b/static/games_page.css @@ -0,0 +1,43 @@ +@import url('https://fonts.googleapis.com/css2?family=Alegreya&display=swap'); +body { + background-image: url("prism.png"); +} +/* Background pattern from Toptal Subtle Patterns */ + +.container { + font-family: 'Alegreya', serif; + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 100px 300px; + grid-gap: 50px 30px; /*space between rows, then columns*/ + align-items: center; + justify-items: center; + grid-auto-rows: 300px; + grid-auto-flow: row; +} + +.h1 { + margin: auto; + width: 45%; + font-family: 'Alegreya', serif; +} + +.emptyslot { + border: 2px dashed white; + border-radius: 15px; + align-self: stretch; + justify-self: stretch; + text-align: center; + color: white; +} + +.game { + font-family: 'Alegreya', serif; + color: white; +} + +h2 { + font-family: 'Alegreya', serif; + color: white; + text-align: center; +} \ No newline at end of file diff --git a/static/loader.js b/static/loader.js new file mode 100644 index 0000000..550dfae --- /dev/null +++ b/static/loader.js @@ -0,0 +1,41 @@ +$(document).ready(function (){ + var socket = io.connect(); + var gameslist = []; + var maxslot = 3; + var grid = document.getElementById("container"); + + + socket.on('connect', function () { + socket.emit('recieved', { data: 'I\'m connected!' }); + }); + + socket.on("states_update", function (json) { //json is an object containing all game updates + for (const timestamp in json) { + if (!gameslist.includes(timestamp)) { //adds game to list if not there already + gameslist.push(timestamp) + var gridBoxes = grid.children; + for (var slotnum = 3; slotnum <= maxslot; slotnum++) { + if (gridBoxes[slotnum].className == "emptyslot") { + insertGame(slotnum, json[timestamp], timestamp); + maxslot += 1; + break; + }; + }; + }; + + for (var slotnum = 3; slotnum <= maxslot; slotnum++) { + if (grid.children[slotnum].timestamp == timestamp) { + console.log(json[timestamp].update_text) + grid.children[slotnum].textContent = json[timestamp].update_text; + }; + }; + }; + }); + + const insertGame = (gridboxnum, gamestate, timestamp) => { + var thisBox = grid.children[gridboxnum]; + thisBox.className = "game"; + thisBox.timestamp = timestamp + thisBox.textContent = gamestate.update_text; + }; +}); \ No newline at end of file diff --git a/static/prism.png b/static/prism.png new file mode 100644 index 0000000000000000000000000000000000000000..0f02b16e7d3280702a48b9eb1d31401db18cc8f1 GIT binary patch literal 9697 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 Y%zHG&&i@Mdn=Jy{-i?)Sx0V0@04#ug>;M1& literal 0 HcmV?d00001 diff --git a/static/repeated-square-dark.png b/static/repeated-square-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..31f2735921df9b84f6ab77bbe57a0aed0cf32bb8 GIT binary patch literal 2168 zcmb7`dr(qo7{)O*87nWj(hV!Ka zP4O~hs|jgI>8_wHyQay_%D`KwX36)9t1p5NMN+x7TS9$bhbUz`zFR-s_7NAP^YkA>GEgg}`S)BmKATDFu|0JP zsaZ95uhAke9w;)l)*hZ0x#5CQDeLz#{3?}Y6No-#t6kA0e?B@?U0;*cgjAny2REAL zgG<@Teci--!qVc|KQzx>ym($33;A7K;KLI<4q@lLs&e#;T+`kogcP40^Udx8v9rWz8YhfvL%|L+JW>2KI)5z|b zyD4elxLtUB zUw{a2d^jsZHMpN#QM;=Bbv13NA)M-^8KLWpD^a=GKBei~EWOw7tZ9 zxjSckaGc8LEx(gF&=M8E)i1s7^w?0nc<2E8yT>-DD$Ha@?4u^(ZK?ppm&tDJ)Ks^2 zMkV9C_CPcZk!1e%nT5sIAOoY%FFC}Ca1>_t6{_p)$RSD|={jl4ycL&M&LJQ;8+-lV zpYj|a=40!^gc63e#g`==zZK4qB`p5q9)K1u@_4*CzoAAs!8G z;>C+NCKh9I!@LWL3Kw!kXLXgLtRLICGJ}6Xh+E*SE)I>b_`1_;9wuUiVCy=)i;)?i z?2E)ZcDK1WM-4zAv)z;=1E_@Kg%X~%gpG3~_Y=(uAB4NK&Ha!kExeT;f1xMFr^i0A zP&##}Oo<1|(VPMaY%6<-Jvx#66ESNyFWF>xg21S z{YE?*aeIzPei);zK`cVw#**I)Wk65<2iNp)^L600-?ZXUZ(^NQG^3>Zoesm;l_i3` zg5>__tG=ts2s29RfGfrU7%arg(E=TmJta@X(DrZF&gL?C-L^%}MWL_#AIh?7ZjNx_ zktpGD<8&q>=xMo%0V@y<07L@s<>f8d9TK6ZNYC#CVl0k6yZ+y?Agb6XgXv-cBZ_Y0 zKy0AMESiZ$JUNGT-L10pd~p2G&7{r`CnNEoJMsB>zrX%^fm+N+-Fm| zbE;#WrM@(5>Dy4LWYRK|D_-nNHnUWF^SRQakxVFOW}j|^Q!qK GBI_@!sCFCx literal 0 HcmV?d00001 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..af42576 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,32 @@ + + + + + + + + ⚾ The Blaseball Simsim + + + +
+
+
+

game page ahoy

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/the-prestige.pyproj b/the-prestige.pyproj index d690614..5f782b1 100644 --- a/the-prestige.pyproj +++ b/the-prestige.pyproj @@ -57,6 +57,14 @@ + + + + + + + +