Пример #1
0
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)
Пример #2
0
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"))
Пример #3
0
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
Пример #4
0
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)
Пример #5
0
    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)
Пример #6
0
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)
Пример #7
0
def newgame_callback(update, context):
    remove_inline_keyboard(update, context)
    start_cmd(update, context)