Ошибка при использовании telegram-бота для python

Рейтинг: 0Ответов: 1Опубликовано: 22.04.2023
import random
from telegram import Update, BotCommand
from telegram.ext import Updater, CommandHandler, CallbackContext, MessageHandler, Filters
from pypokerengine.api.game import setup_config, start_poker
from pypokerengine.players import BasePokerPlayer
from pypokerengine.utils.card_utils import gen_cards, estimate_hole_card_win_rate

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

TOKEN = "TOKEN"

SUIT_UNICODE = {
    "S": "♠️",
    "H": "♥️",
    "D": "♦️",
    "C": "♣️"
}

class PokerPlayer(BasePokerPlayer):
    def __init__(self, uuid):
        self.uuid = uuid
        self.hole_card = None

    def declare_action(self, valid_actions, hole_card, round_state):
        return valid_actions[0]['action'], valid_actions[0]['amount']

    def receive_game_start_message(self, game_info):
        pass

    def receive_round_start_message(self, round_count, hole_card, seats):
        self.hole_card = hole_card

    def receive_street_start_message(self, street, round_state):
        pass

    def receive_game_update_message(self, action, round_state):
        pass

    def receive_round_result_message(self, winners, hand_info, round_state):
        pass

def start(update: Update, context: CallbackContext):
    update.message.reply_text('Привет! Я - Покерный бот. Вот список доступных команд:')
    commands = get_bot_commands()
    for command in commands:
        update.message.reply_text(f'/{command.command} - {command.description}')

def join(update: Update, context: CallbackContext):
    user = update.message.from_user
    if user.id not in context.chat_data:
        context.chat_data[user.id] = user.username or user.first_name
        update.message.reply_text(f'{user.username or user.first_name} присоединился к игре!')
    else:
        update.message.reply_text('Вы уже присоединились к игре.')

def start_poker_game(update: Update, context: CallbackContext):
    if not context.chat_data:
        update.message.reply_text('Недостаточно игроков. Напиши /join, чтобы присоединиться к игре.')
        return

    players = [{"name": str(user_id), "algorithm": PokerPlayer(user_id)} for user_id in context.chat_data.keys()]
    random.shuffle(players)
    players = players[:5]

    config = setup_config(max_round=5, initial_stack=1000, small_blind_amount=20)
    for player in players:
        config.register_player(**player)

    results = start_poker(config, None)

    for result in results:
        player_id = int(result["name"])
        username = context.chat_data[player_id]
        stack = result["stack"]
        update.message.reply_text(f'{username} имеет {stack} фишек после игры.')

    for player in players:
        player_obj = player["algorithm"]
        hole_card = " ".join([f"{SUIT_UNICODE[card.suit]}{card.rank}" for card in gen_cards(player_obj.hole_card)])
        update.message.chat.send_message(player_obj.uuid, f'Ваши карты: {hole_card}')

def get_bot_commands():
    return [
        BotCommand(command="kadzy_poker", description="Запустить игру в покер"),
        BotCommand(command="join_poker", description="Присоединиться к игре"),
        BotCommand(command="poker", description="Запустить игру в покер"),
    ]

def main():
    updater = Updater(TOKEN)
    dp = updater.dispatcher

    # Register bot commands
    updater.bot.set_my_commands(get_bot_commands())

    dp.add_handler(CommandHandler("start_poker", start))
    dp.add_handler(CommandHandler("join", join))
    dp.add_handler(CommandHandler("kadzy_poker", start_poker_game, filters=Filters.chat_type.groups))
    dp.add_handler(CommandHandler("join_poker", join))
    dp.add_handler(CommandHandler("poker", start_poker_game))

    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

Ошибка в консоли:

2023-04-22 14:18:52,448 - telegram.ext.dispatcher - ERROR - No error handlers are registered, logging exception.
Traceback (most recent call last):
  File "C:\Users\gpsdr\AppData\Local\Programs\Python\Python311\Lib\site-packages\telegram\ext\dispatcher.py", line 555, in process_update
    handler.handle_update(update, self, check, context)
  File "C:\Users\gpsdr\AppData\Local\Programs\Python\Python311\Lib\site-packages\telegram\ext\handler.py", line 198, in handle_update
    return self.callback(update, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\kadzy_poker_bot\kadzy_poker.py", line 73, in start_poker_game
    player_id = int(result["name"])
                    ~~~~~~^^^^^^^^
TypeError: string indices must be integers, not 'str'

Возникает после команды /kadzy_poker, т.е., старт игры в групповом чате.

Ответы

▲ 0

results - это словарь, а не список результатов игроков. Соответственно, когда вы перебираете for result in results:, в result хранятся ключи этого словаря - строки.

Чтобы исправить данную ошибку, замените строчку for result in results: на for result in results["players"]:.