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 = " . "
2021-01-14 03:34:46 +00:00
2020-12-28 08:21:47 +00:00
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
2021-01-14 03:34:46 +00:00
if " veil " in this_game . last_update [ 0 ] . keys ( ) :
state [ " update_emoji " ] = " 🌌 "
2021-01-14 04:21:28 +00:00
state [ " update_text " ] + = f " { this_game . last_update [ 0 ] [ ' batter ' ] } ' s will manifests on { games . base_string ( this_game . last_update [ 1 ] ) } base. "
2021-01-14 03:34:46 +00:00
elif " error " in this_game . last_update [ 0 ] . keys ( ) :
2021-01-14 04:21:28 +00:00
state [ " update_emoji " ] = " 👻 "
state [ " update_text " ] = f " { this_game . last_update [ 0 ] [ ' batter ' ] } ' s hit goes ethereal, and { this_game . last_update [ 0 ] [ ' defender ' ] } can ' t catch it! { this_game . last_update [ 0 ] [ ' batter ' ] } reaches base safely. "
2020-12-28 08:21:47 +00:00
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-14 05:20:43 +00:00
time . sleep ( 1 )