2021-01-07 08:10:53 +00:00
|
|
|
import asyncio, time, datetime, games, json, threading, jinja2, leagues, os
|
|
|
|
from flask import Flask, url_for, Response, render_template, request, jsonify, send_from_directory
|
2020-12-29 00:48:50 +00:00
|
|
|
from flask_socketio import SocketIO, emit
|
2020-12-28 08:21:47 +00:00
|
|
|
|
2021-01-07 08:10:53 +00:00
|
|
|
app = Flask("the-prestige", static_folder='simmadome/build')
|
2020-12-29 00:48:50 +00:00
|
|
|
app.config['SECRET KEY'] = 'dev'
|
2021-01-01 20:28:12 +00:00
|
|
|
#app.config['SERVER_NAME'] = '0.0.0.0:5000'
|
2020-12-29 00:48:50 +00:00
|
|
|
socketio = SocketIO(app)
|
2020-12-28 08:21:47 +00:00
|
|
|
|
2021-01-07 08:10:53 +00:00
|
|
|
# Serve React App
|
|
|
|
@app.route('/', defaults={'path': ''})
|
|
|
|
@app.route('/<path:path>')
|
|
|
|
def serve(path):
|
|
|
|
if path != "" and os.path.exists(app.static_folder + '/' + path):
|
|
|
|
return send_from_directory(app.static_folder, path)
|
|
|
|
else:
|
|
|
|
return send_from_directory(app.static_folder, 'index.html')
|
2021-01-02 11:21:53 +00:00
|
|
|
|
|
|
|
|
2021-01-01 20:28:12 +00:00
|
|
|
thread2 = threading.Thread(target=socketio.run,args=(app,'0.0.0.0'))
|
2020-12-28 08:21:47 +00:00
|
|
|
thread2.start()
|
|
|
|
|
|
|
|
master_games_dic = {} #key timestamp : (game game, {} state)
|
2021-01-07 08:10:53 +00:00
|
|
|
game_states = []
|
2020-12-29 00:48:50 +00:00
|
|
|
|
2021-01-02 07:29:03 +00:00
|
|
|
@socketio.on("recieved")
|
2021-01-01 08:32:47 +00:00
|
|
|
def handle_new_conn(data):
|
2021-01-07 08:10:53 +00:00
|
|
|
socketio.emit("states_update", game_states, room=request.sid)
|
2020-12-28 08:21:47 +00:00
|
|
|
|
|
|
|
def update_loop():
|
2021-01-07 08:10:53 +00:00
|
|
|
global game_states
|
2020-12-28 08:21:47 +00:00
|
|
|
while True:
|
2021-01-07 08:10:53 +00:00
|
|
|
game_states = []
|
2021-01-05 19:26:54 +00:00
|
|
|
game_ids = iter(master_games_dic.copy().keys())
|
|
|
|
for game_id in game_ids:
|
|
|
|
this_game, state, discrim_string = master_games_dic[game_id]
|
2020-12-28 08:21:47 +00:00
|
|
|
test_string = this_game.gamestate_display_full()
|
2020-12-31 18:41:32 +00:00
|
|
|
state["leagueoruser"] = discrim_string
|
2020-12-28 08:21:47 +00:00
|
|
|
state["display_inning"] = this_game.inning #games need to be initialized with the following keys in state:
|
2020-12-31 22:06:56 +00:00
|
|
|
#is_league, bool
|
2020-12-28 08:21:47 +00:00
|
|
|
state["outs"] = this_game.outs #away_name
|
|
|
|
state["pitcher"] = this_game.get_pitcher().name #home_name
|
|
|
|
state["batter"] = this_game.get_batter().name #max_innings
|
|
|
|
state["away_score"] = this_game.teams["away"].score #top_of_inning = True
|
|
|
|
state["home_score"] = this_game.teams["home"].score #update_pause = 0
|
|
|
|
#victory_lap = False
|
|
|
|
if test_string == "Game not started.": #weather_emoji
|
|
|
|
state["update_emoji"] = "🍿" #weather_text
|
|
|
|
state["update_text"] = "Play blall!" #they also need a timestamp
|
2020-12-31 08:32:01 +00:00
|
|
|
state["start_delay"] -= 1
|
2020-12-28 08:21:47 +00:00
|
|
|
|
2020-12-30 07:48:39 +00:00
|
|
|
state["display_top_of_inning"] = state["top_of_inning"]
|
|
|
|
|
2020-12-31 08:32:01 +00:00
|
|
|
if state["start_delay"] <= 0:
|
2020-12-28 08:21:47 +00:00
|
|
|
if this_game.top_of_inning != state["top_of_inning"]:
|
|
|
|
state["update_pause"] = 2
|
|
|
|
state["pitcher"] = "-"
|
|
|
|
state["batter"] = "-"
|
2020-12-29 00:48:50 +00:00
|
|
|
if not state["top_of_inning"]:
|
2020-12-28 08:21:47 +00:00
|
|
|
state["display_inning"] -= 1
|
2020-12-30 07:48:39 +00:00
|
|
|
state["display_top_of_inning"] = False
|
2020-12-28 08:21:47 +00:00
|
|
|
|
|
|
|
if state["update_pause"] == 1:
|
|
|
|
state["update_emoji"] = "🍿"
|
2020-12-31 02:32:07 +00:00
|
|
|
if this_game.over:
|
2020-12-31 08:32:01 +00:00
|
|
|
state["display_inning"] -= 1
|
|
|
|
state["display_top_of_inning"] = False
|
2020-12-31 02:32:07 +00:00
|
|
|
winning_team = this_game.teams['home'].name if this_game.teams['home'].score > this_game.teams['away'].score else this_game.teams['away'].name
|
2020-12-31 08:32:01 +00:00
|
|
|
if this_game.victory_lap and winning_team == this_game.teams['home'].name:
|
|
|
|
state["update_text"] = f"{winning_team} wins with a victory lap!"
|
|
|
|
elif winning_team == this_game.teams['home'].name:
|
|
|
|
state["update_text"] = f"{winning_team} wins, shaming {this_game.teams['away'].name}!"
|
|
|
|
else:
|
|
|
|
state["update_text"] = f"{winning_team} wins!"
|
2020-12-31 02:32:07 +00:00
|
|
|
state["pitcher"] = "-"
|
|
|
|
state["batter"] = "-"
|
|
|
|
elif this_game.top_of_inning:
|
2020-12-28 08:21:47 +00:00
|
|
|
state["update_text"] = f"Top of {this_game.inning}. {this_game.teams['away'].name} batting!"
|
|
|
|
else:
|
|
|
|
if this_game.inning >= this_game.max_innings:
|
|
|
|
if this_game.teams["home"].score > this_game.teams["away"].score:
|
2020-12-31 08:32:01 +00:00
|
|
|
this_game.victory_lap = True
|
2020-12-28 08:21:47 +00:00
|
|
|
state["update_text"] = f"Bottom of {this_game.inning}. {this_game.teams['home'].name} batting!"
|
|
|
|
|
|
|
|
elif state["update_pause"] != 1 and test_string != "Game not started.":
|
|
|
|
if "steals" in this_game.last_update[0].keys():
|
|
|
|
updatestring = ""
|
|
|
|
for attempt in this_game.last_update[0]["steals"]:
|
|
|
|
updatestring += attempt + "\n"
|
|
|
|
|
2020-12-30 06:31:19 +00:00
|
|
|
state["update_emoji"] = "💎"
|
2020-12-28 08:21:47 +00:00
|
|
|
state["update_text"] = updatestring
|
|
|
|
|
2021-01-02 10:42:14 +00:00
|
|
|
elif "mulligan" in this_game.last_update[0].keys():
|
|
|
|
updatestring = ""
|
|
|
|
punc = ""
|
|
|
|
if this_game.last_update[0]["defender"] != "":
|
|
|
|
punc = ", "
|
|
|
|
|
|
|
|
state["update_emoji"] = "🏌️♀️"
|
|
|
|
state["update_text"] = f"{this_game.last_update[0]['batter']} would have gone out, but they took a mulligan!"
|
|
|
|
|
|
|
|
elif "snow_atbat" in this_game.last_update[0].keys():
|
|
|
|
state["update_emoji"] = "❄"
|
|
|
|
state["update_text"] = this_game.last_update[0]["text"]
|
|
|
|
|
2020-12-28 08:21:47 +00:00
|
|
|
else:
|
|
|
|
updatestring = ""
|
|
|
|
punc = ""
|
|
|
|
if this_game.last_update[0]["defender"] != "":
|
|
|
|
punc = ". "
|
|
|
|
|
|
|
|
if "fc_out" in this_game.last_update[0].keys():
|
|
|
|
name, base_string = this_game.last_update[0]['fc_out']
|
|
|
|
updatestring = f"{this_game.last_update[0]['batter']} {this_game.last_update[0]['text'].value.format(name, base_string)} {this_game.last_update[0]['defender']}{punc}"
|
|
|
|
else:
|
|
|
|
updatestring = f"{this_game.last_update[0]['batter']} {this_game.last_update[0]['text'].value} {this_game.last_update[0]['defender']}{punc}"
|
|
|
|
if this_game.last_update[1] > 0:
|
|
|
|
updatestring += f"{this_game.last_update[1]} runs scored!"
|
|
|
|
|
2020-12-30 06:31:19 +00:00
|
|
|
state["update_emoji"] = "🏏"
|
2020-12-28 08:21:47 +00:00
|
|
|
state["update_text"] = updatestring
|
|
|
|
|
|
|
|
state["bases"] = this_game.named_bases()
|
|
|
|
|
2020-12-30 07:48:39 +00:00
|
|
|
state["top_of_inning"] = this_game.top_of_inning
|
2020-12-28 08:21:47 +00:00
|
|
|
|
2021-01-07 08:10:53 +00:00
|
|
|
game_states.append([game_id, state])
|
2020-12-28 08:21:47 +00:00
|
|
|
|
2020-12-31 08:32:01 +00:00
|
|
|
if state["update_pause"] <= 1 and state["start_delay"] < 0:
|
2020-12-31 02:32:07 +00:00
|
|
|
if this_game.over:
|
2020-12-31 08:32:01 +00:00
|
|
|
state["update_pause"] = 2
|
|
|
|
if state["end_delay"] < 0:
|
2021-01-05 19:26:54 +00:00
|
|
|
master_games_dic.pop(game_id)
|
2021-01-01 17:08:11 +00:00
|
|
|
else:
|
|
|
|
state["end_delay"] -= 1
|
2021-01-05 19:26:54 +00:00
|
|
|
master_games_dic[game_id][1]["end_delay"] -= 1
|
2020-12-31 02:32:07 +00:00
|
|
|
else:
|
|
|
|
this_game.gamestate_update_full()
|
2020-12-28 08:21:47 +00:00
|
|
|
|
|
|
|
state["update_pause"] -= 1
|
2020-12-31 02:32:07 +00:00
|
|
|
|
2021-01-07 08:10:53 +00:00
|
|
|
socketio.emit("states_update", game_states)
|
2021-01-13 09:23:48 +00:00
|
|
|
time.sleep(1)
|