From 39b81bf10b1f93d71aa5b4caf3193ad17102dedc Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Mon, 31 Jul 2023 00:29:56 -0500 Subject: [PATCH] add key plays to post-game scorebug --- cogs/players.py | 136 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 127 insertions(+), 9 deletions(-) diff --git a/cogs/players.py b/cogs/players.py index f444166..851aa2c 100644 --- a/cogs/players.py +++ b/cogs/players.py @@ -1073,12 +1073,23 @@ class Players(commands.Cog): await asyncio.sleep(1) setup_tab = scorecard.worksheet_by_title('Setup') g_data = setup_tab.get_values('M2', 'R3') + setup_vals = setup_tab.get_values('B7', 'R33') at_abbrev = g_data[0][0] ht_abbrev = g_data[1][0] + away_mgr_name = g_data[0][2] + home_mgr_name = g_data[1][2] away_team = await get_team_by_abbrev(at_abbrev, current['season']) home_team = await get_team_by_abbrev(ht_abbrev, current['season']) week_num = g_data[0][5] game_num = g_data[1][5] + if away_team['manager2'] is not None and away_team['manager2']['name'].lower() == away_mgr_name: + away_manager = away_team['manager2'] + else: + away_manager = away_team['manager1'] + if home_team['manager2'] is not None and home_team['manager2']['name'].lower() == home_mgr_name: + home_manager = home_team['manager2'] + else: + home_manager = home_team['manager1'] logging.info(f'gdata: {g_data}\nweek/game: {week_num}/{game_num}') @@ -1226,7 +1237,8 @@ class Players(commands.Cog): # Log game result try: g_resp = await db_patch('games', object_id=this_game['id'], params=[ - ('away_score', score_table[0][0]), ('home_score', score_table[1][0]) + ('away_score', int(score_table[0][0])), ('home_score', int(score_table[1][0])), + ('away_manager_id', away_manager['id']), ('home_manager_id', home_manager['id']), ('game_num', game_num) ]) except ValueError as e: logging.error(f'PATCH game error: {e}') @@ -1252,7 +1264,8 @@ class Players(commands.Cog): b_sv = [] holds = [] for line in all_decisions: - this_data = {'game_id': this_game['id']} + this_data = {'game_id': this_game['id'], 'season': this_game['season'], 'week': this_game['week'], + 'game_num': game_num} for count, x in enumerate(line): if x != '': this_data[pit_keys[count]] = x @@ -1285,20 +1298,20 @@ class Players(commands.Cog): content=f'The following errors were found in your **wk{week_num}g{game_num}** scorecard. ' f'Please resolve them and resubmit - thanks!\n\n{e}' ) + await db_post(f'games/wipe/{this_game["id"]}') await db_delete('plays/game', object_id=this_game['id']) - await db_delete('decisions/game', object_id=this_game['id']) return # Post scorecard to news channel card_url = f'<{SBA_BASE_URL}/scorecards/?season={current["season"]}&week={week_num}&game={game_num}' \ f'&away_abbrev={away_team["abbrev"]}&home_abbrev={home_team["abbrev"]}>' extras = '' - if final_inning > 9: + if int(final_inning) > 9: extras = f' F/{final_inning}' embed = get_team_embed( f'{away_team["sname"]} {score_table[0][0]} @ ' f'{score_table[1][0]} {home_team["sname"]}{extras}', - team=away_team if score_table[0][0] > score_table[1][0] else home_team + team=away_team if int(score_table[0][0]) > int(score_table[1][0]) else home_team ) embed.description = f'Week {week_num} | Game {game_num}' @@ -1314,9 +1327,6 @@ class Players(commands.Cog): inline=False ) - # TODO: pull highlight stats for embed - logging.info(f'pull highlight stats for embed') - pitching_string = f'WP: {wp["name"]}\n' \ f'LP: {lp["name"]}\n' \ f'{"HD: " if len(holds) > 0 else ""}' @@ -1337,6 +1347,100 @@ class Players(commands.Cog): embed.add_field(name='Pitching', value=pitching_string, inline=False) + # TODO: pull highlight stats for embed + logging.info(f'pull highlight stats for embed') + p_query = await db_get('plays', params=[ + ('game_id', this_game['id']), ('sort', 'wpa-desc'), ('limit', 3) + ]) + + key_plays = '' + for play in p_query['plays']: + logging.info(f'this_play: {play}') + this_line = f'- {play["inning_half"].title()} {play["inning_num"]}: ' + + # Offensive Play + if play['wpa'] > 0: + logging.info('OFFENSE') + if play['runner'] is not None: + logging.info('RUNNER') + if play['on_third'] == play['runner']['id']: + s_base = 'HOME' + elif play['on_second'] == play['runner']['id']: + s_base = 'third' + else: + s_base = 'second' + this_line += f'{play["runner"]["name"]} ({play["runner"]["team"]["abbrev"]}) steals {s_base}' + else: + logging.info('BATTER') + if play['homerun'] == 1: + h_name = 'HOMERS' + elif play['triple'] == 1: + h_name = 'triples' + elif play['double'] == 1: + h_name = 'doubles' + else: + h_name = 'singles' + logging.info('RBI?') + if play['rbi'] > 0: + rbi_string = f'in {play["rbi"]} run{"s" if play["rbi"] > 1 else ""}' + else: + rbi_string = '' + logging.info('LINE?') + this_line += f'{play["batter"]["name"]} ({play["batter"]["team"]["abbrev"]}) {h_name} {rbi_string}' + # Defensive Play + else: + logging.info('DEFENSE') + if play['catcher'] is not None: + logging.info('CATCHER') + if play['on_third_final'] == 0: + s_base = 'HOME' + elif play['on_second_final'] == 0: + s_base = 'third' + else: + s_base = 'second' + this_line += f'{play["catcher"]["name"]} ({play["catcher"]["team"]["abbrev"]}) throws out the ' \ + f'runner at {s_base}' + elif play['defender'] is not None: + logging.info('DEFENDER') + if play['outs'] == 3: + play_string = 'turns a TRIPLE PLAY' + elif play['outs'] == 2: + play_string = 'rolls a double play' + else: + play_string = f'makes a tough play at {play["check_pos"]}' + this_line += f'{play["defender"]["name"]} ({play["defender"]["team"]["abbrev"]}) {play_string}' + else: + logging.info('PITCHER') + if play['so'] == 1: + if play['starting_outs'] == 2: + out_th = 'for the 3rd out' + elif play['starting_outs'] == 1: + out_th = 'for the 2nd out' + else: + out_th = 'to leadoff the inning' + play_string = f'gets a K {out_th}' + elif play['on_base_code'] != '000' and play['starting_outs'] + play['outs'] > 2: + num_runners = play["on_base_code"].count("1") + play_string = f'strands {num_runners} runner{"s" if num_runners > 1 else ""}' + else: + if play['starting_outs'] == 2: + play_string = 'records the 3rd out' + elif play['starting_outs'] == 1: + play_string = 'records the 2nd out' + else: + play_string = 'retires the leadoff batter' + this_line += f'{play["pitcher"]["name"]} ({play["pitcher"]["team"]["abbrev"]}) {play_string}' + + key_plays += f'{this_line}\n' + + if len(key_plays) > 0: + embed.add_field( + name='Key Plays', + value=key_plays, + inline=False + ) + + # batting_string = '' # count = 1 # if len(final_doubles) > 0: @@ -1432,7 +1536,8 @@ class Players(commands.Cog): embed.add_field( name='Scorecard', - value=f'[Website]({card_url}) / [Sheets]({sheet_url})' + value=f'[Website]({card_url}) / [Sheets]({sheet_url})', + inline=False ) embed.set_footer(text='Please share the highlights!') @@ -1446,6 +1551,19 @@ class Players(commands.Cog): update = await interaction.channel.send('I\'m tallying standings now...') if await db_post(f'standings/s{current["season"]}/recalculate'): await update.delete() + await interaction.edit_original_response(content='You are all set!') + + try: + setup_tab.update_values( + crange=f'B7', + values=setup_vals + ) + await interaction.edit_original_response(content='You are all set!') + except Exception as e: + logging.error(f'could not freeze sheet for game {this_game["id"]}') + await interaction.edit_original_response( + content='I was not able to freeze the rosters in your sheet, but everything else went through.' + ) @app_commands.command(name='branding', description='Update your team branding') @app_commands.guilds(discord.Object(id=os.environ.get('GUILD_ID')))