Example #1
0
class Statistics:
    def __init__(self, db_path: str):
        self.db_path = db_path
        self.parser = LogParser()

    def calculate_statistics(self):
        print("Loading logs from db...")
        logs = load_logs_from_db(self.db_path, offset=1000000, limit=200000)
        progress_bar = tqdm(logs, position=1)
        for log in progress_bar:
            parsed_rounds = self.parser.split_log_to_game_rounds(log["log_content"])

            self.find_yakumans(log["log_id"], parsed_rounds, progress_bar)

            # result = self.find_high_level_games(log["log_id"], parsed_rounds)
            # if result:
            #     progress_bar.write(result)

    def find_yakumans(self, log_id, parsed_rounds, progress_bar):
        for round_data in parsed_rounds:
                if self.parser.is_agari_tag(tag):

                    # if 'yaku=' in tag:
                    #     han = sum([int(x) for x in self.parser.get_attribute_content(tag, 'yaku').split(',')[1::2]])
                    #     if han >= 20:
                    #         progress_bar.write(str(han) + f' https://tenhou.net/0/?log={log_id}')

                    if 'yakuman=' in tag:
                        yakuman = self.parser.get_attribute_content(tag, 'yakuman').split(',')
                        if ('37' in yakuman or '38' in yakuman) and len(yakuman) >= 2:
                            progress_bar.write(str(len(yakuman)) + f' https://tenhou.net/0/?log={log_id}')

                        # if len(yakuman) >= 3:
                        #     progress_bar.write(str(len(yakuman)) + f' https://tenhou.net/0/?log={log_id}')

    def find_high_level_games(self, log_id: str, parsed_rounds: List) -> Optional[str]:
        start_game_tag = parsed_rounds[0][0]
        ranks = self.parser.comma_separated_string_to_ints(
            self.parser.get_attribute_content(start_game_tag, "dan")
        )

        allowed_ranks = {
            18: "九段",
            19: "十段",
            20: "天鳳位",
        }

        suitable_table = all([x in allowed_ranks for x in ranks])
        if not suitable_table:
            return None

        first_player = unquote(self.parser.get_attribute_content(start_game_tag, "n0"))
        second_player = unquote(self.parser.get_attribute_content(start_game_tag, "n1"))
        third_player = unquote(self.parser.get_attribute_content(start_game_tag, "n2"))
        fourth_player = unquote(self.parser.get_attribute_content(start_game_tag, "n3"))

        result = [
            f"http://tenhou.net/0/?log={log_id}",
            first_player,
            allowed_ranks[ranks[0]],
            second_player,
            allowed_ranks[ranks[1]],
            third_player,
            allowed_ranks[ranks[2]],
            fourth_player,
            allowed_ranks[ranks[3]],
        ]

        return ",".join(result)