def next_player(update, context): chat = update.effective_chat user = update.effective_user lang_id = Database().get_lang_id(chat.id) translator = Translator(lang_id=lang_id) game = GameStore().get_game(chat.id) try: if user.id != game.get_current_player().user_id: update.callback_query.answer(translator("mp_not_your_turn_callback").format(user.first_name)) return remove_inline_keyboard(update, context) game.next_player() except NoPlayersLeftException: # TODO merge messages update.effective_message.reply_text(translator("dealers_cards_are").format(game.dealer.cardvalue, get_cards_string(game.dealer, lang_id)), parse_mode=ParseMode.HTML) evaluation_string = generate_evaluation_string(game, lang_id) newgame_button = InlineKeyboardButton(text=translator("inline_keyboard_newgame"), callback_data="newgame") keyboard = InlineKeyboardMarkup(inline_keyboard=[[newgame_button]]) update.effective_message.reply_text(evaluation_string, reply_markup=keyboard) game.stop(-1) return players_turn(update, context)
def join_callback(update, context): """ CallbackQueryHandler callback for the 'join' inline button. Adds the executing player to the game of the specific chat """ user = update.effective_user chat = update.effective_chat lang_id = Database().get_lang_id(chat.id) translator = Translator(lang_id=lang_id) game = GameStore().get_game(chat.id) if not is_button_affiliated(update, context, game, lang_id): return try: game.add_player(user.id, user.first_name) update.effective_message.edit_text(text=translator("mp_request_join").format(game.get_player_list()), reply_markup=get_join_keyboard(game.id, lang_id)) update.callback_query.answer(translator("mp_join_callback").format(user.first_name)) # If players are full, replace join keyboard with start keyboard if len(game.players) >= game.MAX_PLAYERS: update.effective_message.edit_reply_markup(reply_markup=get_start_keyboard(lang_id)) except errors.GameAlreadyRunningException: remove_inline_keyboard(update, context) update.callback_query.answer(translator("mp_game_already_begun_callback")) except errors.MaxPlayersReachedException: update.effective_message.edit_reply_markup(reply_markup=get_start_keyboard(lang_id)) update.callback_query.answer(translator("mp_max_players_callback")) except errors.PlayerAlreadyExistingException: update.callback_query.answer(translator("mp_already_joined_callback"))
def is_button_affiliated(update, context, game, lang_id): try: game_id = int(update.callback_query.data.split("_")[1]) if game.id != game_id: update.callback_query.answer("Sorry, the button you pressed is not for your current game!") remove_inline_keyboard(update, context) return False return True except Exception as e: logger.error("Something unexpected happened while checking button affiliation: {} - {}".format(update.callback_query.data, e)) return False
def stand_callback(update, context): """ CallbackQueryHandler callback for the 'stand' inline button. Prepares round for the next player. """ chat = update.effective_chat lang_id = Database().get_lang_id(chat.id) game = GameStore().get_game(update.effective_chat.id) if not is_button_affiliated(update, context, game, lang_id): return remove_inline_keyboard(update, context) next_player(update, context)
def wrapper(update, context, *args, **kwargs): chat = update.effective_chat lang_id = Database().get_lang_id(chat.id) translator = Translator(lang_id=lang_id) try: game = GameStore().get_game(chat.id) except NoActiveGameException: remove_inline_keyboard(update, context) update.effective_message.reply_text( translator("mp_no_created_game_callback")) return return func(update, context)
def start_callback(update, context): """Starts a game that has been created already""" user = update.effective_user chat = update.effective_chat lang_id = Database().get_lang_id(chat.id) translator = Translator(lang_id=lang_id) try: game = GameStore().get_game(update.effective_chat.id) if not is_button_affiliated(update, context, game, lang_id): return except NoActiveGameException: update.callback_query.answer(translator("mp_no_created_game_callback")) remove_inline_keyboard(update, context) return try: game.start(user.id) update.callback_query.answer(translator("mp_starting_game_callback")) except errors.GameAlreadyRunningException: update.callback_query.answer( translator("mp_game_already_begun_callback")) return except errors.NotEnoughPlayersException: update.callback_query.answer( translator("mp_not_enough_players_callback")) return except errors.InsufficientPermissionsException: update.callback_query.answer( translator("mp_only_creator_start_callback").format( user.first_name)) return if game.type != BlackJackGame.Type.SINGLEPLAYER: players_are = translator("mp_players_are") for player in game.players: players_are += "👤{}\n".format(player.first_name) players_are += "\n" else: players_are = "" update.effective_message.edit_text( translator("game_starts_now").format( players_are, get_cards_string(game.dealer, lang_id))) players_turn(update, context)
def newgame_callback(update, context): remove_inline_keyboard(update, context) start_cmd(update, context)