ask_confirm bug fix
manual_end_game complete
This commit is contained in:
parent
7a718d45f0
commit
a4af7652fc
@ -8,7 +8,7 @@ from discord.ext import commands, tasks
|
|||||||
import pygsheets
|
import pygsheets
|
||||||
|
|
||||||
from api_calls import db_get
|
from api_calls import db_get
|
||||||
from command_logic.logic_gameplay import advance_runners, bunts, chaos, complete_game, doubles, flyballs, get_lineups_from_sheets, checks_log_interaction, complete_play, get_scorebug_embed, hit_by_pitch, homeruns, is_game_over, popouts, show_defense_cards, singles, strikeouts, triples, undo_play, update_game_settings, walks
|
from command_logic.logic_gameplay import advance_runners, bunts, chaos, complete_game, doubles, flyballs, get_lineups_from_sheets, checks_log_interaction, complete_play, get_scorebug_embed, hit_by_pitch, homeruns, is_game_over, manual_end_game, popouts, show_defense_cards, singles, strikeouts, triples, undo_play, update_game_settings, walks
|
||||||
from dice import ab_roll
|
from dice import ab_roll
|
||||||
from exceptions import GameNotFoundException, TeamNotFoundException, PlayNotFoundException, GameException, log_exception
|
from exceptions import GameNotFoundException, TeamNotFoundException, PlayNotFoundException, GameException, log_exception
|
||||||
from helpers import DEFENSE_LITERAL, PD_PLAYERS_ROLE_NAME, get_channel, team_role, user_has_role, random_gif, random_from_list
|
from helpers import DEFENSE_LITERAL, PD_PLAYERS_ROLE_NAME, get_channel, team_role, user_has_role, random_gif, random_from_list
|
||||||
@ -448,6 +448,15 @@ class Gameplay(commands.Cog):
|
|||||||
auto_roll=auto_roll
|
auto_roll=auto_roll
|
||||||
))
|
))
|
||||||
|
|
||||||
|
@app_commands.command(name='end-game', description='End the current game in this channel')
|
||||||
|
@app_commands.checks.has_any_role(PD_PLAYERS_ROLE_NAME)
|
||||||
|
async def end_game_command(self, interaction: discord.Interaction):
|
||||||
|
with Session(engine) as session:
|
||||||
|
this_game, owner_team, this_play = await checks_log_interaction(session, interaction, command_name='end-game')
|
||||||
|
|
||||||
|
# await interaction.edit_original_response(content='Let\'s see, I didn\'t think this game was over...')
|
||||||
|
await manual_end_game(session, interaction, this_game, current_play=this_play)
|
||||||
|
|
||||||
group_log = app_commands.Group(name='log', description='Log a play in this channel\'s game')
|
group_log = app_commands.Group(name='log', description='Log a play in this channel\'s game')
|
||||||
|
|
||||||
@group_log.command(name='flyball', description='Flyballs: a, b, ballpark, bq, c')
|
@group_log.command(name='flyball', description='Flyballs: a, b, ballpark, bq, c')
|
||||||
|
|||||||
@ -14,7 +14,7 @@ from in_game.game_helpers import legal_check
|
|||||||
from in_game.gameplay_models import BattingCard, Game, Lineup, PositionRating, Team, Play
|
from in_game.gameplay_models import BattingCard, Game, Lineup, PositionRating, Team, Play
|
||||||
from in_game.gameplay_queries import get_and_cache_position, get_card_or_none, get_channel_game_or_none, get_db_ready_decisions, get_db_ready_plays, get_last_team_play, get_one_lineup, get_player_id_from_dict, get_player_name_from_dict, get_player_or_none, get_sorted_lineups, get_team_or_none, get_players_last_pa, post_game_rewards
|
from in_game.gameplay_queries import get_and_cache_position, get_card_or_none, get_channel_game_or_none, get_db_ready_decisions, get_db_ready_plays, get_last_team_play, get_one_lineup, get_player_id_from_dict, get_player_name_from_dict, get_player_or_none, get_sorted_lineups, get_team_or_none, get_players_last_pa, post_game_rewards
|
||||||
from utilities.buttons import ButtonOptions, Confirm, ask_confirm
|
from utilities.buttons import ButtonOptions, Confirm, ask_confirm
|
||||||
from utilities.dropdown import DropdownOptions, DropdownView, SelectViewDefense
|
from utilities.dropdown import DropdownView, SelectViewDefense
|
||||||
from utilities.embeds import image_embed
|
from utilities.embeds import image_embed
|
||||||
from utilities.pages import Pagination
|
from utilities.pages import Pagination
|
||||||
|
|
||||||
@ -1618,7 +1618,7 @@ async def get_game_summary_embed(session: Session, interaction: discord.Interact
|
|||||||
|
|
||||||
if len(poop_string) > 0:
|
if len(poop_string) > 0:
|
||||||
game_embed.add_field(
|
game_embed.add_field(
|
||||||
'Pooper of the Game',
|
name='Pooper of the Game',
|
||||||
value=poop_string,
|
value=poop_string,
|
||||||
inline=False
|
inline=False
|
||||||
)
|
)
|
||||||
@ -1855,3 +1855,100 @@ async def update_game_settings(session: Session, interaction: discord.Interactio
|
|||||||
)
|
)
|
||||||
|
|
||||||
return embed
|
return embed
|
||||||
|
|
||||||
|
|
||||||
|
async def manual_end_game(session: Session, interaction: discord.Interaction, this_game: Game, current_play: Play):
|
||||||
|
logger.info(f'manual_end_game - Game {this_game.id}')
|
||||||
|
GAME_DONE_STRING = 'Okay, it\'s gone. You\'re free to start another one!'
|
||||||
|
GAME_STAYS_STRING = 'No problem, this game will continue!'
|
||||||
|
|
||||||
|
if not is_game_over(current_play):
|
||||||
|
logger.info(f'manual_end_game - game is not over')
|
||||||
|
|
||||||
|
if current_play.inning_num == 1 and current_play.play_num < 3 and 'gauntlet' not in this_game.game_type.lower():
|
||||||
|
logger.info(f'manual_end_game - {this_game.game_type} game just started, asking for confirmation')
|
||||||
|
|
||||||
|
await interaction.edit_original_response(content='Looks like this game just started.')
|
||||||
|
|
||||||
|
cancel_early = await ask_confirm(
|
||||||
|
interaction,
|
||||||
|
'Are you sure you want to cancel it?',
|
||||||
|
label_type='yes',
|
||||||
|
timeout=30,
|
||||||
|
delete_question=False
|
||||||
|
)
|
||||||
|
|
||||||
|
if cancel_early:
|
||||||
|
logger.info(f'{interaction.user.name} is cancelling the game')
|
||||||
|
await interaction.channel.send(content=GAME_DONE_STRING)
|
||||||
|
|
||||||
|
news_ticker = get_channel(interaction, 'pd-network-news')
|
||||||
|
if news_ticker is not None:
|
||||||
|
await news_ticker.send(content=f'{interaction.user.display_name} had dinner plans so had to end their game down in {interaction.channel.mention} early.')
|
||||||
|
|
||||||
|
this_game.active = False
|
||||||
|
session.add(this_game)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info(f'{interaction.user.name} is not cancelling the game')
|
||||||
|
await interaction.channel.send_message(content=GAME_STAYS_STRING)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info(f'manual_end_game - {this_game.game_type} game currently in inning #{current_play.inning_num}, asking for confirmation')
|
||||||
|
|
||||||
|
await interaction.edit_original_response(content='It doesn\'t look like this game isn\'t over, yet. I can end it, but no rewards will be paid out and you will take the L.')
|
||||||
|
|
||||||
|
forfeit_game = await ask_confirm(
|
||||||
|
interaction,
|
||||||
|
'Should I end this game?',
|
||||||
|
label_type='yes',
|
||||||
|
timeout=30,
|
||||||
|
delete_question=False
|
||||||
|
)
|
||||||
|
|
||||||
|
if forfeit_game:
|
||||||
|
logger.info(f'{interaction.user.name} is forfeiting the game')
|
||||||
|
game_data = this_game.model_dump()
|
||||||
|
game_data['home_team_ranking'] = this_game.home_team.ranking
|
||||||
|
game_data['away_team_ranking'] = this_game.away_team.ranking
|
||||||
|
game_data['home_team_value'] = this_game.home_team.team_value
|
||||||
|
game_data['away_team_value'] = this_game.away_team.team_value
|
||||||
|
game_data['away_score'] = current_play.away_score
|
||||||
|
game_data['home_score'] = current_play.home_score
|
||||||
|
game_data['forfeit'] = True
|
||||||
|
|
||||||
|
try:
|
||||||
|
db_game = await db_post('games', payload=game_data)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f'Unable to post forfeited game')
|
||||||
|
|
||||||
|
await interaction.channel.send(content=GAME_DONE_STRING)
|
||||||
|
|
||||||
|
news_ticker = get_channel(interaction, 'pd-network-news')
|
||||||
|
if news_ticker is not None:
|
||||||
|
await news_ticker.send(content=f'{interaction.user.display_name} escorts the {this_game.human_team.sname} out of {interaction.channel.mention} in protest.')
|
||||||
|
|
||||||
|
this_game.active = False
|
||||||
|
session.add(this_game)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info(f'{interaction.user.name} is not forfeiting the game')
|
||||||
|
await interaction.channel.send(content=GAME_STAYS_STRING)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
# else:
|
||||||
|
# logger.info(f'manual_end_game - gauntlet game currently in inning #{current_play.inning_num}, asking for confirmation')
|
||||||
|
|
||||||
|
# await interaction.edit_original_response(content='It doesn\'t look like this game is over, yet. I can end it, but no rewards will be paid out and you will take the L.')
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info(f'manual_end_game - game is over')
|
||||||
|
await complete_game(session, interaction, current_play)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -57,3 +57,11 @@ class PositionNotFoundException(GameException):
|
|||||||
|
|
||||||
class NoPlayerResponseException(GameException):
|
class NoPlayerResponseException(GameException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class MultipleHumanTeamsException(GameException):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NoHumanTeamsException(GameException):
|
||||||
|
pass
|
||||||
|
|||||||
@ -106,8 +106,8 @@ class Game(SQLModel, table=True):
|
|||||||
first_message: str | None = Field(default=None)
|
first_message: str | None = Field(default=None)
|
||||||
ai_team: str | None = Field(default=None)
|
ai_team: str | None = Field(default=None)
|
||||||
game_type: str
|
game_type: str
|
||||||
roll_buttons: bool | None = Field(default=False)
|
roll_buttons: bool | None = Field(default=True)
|
||||||
auto_roll: bool | None = Field(default=True)
|
auto_roll: bool | None = Field(default=False)
|
||||||
|
|
||||||
cardset_links: list[GameCardsetLink] = Relationship(back_populates='game', cascade_delete=True)
|
cardset_links: list[GameCardsetLink] = Relationship(back_populates='game', cascade_delete=True)
|
||||||
away_team: Team = Relationship(
|
away_team: Team = Relationship(
|
||||||
@ -409,6 +409,17 @@ class Game(SQLModel, table=True):
|
|||||||
|
|
||||||
return lineup_val
|
return lineup_val
|
||||||
|
|
||||||
|
@property
|
||||||
|
def human_team(self):
|
||||||
|
if self.home_team.is_ai and not self.away_team.is_ai:
|
||||||
|
return self.away_team
|
||||||
|
elif self.away_team.is_ai and not self.home_team.is_ai:
|
||||||
|
return self.home_team
|
||||||
|
elif self.home_team.is_ai and self.away_team.is_ai:
|
||||||
|
raise NoHumanTeamsException
|
||||||
|
else:
|
||||||
|
raise MultipleHumanTeamsException
|
||||||
|
|
||||||
|
|
||||||
class ManagerAi(ManagerAiBase, table=True):
|
class ManagerAi(ManagerAiBase, table=True):
|
||||||
plays: list['Play'] = Relationship(back_populates='managerai')
|
plays: list['Play'] = Relationship(back_populates='managerai')
|
||||||
|
|||||||
@ -159,21 +159,21 @@ async def ask_confirm(interaction: discord.Interaction, question: str, label_typ
|
|||||||
if custom_cancel_label:
|
if custom_cancel_label:
|
||||||
view.cancel.label = custom_cancel_label
|
view.cancel.label = custom_cancel_label
|
||||||
|
|
||||||
question = await interaction.channel.send(question, view=view)
|
q_message = await interaction.channel.send(question, view=view)
|
||||||
await view.wait()
|
await view.wait()
|
||||||
|
|
||||||
if view.value:
|
if view.value:
|
||||||
if delete_question:
|
if delete_question:
|
||||||
await question.delete()
|
await q_message.delete()
|
||||||
else:
|
else:
|
||||||
await question.edit(content=question, view=None)
|
await q_message.edit(content=question, view=None)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
else:
|
else:
|
||||||
if delete_question:
|
if delete_question:
|
||||||
await question.delete()
|
await q_message.delete()
|
||||||
else:
|
else:
|
||||||
await question.edit(content=question, view=None)
|
await q_message.edit(content=question, view=None)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user