Я написал код и не могу понять, почему бот заходит в любой слот в лобби, кроме слота тренера. Суть бота: он принимает пати в лобби и дальше заходит в закрытое лобби вместе с человеком, который его позвал в пати, дальше он должен заходить в слот тренера определенной команды, следя за определенным игроком, но бот что-то совсем кукухой поехал и не может зайти в слот тренера Был бы очень благодарен за помощь! import os import asyncio from steam.client import SteamClient from dota2.client import Dota2Client from dota2.enums import DOTA_GC_TEAM, EDOTAGCMsg from dotenv import load_dotenv load_dotenv() STEAM_USER = os.getenv('STEAM_USER') STEAM_PASS = os.getenv('STEAM_PASS') STEAM_SHARED_SECRET = os.getenv('STEAM_SHARED_SECRET') # Для 2FA, если нужно client = SteamClient() dota = Dota2Client(client) def start_dota(): print('Logged into Steam, launching Dota 2...') dota.launch() client.on('logged_on', start_dota) def on_ready(): print('Dota 2 client ready. Ожидание инвайтов...') dota.on('ready', on_ready) def on_party_invite(message): print(f'Приглашение в пати, group_id={getattr(message, "group_id", None)}, принимаю...') dota.respond_to_party_invite(message.group_id, accept=True) dota.on('party_invite', on_party_invite) def on_lobby_invite(message): print(f'Приглашение в лобби, lobby_id={getattr(message, "lobby_id", None)}, принимаю...') dota.respond_to_lobby_invite(message.lobby_id, accept=True) dota.on('lobby_invite', on_lobby_invite) def on_lobby_new(message): print('Вошли в лобби, пытаюсь занять слот тренера...') dota.set_party_coach_flag(True) print('Слот тренера занят.') print_lobby_state(message) dota.on('lobby_new', on_lobby_new) def on_lobby_changed(message): print('=== ИЗМЕНЕНИЕ В ЛОББИ ===') print_lobby_state(message) dota.on('lobby_changed', on_lobby_changed) def on_party_changed(message): print('=== ИЗМЕНЕНИЕ В ПАТИ ===') print_party_state(message) dota.on('party_changed', on_party_changed) def get_team_enum(team_value): """Преобразует числовое значение команды в enum""" team_map = { 0: DOTA_GC_TEAM.GOOD_GUYS, # Radiant 1: DOTA_GC_TEAM.BAD_GUYS, # Dire 3: DOTA_GC_TEAM.SPECTATOR, # Spectator 4: DOTA_GC_TEAM.PLAYER_POOL, # Player Pool } return team_map.get(team_value, DOTA_GC_TEAM.SPECTATOR) def print_member_info(member, prefix=""): for attr in dir(member): if not attr.startswith("_"): try: value = getattr(member, attr) print(f"{prefix}{attr}: {value}") except Exception as e: print(f"{prefix}{attr}: <error: {e}>") def try_become_coach(member): """Правильный способ занять слот тренера через протобуфы""" team = getattr(member, 'team', None) coach_team = getattr(member, 'coach_team', None) print(f"Попытка стать тренером. Игрок в команде: {team}, coach_team: {coach_team}") try: # Определяем команду (team) для бота - всегда SPECTATOR target_team = DOTA_GC_TEAM.SPECTATOR print("Присоединяюсь к команде SPECTATOR") # Присоединяемся к команде SPECTATOR print("Пробую способ через join_practice_lobby_team...") alt_result = dota.join_practice_lobby_team(team=target_team) print(f"Результат join_practice_lobby_team: {alt_result}") # Устанавливаем флаг тренера print("Устанавливаю флаг тренера...") coach_result = dota.set_party_coach_flag(True) print(f"Результат set_party_coach_flag: {coach_result}") except Exception as e: print(f"Ошибка при попытке стать тренером: {e}") print(f"Тип ошибки: {type(e)}") # Пробуем простой способ try: print("Пробую простой способ через set_party_coach_flag...") simple_result = dota.set_party_coach_flag(True) print(f"Результат простого способа: {simple_result}") except Exception as e2: print(f"Простой способ тоже не сработал: {e2}") def print_lobby_state(lobby): print(f'Лобби ID: {getattr(lobby, "lobby_id", "N/A")}') print(f'Пароль: {getattr(lobby, "password", "Нет")}') print(f'Режим игры: {getattr(lobby, "game_mode", "N/A")}') print(f'\n=== ИГРОКИ В ЛОББИ ===') target_player_id = 76561198160709695 if hasattr(lobby, 'all_members') and lobby.all_members: for i, member in enumerate(lobby.all_members): player_id = getattr(member, 'id', None) print(f'\nСлот {i}: Steam ID: {player_id}') print_member_info(member, prefix=" ") if player_id == target_player_id: print('\n *** ПОЛНАЯ ИНФОРМАЦИЯ О ЦЕЛЕВОМ ИГРОКЕ ***') print_member_info(member, prefix=" [TARGET] ") print(' *** КОНЕЦ ИНФОРМАЦИИ О ЦЕЛЕВОМ ИГРОКЕ ***\n') # Пытаемся стать тренером try_become_coach(member) else: print('Нет игроков в лобби') print('=== КОНЕЦ ИНФОРМАЦИИ О ЛОББИ ===\n') def print_party_state(party): """Выводит состояние пати""" print(f'Пати ID: {getattr(party, "party_id", "N/A")}') print(f'Лидер: {getattr(party, "leader_id", "N/A")}') if hasattr(party, 'members') and party.members: print('\n=== ИГРОКИ В ПАТИ ===') for i, member in enumerate(party.members): print(f'Игрок {i+1}:') print(f' Steam ID: {getattr(member, "steam_id", "N/A")}') print(f' Готов: {getattr(member, "is_ready", "N/A")}') print(f' Тренер: {getattr(member, "is_coach", "N/A")}') print('---') else: print('Нет игроков в пати') def main(): if not STEAM_USER or not STEAM_PASS: print('STEAM_USER и STEAM_PASS должны быть заданы в .env') return try: client.cli_login(username=STEAM_USER, password=STEAM_PASS) client.run_forever() except Exception as e: print(f'Ошибка логина: {e}') if __name__ == '__main__': main() Python import os import asyncio from steam.client import SteamClient from dota2.client import Dota2Client from dota2.enums import DOTA_GC_TEAM, EDOTAGCMsg from dotenv import load_dotenv load_dotenv() STEAM_USER = os.getenv('STEAM_USER') STEAM_PASS = os.getenv('STEAM_PASS') STEAM_SHARED_SECRET = os.getenv('STEAM_SHARED_SECRET') # Для 2FA, если нужно client = SteamClient() dota = Dota2Client(client) def start_dota(): print('Logged into Steam, launching Dota 2...') dota.launch() client.on('logged_on', start_dota) def on_ready(): print('Dota 2 client ready. Ожидание инвайтов...') dota.on('ready', on_ready) def on_party_invite(message): print(f'Приглашение в пати, group_id={getattr(message, "group_id", None)}, принимаю...') dota.respond_to_party_invite(message.group_id, accept=True) dota.on('party_invite', on_party_invite) def on_lobby_invite(message): print(f'Приглашение в лобби, lobby_id={getattr(message, "lobby_id", None)}, принимаю...') dota.respond_to_lobby_invite(message.lobby_id, accept=True) dota.on('lobby_invite', on_lobby_invite) def on_lobby_new(message): print('Вошли в лобби, пытаюсь занять слот тренера...') dota.set_party_coach_flag(True) print('Слот тренера занят.') print_lobby_state(message) dota.on('lobby_new', on_lobby_new) def on_lobby_changed(message): print('=== ИЗМЕНЕНИЕ В ЛОББИ ===') print_lobby_state(message) dota.on('lobby_changed', on_lobby_changed) def on_party_changed(message): print('=== ИЗМЕНЕНИЕ В ПАТИ ===') print_party_state(message) dota.on('party_changed', on_party_changed) def get_team_enum(team_value): """Преобразует числовое значение команды в enum""" team_map = { 0: DOTA_GC_TEAM.GOOD_GUYS, # Radiant 1: DOTA_GC_TEAM.BAD_GUYS, # Dire 3: DOTA_GC_TEAM.SPECTATOR, # Spectator 4: DOTA_GC_TEAM.PLAYER_POOL, # Player Pool } return team_map.get(team_value, DOTA_GC_TEAM.SPECTATOR) def print_member_info(member, prefix=""): for attr in dir(member): if not attr.startswith("_"): try: value = getattr(member, attr) print(f"{prefix}{attr}: {value}") except Exception as e: print(f"{prefix}{attr}: <error: {e}>") def try_become_coach(member): """Правильный способ занять слот тренера через протобуфы""" team = getattr(member, 'team', None) coach_team = getattr(member, 'coach_team', None) print(f"Попытка стать тренером. Игрок в команде: {team}, coach_team: {coach_team}") try: # Определяем команду (team) для бота - всегда SPECTATOR target_team = DOTA_GC_TEAM.SPECTATOR print("Присоединяюсь к команде SPECTATOR") # Присоединяемся к команде SPECTATOR print("Пробую способ через join_practice_lobby_team...") alt_result = dota.join_practice_lobby_team(team=target_team) print(f"Результат join_practice_lobby_team: {alt_result}") # Устанавливаем флаг тренера print("Устанавливаю флаг тренера...") coach_result = dota.set_party_coach_flag(True) print(f"Результат set_party_coach_flag: {coach_result}") except Exception as e: print(f"Ошибка при попытке стать тренером: {e}") print(f"Тип ошибки: {type(e)}") # Пробуем простой способ try: print("Пробую простой способ через set_party_coach_flag...") simple_result = dota.set_party_coach_flag(True) print(f"Результат простого способа: {simple_result}") except Exception as e2: print(f"Простой способ тоже не сработал: {e2}") def print_lobby_state(lobby): print(f'Лобби ID: {getattr(lobby, "lobby_id", "N/A")}') print(f'Пароль: {getattr(lobby, "password", "Нет")}') print(f'Режим игры: {getattr(lobby, "game_mode", "N/A")}') print(f'\n=== ИГРОКИ В ЛОББИ ===') target_player_id = 76561198160709695 if hasattr(lobby, 'all_members') and lobby.all_members: for i, member in enumerate(lobby.all_members): player_id = getattr(member, 'id', None) print(f'\nСлот {i}: Steam ID: {player_id}') print_member_info(member, prefix=" ") if player_id == target_player_id: print('\n *** ПОЛНАЯ ИНФОРМАЦИЯ О ЦЕЛЕВОМ ИГРОКЕ ***') print_member_info(member, prefix=" [TARGET] ") print(' *** КОНЕЦ ИНФОРМАЦИИ О ЦЕЛЕВОМ ИГРОКЕ ***\n') # Пытаемся стать тренером try_become_coach(member) else: print('Нет игроков в лобби') print('=== КОНЕЦ ИНФОРМАЦИИ О ЛОББИ ===\n') def print_party_state(party): """Выводит состояние пати""" print(f'Пати ID: {getattr(party, "party_id", "N/A")}') print(f'Лидер: {getattr(party, "leader_id", "N/A")}') if hasattr(party, 'members') and party.members: print('\n=== ИГРОКИ В ПАТИ ===') for i, member in enumerate(party.members): print(f'Игрок {i+1}:') print(f' Steam ID: {getattr(member, "steam_id", "N/A")}') print(f' Готов: {getattr(member, "is_ready", "N/A")}') print(f' Тренер: {getattr(member, "is_coach", "N/A")}') print('---') else: print('Нет игроков в пати') def main(): if not STEAM_USER or not STEAM_PASS: print('STEAM_USER и STEAM_PASS должны быть заданы в .env') return try: client.cli_login(username=STEAM_USER, password=STEAM_PASS) client.run_forever() except Exception as e: print(f'Ошибка логина: {e}') if __name__ == '__main__': main()