Загрузка...

Script Dota2 bot for the lobby

Thread in Python created by savaforeverru Jun 27, 2025. 156 views

  1. savaforeverru
    savaforeverru Topic starter Jun 27, 2025 4 Aug 29, 2020
    Я написал код и не могу понять, почему бот заходит в любой слот в лобби, кроме слота тренера.

    Суть бота: он принимает пати в лобби и дальше заходит в закрытое лобби вместе с человеком, который его позвал в пати, дальше он должен заходить в слот тренера определенной команды, следя за определенным игроком, но бот что-то совсем кукухой поехал и не может зайти в слот тренера
    Был бы очень благодарен за помощь!

    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()
     
Loading...
Top