def __init__(self, game): super().__init__(game) self.path = path.join(game.path, "Power.log") print(game.path) self.last_ts = datetime.time(0) self.last_turn = None self.parser = LogParser()
def test_error_level(): parser = LogParser() parser.read(StringIO(data.INITIAL_GAME)) parser.flush() line = u"E 02:08:13.8318679 SubSpellController {...}" parser.read(StringIO(line)) parser.flush()
def test_warn_level(): parser = LogParser() parser.read(StringIO(INITIAL_GAME)) parser.flush() line = u"W 09:09:23.1428700 GameState.ReportStuck() - Stuck for 10s 89ms. {...}" parser.read(StringIO(line)) parser.flush()
def test_info_outside_of_metadata(): parser = LogParser() parser.read(StringIO(INITIAL_GAME)) parser.flush() info = u"D 02:59:14.6500380 GameState.DebugPrintPower() - Info[0] = 99" parser.read(StringIO(info)) parser.flush()
def test_mercenaries_solo_pvp(parser: LogParser): with open(logfile("93227_mercenaries_solo_pvp.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_shuffle_deck(parser: LogParser): with open(logfile("54613_shuffle_deck.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_vo_spell(parser: LogParser): with open(logfile("49534_vo_spell.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_cached_tag_for_dormant_change(parser: LogParser): with open(logfile("49534_cached_tag_for_dormant_change.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_full_entity_defined_in_subspell(parser: LogParser): with open(logfile("34104_subspell.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_inferrable_player(parser: LogParser): with open(logfile("25770_inferrable_player.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_friendly_player_superfriends_brawl(parser: LogParser): with open(logfile("friendly_player_id_is_1.power.log")) as f: parser.read(f) assert len(parser.games) == 1 packet_tree = parser.games[0] fpe = FriendlyPlayerExporter(packet_tree) friendly_player = fpe.export() assert friendly_player == 1
def test_name_aliasing(parser: LogParser): with open(logfile("88998_missing_player_hash.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_game_reset(parser: LogParser): with open(logfile("toki.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) exporter.export() assert True
def test_async_player_names(parser: LogParser): with open(logfile("88998_async_player_name.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) with pytest.raises(MissingPlayerData): exporter.export()
def test_unknown_human_player(parser: LogParser): with open(logfile("25770_unknown_human_player.power.log")) as f: parser.read(f) packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) with pytest.raises(MissingPlayerData): exporter.export()
def test_debugprintgame(parser: LogParser): with open(logfile("23576_debugprintgame.power.log")) as f: parser.read(f) assert parser.game_meta == { "BuildNumber": 23576, "FormatType": FormatType.FT_WILD, "GameType": GameType.GT_RANKED, "ScenarioID": 2, }
def test_change_def(parser: LogParser): with open(logfile("20457_def_change.power.log")) as f: parser.read(f) c = 0 for packet in parser.games[0].recursive_iter(TagChange): if packet.has_change_def: c += 1 assert c == 7
def test_20457(parser: LogParser): with open(logfile("20457_broken_names.power.log")) as f: parser.read(f) assert len(parser.games) == 1 packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) game = exporter.export() assert game.game.players[0].name == "Necroessenza" assert game.game.players[1].name == "Heigan l'Impuro"
def test_battlegrounds(parser: LogParser): with open(logfile("36393_battlegrounds.power.log")) as f: parser.read(f) assert len(parser.games) == 1 packet_tree = parser.games[0] exporter = EntityTreeExporter(packet_tree, player_manager=parser.player_manager) game = exporter.export() assert game.game.setup_done assert game.game.players[0].name == "BehEh#1355" assert len([ packet for packet in packet_tree if isinstance(packet, packets.Options) ]) == 96
def update_state(self, hp=1): parser = LogParser() if self.os == "Windows": log_dir = r"C:\Program Files (x86)\Hearthstone\Logs\Power.log" with io.open(log_dir, "r", encoding='utf8') as logs: lines = logs.readlines() self.logs = ''.join(lines) parser.read(io.StringIO(self.logs)) elif self.os == "Linux": parser.read(io.StringIO(self.linux_log)) parser.flush() packet_tree = parser.games[-1] while True: try: self.game = EntityTreeExporter(packet_tree).export().game except: print("Trapped") continue else: break packet_tree = parser.games[-1] self.friendly_player, self.enemy_player = self.read_players() turn = self.get_current_player().name in self.player_names board = self.get_current_board() hand = self.get_current_hand(hp, board) game_step = self.get_game_step() mana = self.get_current_mana() return hand, turn, board, game_step, mana
def test_options_packet_with_errors(): parser = LogParser() parser.read(StringIO(INITIAL_GAME)) parser.read(StringIO(OPTIONS_WITH_ERRORS)) parser.flush() packet_tree = parser.games[0] options_packet = packet_tree.packets[-1] op0 = options_packet.options[0] assert op0.id == 0 assert op0.type == OptionType.END_TURN assert op0.entity is None assert op0.error == PlayReq.INVALID assert op0.error_param is None op1 = options_packet.options[1] assert op1.id == 1 assert op1.type == OptionType.POWER assert op1.entity == 33 assert op1.error is None assert op1.error_param is None assert len(op1.options) == 12 target = op1.options[11] assert target.id == 11 assert target.entity == 37 assert target.error == PlayReq.REQ_TARGET_MAX_ATTACK assert target.error_param == 3
def __init__(self, os, linux_log=board_state): self.os = os parser = LogParser() if self.os == "Windows": log_dir = r"C:\Program Files (x86)\Hearthstone\Logs\Power.log" with io.open(log_dir, "r", encoding='utf8') as logs: k = 0 lines = logs.readlines() for line in lines: k += 1 if "GameState.DebugPrintPower() - CREATE_GAME" in line: start = k parsed_lines = lines[start-1:] self.logs = ''.join(parsed_lines) parser.read(io.StringIO(self.logs)) elif self.os == "Linux": parser.read(io.StringIO(linux_log)) self.linux_log = linux_log parser.flush() packet_tree = parser.games[-1] while True: try: self.game = EntityTreeExporter(packet_tree).export().game except: print("Trapped") continue else: break self.player_names = ['Strafos', 'strafos'] self.card_data = self.get_card_data() self.friendly_player, self.enemy_player = self.read_players()
class BattlefieldCollector(BaseCollector): def __init__(self, game): super().__init__(game) self.path = path.join(game.path, "Power.log") print(game.path) self.last_ts = datetime.time(0) self.last_turn = None self.parser = LogParser() def run(self): with open(self.path) as f: self.parser.read(f) self.parser.flush() tps = self.parser.games fp_id = FriendlyPlayerExporter(tps[-1]).export() turn = LastTurnExporter(tps[-1], self.last_ts, fp_id).export() if not self.last_turn: self.last_turn = turn if (turn.ts > self.last_turn.ts and turn.player): ## GET MINIONS / HAND_CARDS / HERO_POWERS time.sleep(1.2) img = screen.shot() print("EMinions {} - PMinions {} - HandCards {}".format( turn.enemy_minions, turn.player_minions, turn.hand_cards)) base_name = "em{}_pm{}_hc{}".format(turn.enemy_minions, turn.player_minions, turn.hand_cards) count = len([ f for f in listdir("images") if isfile(join("images", f)) and base_name in f and ".png" in f ]) if (count > 2): count = randrange(0, 2) base_name = "images/{}_{}".format(count, base_name) img_name = base_name + ".png" xml_name = base_name + ".xml" temp = create_battlefield(img, turn.hand_cards, turn.enemy_minions, turn.player_minions, turn.enemy_power, turn.player_power) temp.save(xml_name) screen.save(img, img_name) self.game.show_img(img_name) self.last_turn = turn
def test_unroundable_timestamp(): parser = LogParser() parser.read(StringIO(data.INITIAL_GAME)) parser.read(StringIO(data.UNROUNDABLE_TIMESTAMP)) parser.flush() # Timestamp has to be truncated assert parser.games[0].packets[1].ts == time(14, 43, 59, 999999)
def test_error_unhandled_powtype(): parser = LogParser() parser.read(StringIO(INITIAL_GAME)) # This shouldn't raise an exception parser.read( StringIO("D 02:13:03.1360001 GameState.DebugPrintPower() - " "ERROR: unhandled PowType RESET_GAME")) parser.flush()
def test_empty_entity_in_options(): parser = LogParser() parser.read(StringIO(INITIAL_GAME)) parser.flush() data = "target 0 entity=" with pytest.raises(ParsingError): # This can happen, but the game is corrupt parser.handle_options(None, data)
def test_reset_game(): parser = LogParser() parser.read(StringIO(data.INITIAL_GAME)) # This shouldn't raise an exception parser.read(StringIO( "D 15:39:19.3190860 GameState.DebugPrintPower() - BLOCK_START BlockType=GAME_RESET Entity=[entityName=Temporal Loop id=17 zone=PLAY zonePos=0 cardId=GILA_900p player=1] EffectCardId= EffectIndex=-1 Target=0 SubOption=-1\n" # noqa "D 15:39:19.3190860 GameState.DebugPrintPower() - RESET_GAME\n" )) parser.flush()
def test_cached_tag_for_dormant_change_entity_id_only(): parser = LogParser() parser.read(StringIO(data.INITIAL_GAME)) parser.read(StringIO(data.CACHED_TAG_FOR_DORMANT_CHANGE_SHORT_ENTITY)) parser.flush() packet_tree = parser.games[0] cached_tag_packet = packet_tree.packets[1] assert cached_tag_packet.entity == 593 assert cached_tag_packet.tag == GameTag.DEATHRATTLE assert cached_tag_packet.value == 1
def parse_log(fp, processor, date): parser = LogParser() parser._game_state_processor = processor parser._current_date = date parser.read(fp) return parser
def test_vo_spell_only(): parser = LogParser() parser.read(StringIO(data.INITIAL_GAME)) parser.read(StringIO(data.VO_SPELL)) parser.flush() packet_tree = parser.games[0] vo_spell_packet = packet_tree.packets[1] assert vo_spell_packet.brguid == ( "VO_BTA_BOSS_07h2_Female_NightElf_Mission_Fight_07_PlayerStart_01.prefab:616c9e5" + "7bb7fce54684e26be50462d17" ) assert vo_spell_packet.vospguid == "" assert vo_spell_packet.blocking is True assert vo_spell_packet.delayms == 1000