room_name = sys.argv[1] room_pass = sys.argv[2] params = sys.argv[3:] players = {} for i in range(0, len(params), 2): player_id = params[i] team = params[i + 1] players[int(player_id)] = {"team": team, "slot": None} @client.on('logged_on') def start_dota(): dota.launch() @dota.on('ready') def on_dota_ready(): manage_lobby(dota, client, room_name, room_pass, players) @dota.on(dota2.features.Lobby.EVENT_LOBBY_CHANGED) def lobby_update(lobby): manage_lobby_players(dota, lobby, players) client.cli_login(username="******", password="******") client.run_forever()
def start_bot(self, credentials): client = SteamClient() dota = Dota2Client(client) self.bots.append(dota) client.verbose_debug = True dota.verbose_debug = True @client.on('logged_on') def start_dota(): dota.launch() # TODO: don't try to relogin if we disconnected by KeyboardInterrupt @client.on('disconnected') def handle_disconnect(): print('Disconnected: %s' % credentials['login']) delay = 30 print('Trying to login again in %d sec...' % delay) gevent.sleep(delay) client.login(credentials['login'], credentials['password']) client.run_forever() @dota.on('ready') def dota_started(): print('Logged in: %s %s' % (dota.steam.username, dota.account_id)) # register this bot as a player in db player, created = Player.objects.get_or_create( dota_id=dota.account_id, defaults={ 'name': dota.steam.username, 'dota_mmr': random.randrange(3000, 6000, 500) }) print('Bot %s (%d MMR, %s), was already in DB: %s' % (player.name, player.dota_mmr, player.dota_id, not created)) # if lobby is hung up from previous session, leave it dota.leave_practice_lobby() dota.join_practice_lobby(self.lobby, self.password) @dota.on(dota2.features.Lobby.EVENT_LOBBY_NEW) def lobby_new(lobby): print('%s joined lobby %s' % (dota.steam.username, lobby.lobby_id)) ind = self.bots.index(dota) if ind == 0: # let first bot listen to lobby chat dota.channels.join_lobby_channel() team = ind // 5 slot = ind % 5 + 1 dota.join_practice_lobby_team(slot, team) @dota.on(dota2.features.Lobby.EVENT_LOBBY_CHANGED) def lobby_changed(lobby): if dota != self.bots[0]: return players = [ player for player in lobby.members if player.team in (DOTA_GC_TEAM.GOOD_GUYS, DOTA_GC_TEAM.BAD_GUYS) ] if len(players) == 0 and self.balance_team1: print() print('All bots jumped to unassigned') self.join_balance_slots() @dota.channels.on(dota2.features.chat.ChannelManager.EVENT_MESSAGE) def chat_message(channel, msg_obj): text = msg_obj.text if channel.type != DOTAChatChannelType_t.DOTAChannelType_Lobby: return # ignore postgame and other chats # process known commands if text.startswith('Team 1'): self.balance_ready(text) client.login(credentials['login'], credentials['password']) client.run_forever()