Added play table
This commit is contained in:
parent
46860fb3c0
commit
5fc89b5ce4
@ -11,7 +11,8 @@ from api_calls import db_get
|
|||||||
from command_logic.gameplay import get_lineups_from_sheets
|
from command_logic.gameplay import get_lineups_from_sheets
|
||||||
from helpers import PD_PLAYERS_ROLE_NAME, team_role, user_has_role, random_gif, random_from_list
|
from helpers import PD_PLAYERS_ROLE_NAME, team_role, user_has_role, random_gif, random_from_list
|
||||||
|
|
||||||
from in_game import ai_manager
|
# from in_game import ai_manager
|
||||||
|
from in_game.ai_manager import get_starting_pitcher, get_starting_lineup
|
||||||
from in_game.game_helpers import PUBLIC_FIELDS_CATEGORY_NAME, legal_check
|
from in_game.game_helpers import PUBLIC_FIELDS_CATEGORY_NAME, legal_check
|
||||||
from in_game.gameplay_models import Lineup, Session, engine, player_description, select, Game
|
from in_game.gameplay_models import Lineup, Session, engine, player_description, select, Game
|
||||||
from in_game.gameplay_queries import get_channel_game_or_none, get_active_games_by_team, get_game_lineups, get_team_or_none, get_card_or_none
|
from in_game.gameplay_queries import get_channel_game_or_none, get_active_games_by_team, get_game_lineups, get_team_or_none, get_card_or_none
|
||||||
@ -183,7 +184,7 @@ class Gameplay(commands.Cog):
|
|||||||
await interaction.edit_original_response(
|
await interaction.edit_original_response(
|
||||||
content=f'{ai_team.gmname} is looking for a SP to counter {human_sp_card.player.name}...'
|
content=f'{ai_team.gmname} is looking for a SP to counter {human_sp_card.player.name}...'
|
||||||
)
|
)
|
||||||
ai_sp_lineup = await ai_manager.get_starting_pitcher(
|
ai_sp_lineup = await get_starting_pitcher(
|
||||||
session,
|
session,
|
||||||
ai_team,
|
ai_team,
|
||||||
this_game,
|
this_game,
|
||||||
@ -198,7 +199,7 @@ class Gameplay(commands.Cog):
|
|||||||
final_message = await interaction.channel.send(
|
final_message = await interaction.channel.send(
|
||||||
content=f'{ai_team.gmname} is filling out the {ai_team.sname} lineup card...'
|
content=f'{ai_team.gmname} is filling out the {ai_team.sname} lineup card...'
|
||||||
)
|
)
|
||||||
batter_lineups = await ai_manager.get_starting_lineup(
|
batter_lineups = await get_starting_lineup(
|
||||||
session,
|
session,
|
||||||
team=ai_team,
|
team=ai_team,
|
||||||
game=this_game,
|
game=this_game,
|
||||||
|
|||||||
@ -54,7 +54,6 @@ class Team(TeamBase, table=True):
|
|||||||
# home_games: list['Game'] = Relationship(back_populates='home_team')
|
# home_games: list['Game'] = Relationship(back_populates='home_team')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Game(SQLModel, table=True):
|
class Game(SQLModel, table=True):
|
||||||
id: int | None = Field(default=None, primary_key=True)
|
id: int | None = Field(default=None, primary_key=True)
|
||||||
away_team_id: int = Field(foreign_key='team.id')
|
away_team_id: int = Field(foreign_key='team.id')
|
||||||
@ -93,6 +92,7 @@ class Game(SQLModel, table=True):
|
|||||||
sa_relationship_kwargs=dict(foreign_keys="[Game.home_team_id]")
|
sa_relationship_kwargs=dict(foreign_keys="[Game.home_team_id]")
|
||||||
)
|
)
|
||||||
lineups: list['Lineup'] = Relationship(back_populates='game', cascade_delete=True)
|
lineups: list['Lineup'] = Relationship(back_populates='game', cascade_delete=True)
|
||||||
|
plays: list['Play'] = Relationship(back_populates='game', cascade_delete=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cardset_param_string(self) -> str:
|
def cardset_param_string(self) -> str:
|
||||||
@ -110,6 +110,11 @@ class Game(SQLModel, table=True):
|
|||||||
title=f'{self.away_team_id} @ {self.home_team_id}',
|
title=f'{self.away_team_id} @ {self.home_team_id}',
|
||||||
color=int('a6ce39', 16)
|
color=int('a6ce39', 16)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def current_play(self, session: Session):
|
||||||
|
this_play = session.exec(select(Play).where(Play.game == self).order_by(Play.id.desc()).limit(1)).one()
|
||||||
|
return this_play
|
||||||
|
|
||||||
# @property
|
# @property
|
||||||
# def game_prop(self) -> str:
|
# def game_prop(self) -> str:
|
||||||
# return f'Game {self.id} / Week {self.week_num} / Type {self.game_type}'
|
# return f'Game {self.id} / Week {self.week_num} / Type {self.game_type}'
|
||||||
@ -213,7 +218,6 @@ class Card(CardBase, table=True):
|
|||||||
lineups: list['Lineup'] = Relationship(back_populates='card', cascade_delete=True)
|
lineups: list['Lineup'] = Relationship(back_populates='card', cascade_delete=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Lineup(SQLModel, table=True):
|
class Lineup(SQLModel, table=True):
|
||||||
id: int | None = Field(default=None, primary_key=True)
|
id: int | None = Field(default=None, primary_key=True)
|
||||||
position: str = Field(index=True)
|
position: str = Field(index=True)
|
||||||
@ -236,6 +240,107 @@ class Lineup(SQLModel, table=True):
|
|||||||
card: Card = Relationship(back_populates='lineups')
|
card: Card = Relationship(back_populates='lineups')
|
||||||
|
|
||||||
|
|
||||||
|
class PlayBase(SQLModel):
|
||||||
|
id: int | None = Field(default=None, primary_key=True)
|
||||||
|
game_id: int = Field(foreign_key='game.id')
|
||||||
|
play_num: int
|
||||||
|
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_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)
|
||||||
|
away_score: int = Field(default=0)
|
||||||
|
home_score: int = Field(default=0)
|
||||||
|
batter_pos: str | None = Field(default=None)
|
||||||
|
in_pow: bool = Field(default=False)
|
||||||
|
|
||||||
|
on_first_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
on_first_final: int | None = Field(default=None)
|
||||||
|
on_second_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
on_second_final: int | None = Field(default=None)
|
||||||
|
on_third_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
on_third_final: int | None = Field(default=None)
|
||||||
|
batter_final: int | None = Field(default=None)
|
||||||
|
|
||||||
|
pa: int = Field(default=0)
|
||||||
|
ab: int = Field(default=0)
|
||||||
|
run: int = Field(default=0)
|
||||||
|
e_run: int = Field(default=0)
|
||||||
|
hit: int = Field(default=0)
|
||||||
|
rbi: int = Field(default=0)
|
||||||
|
double: int = Field(default=0)
|
||||||
|
triple: int = Field(default=0)
|
||||||
|
homerun: int = Field(default=0)
|
||||||
|
bb: int = Field(default=0)
|
||||||
|
so: int = Field(default=0)
|
||||||
|
hbp: int = Field(default=0)
|
||||||
|
sac: int = Field(default=0)
|
||||||
|
ibb: int = Field(default=0)
|
||||||
|
gidp: int = Field(default=0)
|
||||||
|
bphr: int = Field(default=0)
|
||||||
|
bpfo: int = Field(default=0)
|
||||||
|
bp1b: int = Field(default=0)
|
||||||
|
bplo: int = Field(default=0)
|
||||||
|
sb: int = Field(default=0)
|
||||||
|
cs: int = Field(default=0)
|
||||||
|
outs: int = Field(default=0)
|
||||||
|
|
||||||
|
wpa: float = Field(default=0)
|
||||||
|
re24: float = Field(default=0)
|
||||||
|
|
||||||
|
catcher_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
defender_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
runner_id: int | None = Field(default=None, foreign_key='lineup.id')
|
||||||
|
|
||||||
|
check_pos: str | None = Field(default=None)
|
||||||
|
error: int = Field(default=0)
|
||||||
|
wild_pitch: int = Field(default=0)
|
||||||
|
passed_ball: int = Field(default=0)
|
||||||
|
pick_off: int = Field(default=0)
|
||||||
|
balk: int = Field(default=0)
|
||||||
|
complete: bool = Field(default=False)
|
||||||
|
locked: bool = Field(default=False)
|
||||||
|
is_go_ahead: bool = Field(default=False)
|
||||||
|
is_tied: bool = Field(default=False)
|
||||||
|
is_new_inning: bool = Field(default=False)
|
||||||
|
|
||||||
|
def ai_run_diff(self):
|
||||||
|
if self.game.ai_team == 'away':
|
||||||
|
return self.away_score - self.home_score
|
||||||
|
else:
|
||||||
|
return self.home_score - self.away_score
|
||||||
|
|
||||||
|
|
||||||
|
class Play(PlayBase, table=True):
|
||||||
|
game: Game = Relationship(back_populates='plays')
|
||||||
|
batter: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.batter_id]")
|
||||||
|
)
|
||||||
|
pitcher: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.pitcher_id]")
|
||||||
|
)
|
||||||
|
on_first: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.on_first_id]")
|
||||||
|
)
|
||||||
|
on_second: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.on_second_id]")
|
||||||
|
)
|
||||||
|
on_third: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.on_third_id]")
|
||||||
|
)
|
||||||
|
catcher: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.catcher_id]")
|
||||||
|
)
|
||||||
|
defender: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.defender_id]")
|
||||||
|
)
|
||||||
|
runner: Lineup = Relationship(
|
||||||
|
sa_relationship_kwargs=dict(foreign_keys="[Play.runner_id]")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
BEGIN DEVELOPMENT HELPERS
|
BEGIN DEVELOPMENT HELPERS
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
from api_calls import db_get, db_post
|
from api_calls import db_get, db_post
|
||||||
from in_game.gameplay_models import CACHE_LIMIT, Card, CardBase, Lineup, Player, PlayerBase, Session, Team, TeamBase, select, or_, Game
|
from in_game.gameplay_models import CACHE_LIMIT, Card, CardBase, Lineup, Player, PlayerBase, Session, Team, TeamBase, select, or_, Game, Play
|
||||||
|
|
||||||
|
|
||||||
def get_games_by_channel(session: Session, channel_id: int) -> list[Game]:
|
def get_games_by_channel(session: Session, channel_id: int) -> list[Game]:
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from sqlmodel import Session, SQLModel, create_engine
|
|||||||
from sqlmodel.pool import StaticPool
|
from sqlmodel.pool import StaticPool
|
||||||
|
|
||||||
from typing import Literal
|
from typing import Literal
|
||||||
from in_game.gameplay_models import Card, Cardset, Game, GameCardsetLink, Lineup, Team, Player
|
from in_game.gameplay_models import Card, Cardset, Game, GameCardsetLink, Lineup, Play, Team, Player
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name='session')
|
@pytest.fixture(name='session')
|
||||||
@ -147,6 +147,27 @@ def session_fixture():
|
|||||||
for lineup in all_lineups:
|
for lineup in all_lineups:
|
||||||
session.add(lineup)
|
session.add(lineup)
|
||||||
|
|
||||||
|
game_1_play_1 = Play(
|
||||||
|
game=game_1,
|
||||||
|
play_num=1,
|
||||||
|
batter=all_lineups[0],
|
||||||
|
batter_pos=all_lineups[0].position,
|
||||||
|
pitcher=all_lineups[19],
|
||||||
|
pa=1,
|
||||||
|
so=1
|
||||||
|
)
|
||||||
|
game_1_play_2 = Play(
|
||||||
|
game=game_1,
|
||||||
|
play_num=2,
|
||||||
|
batter=all_lineups[1],
|
||||||
|
batter_pos=all_lineups[1].position,
|
||||||
|
pitcher=all_lineups[19],
|
||||||
|
starting_outs=1
|
||||||
|
)
|
||||||
|
|
||||||
|
session.add(game_1_play_1)
|
||||||
|
session.add(game_1_play_2)
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
yield session
|
yield session
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from sqlalchemy import delete as sadelete
|
from sqlalchemy import delete as sadelete
|
||||||
|
from sqlalchemy.sql.functions import sum, count
|
||||||
from sqlmodel import Session, delete
|
from sqlmodel import Session, delete
|
||||||
|
|
||||||
from in_game.gameplay_models import Game, Lineup, GameCardsetLink, select
|
from in_game.gameplay_models import Game, Lineup, GameCardsetLink, select
|
||||||
@ -58,10 +59,10 @@ def test_games_by_channel(session: Session):
|
|||||||
session.add(game_2)
|
session.add(game_2)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
with pytest.raises(LookupError) as exc_info:
|
with pytest.raises(Exception) as exc_info:
|
||||||
get_channel_game_or_none(session, 5678)
|
get_channel_game_or_none(session, 5678)
|
||||||
|
|
||||||
assert str(exc_info) == "<ExceptionInfo LookupError('Too many games found in get_channel_game_or_none') tblen=2>"
|
assert str(exc_info) == "<ExceptionInfo Exception('Too many games found in get_channel_game_or_none') tblen=2>"
|
||||||
|
|
||||||
game_3 = session.get(Game, 3)
|
game_3 = session.get(Game, 3)
|
||||||
game_2.active = False
|
game_2.active = False
|
||||||
@ -112,3 +113,21 @@ def test_get_scorebug(session: Session):
|
|||||||
|
|
||||||
assert scorebug.title == '31 @ 400'
|
assert scorebug.title == '31 @ 400'
|
||||||
assert scorebug.color.value == int('a6ce39', 16)
|
assert scorebug.color.value == int('a6ce39', 16)
|
||||||
|
|
||||||
|
|
||||||
|
def test_sum_function(session: Session):
|
||||||
|
"""
|
||||||
|
Testing out the sqlalchemy functions
|
||||||
|
"""
|
||||||
|
st = select(
|
||||||
|
sum(Game.away_team_id).label('nice'),
|
||||||
|
count(Game.active)
|
||||||
|
)
|
||||||
|
print(f'sql: {st}')
|
||||||
|
result = session.exec(st)
|
||||||
|
print(f'result: {result}')
|
||||||
|
one_result = result.one()
|
||||||
|
print(f'one: {one_result}')
|
||||||
|
print(f'sum: {one_result[0]} / count: {one_result[1]}')
|
||||||
|
|
||||||
|
assert False == False
|
||||||
|
|||||||
23
tests/gameplay_models/test_play_model.py
Normal file
23
tests/gameplay_models/test_play_model.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
from sqlmodel import Session, select
|
||||||
|
|
||||||
|
from in_game.gameplay_models import Play, Game
|
||||||
|
from factory import session_fixture
|
||||||
|
|
||||||
|
|
||||||
|
def test_create_play(session: Session):
|
||||||
|
all_plays = session.exec(select(Play)).all()
|
||||||
|
|
||||||
|
assert len(all_plays) == 2
|
||||||
|
|
||||||
|
play_1 = session.get(Play, 1)
|
||||||
|
|
||||||
|
assert play_1.game_id == 1
|
||||||
|
assert play_1.pa == 1
|
||||||
|
assert play_1.pitcher_id == 20
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_current_play(session: Session):
|
||||||
|
game_1 = session.get(Game, 1)
|
||||||
|
curr_play = game_1.current_play(session)
|
||||||
|
|
||||||
|
assert curr_play.play_num == 2
|
||||||
Loading…
Reference in New Issue
Block a user