Refactor /substitution to /substitute pitcher and batter

This commit is contained in:
Cal Corum 2023-10-31 00:17:46 -05:00
parent c10fc7c22f
commit b941f1641e
3 changed files with 71 additions and 118 deletions

View File

@ -944,82 +944,8 @@ class Gameplay(commands.Cog):
if comp_play: if comp_play:
complete_play(this_play.id) complete_play(this_play.id)
# @commands.command(name='tl')
# @commands.is_owner()
# async def test_lineup_command(self, ctx, team_abbrev: str):
# t_query = await db_get('teams', params=[('abbrev', team_abbrev)])
# if t_query['count'] > 0:
# team = t_query['teams'][0]
# await ctx.send(f'Pulling a lineup for the {team["lname"]}...')
# lineups = ai_manager.build_lineup(team, 69420, 'l', 'minor-league')
# l_output = ''
# for line in lineups:
# l_output += f'{line["batting_order"]} - {line["player_name"]} - {line["position"]}\n'
# await ctx.send(f'Lineups:\n\n{l_output}')
# else:
# await ctx.send(f'No team found with abbrev {team_abbrev}')
#
# @commands.command(name='tr')
# @commands.is_owner()
# async def test_reliever_command(self, ctx, game_id: int):
# this_game = get_one_game(game_id=game_id)
# ai_id = this_game.away_team_id if this_game.ai_team == 'away' else this_game.home_team_id
# ai_team = await db_get('teams', object_id=ai_id)
# used_pitchers = await get_team_lineups(
# game_id=game_id, team_id=ai_team['id'], inc_inactive=True, pitchers_only=True, as_string=False
# )
# reliever = ai_manager.get_relief_pitcher(get_current_play(game_id), ai_team, used_pitchers)
# await ctx.send(f'Reliever selected:\n\n{reliever}')
group_new_game = app_commands.Group(name='new-game', description='Start a new baseball game') group_new_game = app_commands.Group(name='new-game', description='Start a new baseball game')
# @group_new_game.command(name='sba', description='Start a new SBa league game')
# @commands.has_any_role(SBA_PLAYERS_ROLE_NAME)
# async def new_game_command(
# self, interaction: discord.Interaction, away_team_abbrev: str, home_team_abbrev: str, week_num: int,
# game_num: int):
# await interaction.response.defer()
#
# conflict = get_one_game(channel_id=interaction.channel.id, active=True)
# if conflict:
# await interaction.edit_original_response(
# content=f'Ope. There is already a game going on in this channel. Please wait for it to complete '
# f'before starting a new one.')
# return
#
# away_team = get_sba_team(away_team_abbrev)
# home_team = get_sba_team(home_team_abbrev)
# for x in [away_team, home_team]:
# conflict = count_team_games(x['id'])
# if conflict['count']:
# await interaction.edit_original_response(
# content=f'Ope. The {x["sname"]} are already playing over in '
# f'{interaction.guild.get_channel(conflict["games"][0]["channel_id"]).mention}'
# )
# return
#
# if interaction.user.id not in [away_team['gmid'], away_team['gmid2'], home_team['gmid'], home_team['gmid2']]:
# await interaction.edit_original_response(
# content='You can only start a new game if you GM one of the teams.'
# )
# return
#
# post_game({
# 'away_team_id': away_team['id'],
# 'home_team_id': home_team['id'],
# 'season': SBA_SEASON,
# 'week_num': week_num,
# 'game_num': game_num,
# 'channel_id': interaction.channel.id,
# 'active': True,
# 'is_pd': False,
# })
# logging.info(f'game is posted!')
#
# await interaction.edit_original_response(
# content=f'The game is set! Go ahead and set lineups with `/setlineup`'
# )
@group_new_game.command(name='mlb-campaign', description='Start a new MLB Campaign game against an AI') @group_new_game.command(name='mlb-campaign', description='Start a new MLB Campaign game against an AI')
@app_commands.describe( @app_commands.describe(
sp_card_id='Light gray number to the left of the pitcher\'s name on your depth chart') sp_card_id='Light gray number to the left of the pitcher\'s name on your depth chart')
@ -2571,69 +2497,46 @@ class Gameplay(commands.Cog):
await ctx.send(f'Got it!') await ctx.send(f'Got it!')
@app_commands.command( group_substitution = app_commands.Group(name='substitute', description='Make a substitution in active game')
name='substitution',
description='Make a lineup substitution; Player Name for SBa games / Card ID for PD games' @group_substitution.command(name='batter', description='Make a batter substitution')
)
@app_commands.describe( @app_commands.describe(
order_number='Batting order of new player; 10 for pitchers if there is a DH', batting_order='Batting order of new player',
new_player='For PD game: enter the Card ID (a number); or SBa game: enter the Player Name') new_player='Enter the Card ID (a number)')
@commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME) @commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME)
async def substitution_command( async def sub_batter_command(
self, interaction: discord.Interaction, new_player: str, order_number: Literal[ self, interaction: discord.Interaction, new_player: int, batting_order: Literal[
'this-spot', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'this-spot', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
new_pos: Literal['P', 'C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF', 'DH', 'PH', 'PR']): new_pos: Literal['P', 'C', '1B', '2B', '3B', 'SS', 'LF', 'CF', 'RF', 'DH', 'PH', 'PR']):
this_game, owner_team, this_play = await self.checks_log_interaction(interaction) this_game, owner_team, this_play = await self.checks_log_interaction(interaction)
if False in (this_game, owner_team, this_play): if False in (this_game, owner_team, this_play):
return return
try: this_card = await db_get(f'cards', object_id=int(new_player))
if this_game.is_pd: if this_card["team"]["id"] != owner_team['id']:
this_card = await db_get(f'cards', object_id=int(new_player)) raise SyntaxError(f'Easy there, champ. Looks like card ID {new_player} belongs to the '
if this_card["team"]["id"] != owner_team['id']: f'{this_card["team"]["sname"]}. Try again with only cards you own.')
raise SyntaxError(f'Easy there, champ. Looks like card ID {new_player} belongs to the ' player_id = this_card['player']['player_id']
f'{this_card["team"]["sname"]}. Try again with only cards you own.') card_id = new_player
player_id = this_card['player']['player_id']
card_id = new_player
else:
this_player = get_sba_player(new_player, season=SBA_SEASON)
if this_player['team']['id'] != owner_team['id']:
raise SyntaxError(f'Easy there, champ. Looks like {new_player} is on '
f'{this_player["team"]["sname"]}. Try again with only your own players.')
player_id = this_player['id']
card_id = None
except Exception as e:
logging.error(f'Game {this_game} - Could not find player {new_player}')
if this_game.is_pd:
await interaction.edit_original_response(
content=f'I could not find card_id {new_player}.'
)
else:
await interaction.edit_original_response(
content=f'I could not find {new_player.title()}.'
)
return
if this_game.game_type in ['major-league', 'hall-of-fame']: if this_game.game_type in ['major-league', 'hall-of-fame', 'tens']:
legality = await db_post(f'cards/legal-check/ranked?card_id={new_player}') legality = await db_post(f'cards/legal-check/{this_game.game_type}?card_id={new_player}')
if legality['count'] > 0: if legality['count'] > 0:
il_string = "\n- ".join(legality['bad_cards']) il_string = "\n- ".join(legality['bad_cards'])
await interaction.edit_original_response( await interaction.edit_original_response(
content=f'It looks like this is a Ranked Legal game and I see the following cards as illegal. ' content=f'It looks like this is a {this_game.game_type.replace("-", " ").title} game and I see '
f'Please adjust your lineup and re-submit!\n\n' f'the following cards as illegal. Please take another look and re-submit!\n\n'
f'- {il_string}' f'- {il_string}'
) )
return return
this_play = get_current_play(this_game.id) batting_order = int(batting_order) if batting_order != 'this-spot' else this_play.batting_order
batting_order = int(order_number) if order_number != 'this-spot' else this_play.batting_order
# Check for simple position change # Check for simple position change
in_lineup = get_one_lineup(this_game.id, team_id=owner_team['id'], active=True, batting_order=batting_order) in_lineup = get_one_lineup(this_game.id, team_id=owner_team['id'], active=True, batting_order=batting_order)
if in_lineup.card_id == int(card_id): if in_lineup.card_id == int(card_id):
post_pos = patch_lineup(in_lineup.id, position=new_pos) post_pos = patch_lineup(in_lineup.id, position=new_pos)
else: else:
curr_play = get_current_play(this_game.id)
this_lineup = { this_lineup = {
'game_id': this_game.id, 'game_id': this_game.id,
'team_id': owner_team['id'], 'team_id': owner_team['id'],
@ -2641,7 +2544,7 @@ class Gameplay(commands.Cog):
'card_id': card_id, 'card_id': card_id,
'position': new_pos.upper(), 'position': new_pos.upper(),
'batting_order': batting_order, 'batting_order': batting_order,
'after_play': curr_play.play_num - 1 if curr_play else 0 'after_play': this_play.play_num - 1 if this_play else 0
} }
make_sub(this_lineup) make_sub(this_lineup)
@ -2651,6 +2554,54 @@ class Gameplay(commands.Cog):
embed=await self.get_game_state_embed(this_game) embed=await self.get_game_state_embed(this_game)
) )
@group_substitution.command(name='pitcher', description='Make a pitching change')
@app_commands.describe(
new_player='Enter the Card ID (a number)',
batting_order='Only enter this if you are forfeiting the DH')
@commands.has_any_role(SBA_PLAYERS_ROLE_NAME)
async def sub_pitcher_command(
self, interaction: discord.Interaction, new_player: int,
batting_order: Literal['this-spot', '1', '2', '3', '4', '5', '6', '7', '8', '9'] = None):
this_game, owner_team, this_play = await self.checks_log_interaction(interaction)
if False in (this_game, owner_team, this_play):
return
if this_play.pitcher.team_id != owner_team['id']:
await interaction.edit_original_response(
content='It looks like your team is batting right now - please make this sub once you take the field.')
return
this_card = await db_get(f'cards', object_id=int(new_player))
if this_card["team"]["id"] != owner_team['id']:
raise SyntaxError(f'Easy there, champ. Looks like card ID {new_player} belongs to the '
f'{this_card["team"]["sname"]}. Try again with only cards you own.')
player_id = this_card['player']['player_id']
card_id = new_player
old_pit_order = this_play.pitcher.batting_order
if batting_order is None:
batting_order = old_pit_order
else:
batting_order = int(batting_order)
this_lineup = {
'game_id': this_game.id,
'team_id': owner_team['id'],
'player_id': player_id,
'card_id': card_id,
'position': 'P',
'batting_order': batting_order,
'after_play': this_play.play_num - 1 if this_play else 0
}
make_sub(this_lineup)
if old_pit_order != batting_order:
patch_lineup(this_play.pitcher.id, active=False)
await interaction.edit_original_response(
content=None,
embed=await self.get_game_state_embed(this_game)
)
@commands.hybrid_command(name='gamestate', help='Post the current game state', aliases=['gs']) @commands.hybrid_command(name='gamestate', help='Post the current game state', aliases=['gs'])
@commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME) @commands.has_any_role(SBA_PLAYERS_ROLE_NAME, PD_PLAYERS_ROLE_NAME)
async def game_state_command(self, ctx: commands.Context, include_lineups: bool = True): async def game_state_command(self, ctx: commands.Context, include_lineups: bool = True):

View File

@ -745,7 +745,7 @@ def make_sub(lineup_dict: dict):
# Check current play for updates # Check current play for updates
if curr_play: if curr_play:
if not curr_play.pitcher and curr_play.batter.team_id != return_value.team_id: if (not curr_play.pitcher and curr_play.batter.team_id != return_value.team_id) or return_value.position == 'P':
patch_play(curr_play.id, pitcher_id=return_value.id) patch_play(curr_play.id, pitcher_id=return_value.id)
if subbed_player: if subbed_player:

View File

@ -3145,5 +3145,7 @@ def player_bcard(this_player):
return this_player['image'] return this_player['image']
elif this_player['image2'] is not None and 'batting' in this_player['image2']: elif this_player['image2'] is not None and 'batting' in this_player['image2']:
return this_player['image2'] return this_player['image2']
# elif this_player['image'] is not None and 'pitching' in this_player['image']:
# return PITCHER_BATTING_CARD
else: else:
return this_player['image'] return this_player['image']