Пример #1
0
 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()
Пример #2
0
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()
Пример #3
0
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()
Пример #4
0
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()
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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()
Пример #15
0
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()
Пример #16
0
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,
    }
Пример #17
0
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
Пример #18
0
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"
Пример #19
0
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
Пример #20
0
    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
Пример #21
0
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
Пример #22
0
    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()
Пример #23
0
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
Пример #24
0
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)
Пример #25
0
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()
Пример #26
0
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)
Пример #27
0
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()
Пример #28
0
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
Пример #29
0
def parse_log(fp, processor, date):
    parser = LogParser()
    parser._game_state_processor = processor
    parser._current_date = date
    parser.read(fp)

    return parser
Пример #30
0
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