Updated scorebug embed

Added play initialization
This commit is contained in:
Cal Corum 2024-10-24 17:14:11 -05:00
parent 79efceb6dd
commit ee685f1415
4 changed files with 75 additions and 21 deletions

View File

@ -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')

View File

@ -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' \

View File

@ -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

View File

@ -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