diff --git a/cogs/gameplay.py b/cogs/gameplay.py index 727e001..9b19087 100644 --- a/cogs/gameplay.py +++ b/cogs/gameplay.py @@ -216,10 +216,16 @@ class Gameplay(commands.Cog): away_role = await team_role(interaction, away_team) home_role = await team_role(interaction, home_team) + embed = this_game.get_scorebug_embed(session).clear_fields() + embed.add_field( + name=f'{ai_team.abbrev} Lineup', + value=this_game.team_lineup(session, ai_team) + ) + await final_message.edit( content=f'{away_role.mention} @ {home_role.mention} is set!\n\n' f'Go ahead and set lineups with the `/read-lineup` command!', - embed=this_game.get_scorebug_embed(session) + embed=embed ) @commands.command(name='force-endgame', help='Mod: Force a game to end without stats') @@ -233,7 +239,7 @@ class Gameplay(commands.Cog): await ctx.send( content=None, - embed=this_game.get_scorebug_embed(session, include_lineups=True) + embed=this_game.get_scorebug_embed(session, full_length=True) ) view = Confirm(responders=[ctx.author], timeout=60, label_type='confirm') diff --git a/in_game/gameplay_models.py b/in_game/gameplay_models.py index 2234371..e2a05da 100644 --- a/in_game/gameplay_models.py +++ b/in_game/gameplay_models.py @@ -6,7 +6,7 @@ import discord import pydantic from sqlmodel import Session, SQLModel, create_engine, select, or_, Field, Relationship -from sqlalchemy import func +from sqlalchemy import func, desc from api_calls import db_get, db_post from exceptions import * @@ -154,10 +154,14 @@ class Game(SQLModel, table=True): title=f'{self.away_team.sname} @ {self.home_team.sname}{gt_string}', color=int('a6ce39', 16) ) - logging.info(f'gameplay_models - Game.get_scorebug_embed - embed: {embed}') curr_play = self.current_play_or_none(session) - logging.info(f'gameplay_models - Game.get_scorebug_embed - curr_play: {self}') + + if curr_play is None: + try: + curr_play = self.initialize_play(session) + except LineupsMissingException as e: + logging.debug(f'gameplay_models - Game.get_scorebug_embed - Could not initialize play') if curr_play is not None: embed.add_field( @@ -165,7 +169,6 @@ class Game(SQLModel, table=True): value=curr_play.scorebug_ascii, inline=False ) - logging.info(f'gameplay_models - Game.get_scorebug_embed - embed post gamestate: {embed}') if classic: embed.add_field( @@ -176,7 +179,6 @@ class Game(SQLModel, table=True): name='Batter', value=curr_play.batter.player.name_card_link('batting') ) - logging.info(f'gameplay_models - Game.get_scorebug_embed - embed post batter: {embed}') baserunner_string = '' if curr_play.on_first is not None: @@ -191,18 +193,32 @@ class Game(SQLModel, table=True): embed.add_field(name=' ', value=' ', inline=False) embed.add_field(name='Baserunners', value=baserunner_string) embed.add_field(name='Catcher', value=curr_play.catcher.player.name_card_link) - logging.info(f'gameplay_models - Game.get_scorebug_embed - embed post runners: {embed}') ai_note = curr_play.ai_note logging.info(f'gameplay_models - Game.get_scorebug_embed - ai_note: {ai_note}') if len(ai_note) > 0: gm_name = self.home_team.gmname if self.ai_team == 'home' else self.away_team.gmname embed.add_field(name=f'{gm_name} will...', value=ai_note, inline=False) + else: + embed.add_field(name=' ', value=' ', inline=False) + + if full_length: + embed.add_field( + name=f'{self.away_team.abbrev} Lineup', + value=self.team_lineup(session, self.away_team) + ) + embed.add_field( + name=f'{self.home_team.abbrev} Lineup', + value=self.team_lineup(session, self.home_team) + ) else: embed.add_field( - name='Game State', - value='No plays found for this game', - inline=False + name=f'{self.away_team.abbrev} Lineup', + value=self.team_lineup(session, self.away_team) + ) + embed.add_field( + name=f'{self.home_team.abbrev} Lineup', + value=self.team_lineup(session, self.home_team) ) return embed @@ -252,13 +268,20 @@ class Game(SQLModel, table=True): session.commit() session.refresh(new_play) - new_play.init_ai() + new_play.init_ai(session) return new_play - # @property - # def game_prop(self) -> str: - # return f'Game {self.id} / Week {self.week_num} / Type {self.game_type}' + def team_lineup(self, session: Session, team: Team) -> str: + all_lineups = session.exec(select(Lineup).where(Lineup.team == team, Lineup.game == self).order_by(Lineup.batting_order)).all() + + lineup_val = '' + for line in all_lineups: + lineup_val += f'{line.batting_order}. {line.player.name_card_link("batting" if line.position != "P" else "pitching")} {line.position}\n' + + return lineup_val + + class ManagerAi(ManagerAiBase, table=True): plays: list['Play'] = Relationship(back_populates='managerai') @@ -508,7 +531,7 @@ class PlayBase(SQLModel): batter_id: int = Field(foreign_key='lineup.id') pitcher_id: int = Field(foreign_key='lineup.id') on_base_code: int = Field(default=0) - inning_half: str = Field(default='away') + inning_half: str = Field(default='top') inning_num: int = Field(default=1, ge=1) batting_order: int = Field(default=1, ge=1, le=9) starting_outs: int = Field(default=0, ge=0, le=2) @@ -608,7 +631,7 @@ class Play(PlayBase, table=True): if id > 3 or id < 1: self.managerai_id = 1 else: - self.managerai = id + self.managerai_id = id session.add(self) session.commit() @@ -621,13 +644,13 @@ class Play(PlayBase, table=True): first_base = unoccupied if not self.on_first else occupied second_base = unoccupied if not self.on_second else occupied third_base = unoccupied if not self.on_third else occupied - half = '▲' if self.inning_half == 'Top' else '▼' + half = '▲' if self.inning_half == 'top' else '▼' if self.game.active: inning = f'{half} {self.inning_num}' outs = f'{self.starting_outs} Out{"s" if self.starting_outs != 1 else ""}' else: - inning = f'F/{self.inning_num if self.inning_half == "Bot" else self.inning_num - 1}' + inning = f'F/{self.inning_num if self.inning_half == "bot" else self.inning_num - 1}' outs = '' game_string = f'```\n' \ diff --git a/tests/gameplay_models/test_game_model.py b/tests/gameplay_models/test_game_model.py index 1ce1c69..d3ff331 100644 --- a/tests/gameplay_models/test_game_model.py +++ b/tests/gameplay_models/test_game_model.py @@ -3,7 +3,7 @@ from sqlalchemy import delete as sadelete from sqlalchemy.sql.functions import sum, count from sqlmodel import Session, delete -from in_game.gameplay_models import Game, Lineup, GameCardsetLink, select +from in_game.gameplay_models import Game, Lineup, GameCardsetLink, Play, select from in_game.gameplay_queries import get_channel_game_or_none, get_active_games_by_team from factory import session_fixture @@ -114,6 +114,11 @@ def test_get_scorebug(session: Session): assert scorebug.title == 'CornBelters @ Black Bears - Minor League' assert scorebug.color.value == int('a6ce39', 16) + game_3 = session.get(Game, 3) + scorebug = game_3.get_scorebug_embed(session) + + assert '0 Outs' in scorebug.fields[0].value + def test_sum_function(session: Session): """ @@ -131,3 +136,23 @@ def test_sum_function(session: Session): print(f'sum: {one_result[0]} / count: {one_result[1]}') assert False == False + + +def test_initialize_play(session: Session): + game_1 = session.get(Game, 1) + game_3 = session.get(Game, 3) + g1_play = game_1.initialize_play(session) + + assert game_1.id == 1 + + play_count = session.exec(select(Play.id)).all() + + assert len(play_count) == 2 + + g3_play = game_3.initialize_play(session) + play_count = session.exec(select(Play.id)).all() + + assert g3_play.play_num == 1 + assert g3_play.starting_outs == 0 + assert len(play_count) == 3 + diff --git a/tests/gameplay_models/test_play_model.py b/tests/gameplay_models/test_play_model.py index 9a7c4f7..cc76bf2 100644 --- a/tests/gameplay_models/test_play_model.py +++ b/tests/gameplay_models/test_play_model.py @@ -37,7 +37,7 @@ def test_scorebug_ascii(session: Session): session.add(new_play) session.commit() - assert new_play.scorebug_ascii == '```\nNCB3 0 ○ ▼ 6\n WV4 0 ○ ○ 1 Out\n```' + assert new_play.scorebug_ascii == '```\nNCB3 0 ○ ▲ 6\n WV4 0 ○ ○ 1 Out\n```' # TODO: test get_ai_note \ No newline at end of file