diff --git a/.gitignore b/.gitignore index 3e71824..bc5bc92 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .vscode __pycache__/ -.idea/ \ No newline at end of file +.idea/ +./src/logs \ No newline at end of file diff --git a/src/kafka_lib.py b/src/kafka_lib.py index e2fc014..d331762 100644 --- a/src/kafka_lib.py +++ b/src/kafka_lib.py @@ -11,7 +11,7 @@ class ProducerThread(threading.Thread): - def __init__(self, url, date=None, nb_try_connection=10): + def __init__(self, url, date=None, nb_try_connection=30): threading.Thread.__init__(self) @@ -79,7 +79,7 @@ def stop(self): class ConsumerThread(threading.Thread): - def __init__(self, url, date=None, nb_try_connection=10): + def __init__(self, url, date=None, nb_try_connection=30): threading.Thread.__init__(self) diff --git a/src/log_analyser/log_analyser.py b/src/log_analyser/log_analyser.py index 4c86a07..5e145e3 100644 --- a/src/log_analyser/log_analyser.py +++ b/src/log_analyser/log_analyser.py @@ -74,11 +74,11 @@ def process_map_start(self, data): def process_hero_spawn(self, data): player_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[5]} - self.map.add_player(player_data) + self.map.add_hero_spawn(player_data) def process_hero_swap(self, data): - hero_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[5], "character_swap": data[6]} + hero_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[6], "character_swap": data[5]} self.map.add_hero_swap(hero_data) def convert_timefile_to_datetime(self, time_string): diff --git a/src/log_analyser/objects/character.py b/src/log_analyser/objects/character.py index d8742ea..d81f625 100644 --- a/src/log_analyser/objects/character.py +++ b/src/log_analyser/objects/character.py @@ -1,23 +1,48 @@ from log_analyser.objects.object import Object +import json +import os class Character(Object): def __init__(self, **kwargs): - + data_schema = {"name": str, "stats": dict, "played_time": list, "kills": list, "deaths": list, "ultimate_charged": list, - "ultimate_use": list} - + "ultimate_use": list, + "role": str} + super().__init__(data_schema, **kwargs) + self.role = self.find_role() + + def find_role(self): + roles_file = 'log_analyser/roles/roles.json' + lang_folder = 'log_analyser/roles/lg' + roles_data = self.load_roles(roles_file) + + role = self.find_character_role(self.name, roles_data, lang_folder) + return role def add_played_time(self, data): self.played_time.append(data) + def add_start_time(self, data): + + if len(self.played_time) > 0: + if "end" not in self.played_time[-1] and self.played_time[-1]["start"] == data["start"]: + pass + else: + self.played_time.append(data) + + def add_end_time(self, data): + if len(self.played_time) == 0: + return -1 + self.played_time[-1]["end"] = data["end"] + def add_kill(self, data): self.kills.append(data) @@ -43,4 +68,26 @@ def add_ultimate_end(self, data): self.ultimate_use[-1]["end"] = data["end"] def add_character_stats(self, data): - self.stats = data \ No newline at end of file + self.stats = data + + def load_roles(self, file_path): + with open(file_path, 'r', encoding='utf-8') as file: + roles_data = json.load(file) + return roles_data + + def find_character_role(self, character_name, roles_data, lang_folder): + for role in roles_data: + if character_name in roles_data[role]: + return role + else: + for lang_file in os.listdir(lang_folder): + lang_file_path = os.path.join(lang_folder, lang_file) + if os.path.isfile(lang_file_path) and lang_file.endswith('.json'): + with open(lang_file_path, 'r', encoding='utf-8') as file: + lang_data = json.load(file) + if character_name in lang_data: + name = lang_data[character_name] + for role in roles_data: + if name in roles_data[role]: + return role + return None diff --git a/src/log_analyser/objects/map.py b/src/log_analyser/objects/map.py index a2b27e6..13d20a7 100644 --- a/src/log_analyser/objects/map.py +++ b/src/log_analyser/objects/map.py @@ -46,7 +46,7 @@ def add_player(self, data): return -1 else: self.rounds[self.actual_round].teams[data["team_name"]].add_player( - {"name": data["player_name"], "characters": {}}) + {"name": data["player_name"], "characters": {}, "role": ""}) # print("add player", data["player_name"]) self.add_character(data) return 0 @@ -56,7 +56,7 @@ def add_character(self, data): if data["character_name"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters: return -2 else: - self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].add_character({"name": data["character_name"], "stats": {}, "played_time": [], "kills": [], "deaths": [], "ultimate_charged": [], "ultimate_use": []}) + self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].add_character({"name": data["character_name"], "stats": {}, "played_time": [], "kills": [], "deaths": [], "ultimate_charged": [], "ultimate_use": [], "role": ""}) if len(self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_name"]].played_time) > 0: self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_name"]].played_time[-1]["end"] = data["time"] @@ -111,11 +111,20 @@ def add_player_stat(self, data): def add_hero_swap(self, data): self.add_player(data) + + character_swap_dict = data.copy() + character_swap_dict["character_name"] = data["character_swap"] + self.add_character(character_swap_dict) + if data["character_swap"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters: - self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_swap"]].add_played_time({"end": data["time"]}) + self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_swap"]].add_start_time({"start": data["time"]}) + if data["character_name"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters: + self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_name"]].add_end_time({"end": data["time"]}) self.events.append({"type": "hero_swap", "timestamp": data["time"], "player": data["player_name"], - "description": "{} swap on {}".format(data["player_name"], data["character_name"])}) + "description": "{} swap on {}".format(data["player_name"], data["character_swap"])}) + + def create_if_player_and_caracter_not_exist(self, team, player_name, character_name): if not player_name in self.rounds[self.actual_round].teams[team].players: @@ -167,10 +176,11 @@ def end_round(self, data): self.rounds[self.actual_round].end_time = data[2] for team in self.rounds[self.actual_round].teams: for player in self.rounds[self.actual_round].teams[team].players: + for character in self.rounds[self.actual_round].teams[team].players[player].characters: if not "end" in self.rounds[self.actual_round].teams[team].players[player].characters[character].played_time[-1]: self.rounds[self.actual_round].teams[team].players[player].characters[character].played_time[-1]["end"] = end_round_data["time"] - + self.rounds[self.actual_round].teams[team].players[player].find_role() self.team1_score = end_round_data["team1_score"] self.team2_score = end_round_data["team2_score"] diff --git a/src/log_analyser/objects/player.py b/src/log_analyser/objects/player.py index c8277a1..1e1669e 100644 --- a/src/log_analyser/objects/player.py +++ b/src/log_analyser/objects/player.py @@ -7,7 +7,8 @@ class Player(Object): def __init__(self, **kwargs) -> None: data_schema = {"name": str, - "characters": dict} + "characters": dict, + "role": str} super().__init__(data_schema, **kwargs) @@ -16,3 +17,15 @@ def add_event(self, event): def add_character(self, data): self.characters[data["name"]] = Character.from_json(data) + + def find_role(self): + + roles_time = {"Tank": 0, "DPS": 0, "Support": 0} + for character in self.characters: + character_role = self.characters[character].role + if character_role: + for play_time in self.characters[character].played_time: + if "end" in play_time and "start" in play_time: + roles_time[character_role] += float(play_time["end"]) - float(play_time["start"]) + + self.role = max(roles_time, key=roles_time.get) \ No newline at end of file diff --git a/src/log_analyser/roles/lg/es.json b/src/log_analyser/roles/lg/es.json new file mode 100644 index 0000000..4361557 --- /dev/null +++ b/src/log_analyser/roles/lg/es.json @@ -0,0 +1,41 @@ +{ + "D.Va": "D.Va", + "Doomfist": "Doomfist", + "Junker Queen": "Junker Queen", + "Mauga": "Mauga", + "Orisa": "Orisa", + "Ramattra": "Ramattra", + "Reinhardt": "Reinhardt", + "Roadhog": "Roadhog", + "Sigma": "Sigma", + "Winston": "Winston", + "Wrecking Ball": "Wrecking Ball", + "Zarya": "Zarya", + "Ashe": "Ashe", + "Bastion": "Bastion", + "Cassidy": "Cassidy", + "Echo": "Echo", + "Genji": "Genji", + "Hanzo": "Hanzo", + "Chacal": "Junkrat", + "Mei": "Mei", + "Pharah": "Pharah", + "Reaper": "Reaper", + "Sojourn": "Sojourn", + "Soldado: 76": "Soldier: 76", + "Sombra": "Sombra", + "Symmetra": "Symmetra", + "Torbjörn": "Torbjörn", + "Tracer": "Tracer", + "Widowmaker": "Widowmaker", + "Ana": "Ana", + "Baptiste": "Baptiste", + "Brigitte": "Brigitte", + "Illari": "Illari", + "Kiriko": "Kiriko", + "Lifeweaver": "Lifeweaver", + "Lúcio": "Lúcio", + "Mercy": "Mercy", + "Moira": "Moira", + "Zenyatta": "Zenyatta" +} \ No newline at end of file diff --git a/src/log_analyser/roles/lg/fr.json b/src/log_analyser/roles/lg/fr.json new file mode 100644 index 0000000..9e1ab3f --- /dev/null +++ b/src/log_analyser/roles/lg/fr.json @@ -0,0 +1,41 @@ +{ + "D.Va": "D.Va", + "Doomfist": "Doomfist", + "Reine des junkers": "Junker Queen", + "Mauga": "Mauga", + "Orisa": "Orisa", + "Ramattra": "Ramattra", + "Reinhardt": "Reinhardt", + "Chopper": "Roadhog", + "Sigma": "Sigma", + "Winston": "Winston", + "Bouldozer": "Wrecking Ball", + "Zarya": "Zarya", + "Ashe": "Ashe", + "Bastion": "Bastion", + "Cassidy": "Cassidy", + "Echo": "Echo", + "Genji": "Genji", + "Hanzo": "Hanzo", + "Chacal": "Junkrat", + "Mei": "Mei", + "Pharah": "Pharah", + "Faucheur": "Reaper", + "Sojourn": "Sojourn", + "Soldat: 76": "Soldier: 76", + "Sombra": "Sombra", + "Symmetra": "Symmetra", + "Torbjörn": "Torbjörn", + "Tracer": "Tracer", + "Fatal": "Widowmaker", + "Ana": "Ana", + "Baptiste": "Baptiste", + "Brigitte": "Brigitte", + "Illari": "Illari", + "Kiriko": "Kiriko", + "Vital": "Lifeweaver", + "Lúcio": "Lúcio", + "Mercy": "Mercy", + "Moira": "Moira", + "Zenyatta": "Zenyatta" +} \ No newline at end of file diff --git a/src/log_analyser/roles/roles.json b/src/log_analyser/roles/roles.json new file mode 100644 index 0000000..67b0df0 --- /dev/null +++ b/src/log_analyser/roles/roles.json @@ -0,0 +1,47 @@ +{ + "Tank": [ + "D.Va", + "Doomfist", + "Junker Queen", + "Mauga", + "Orisa", + "Ramattra", + "Reinhardt", + "Roadhog", + "Sigma", + "Winston", + "Wrecking Ball", + "Zarya" + ], + "DPS": [ + "Ashe", + "Bastion", + "Cassidy", + "Echo", + "Genji", + "Hanzo", + "Junkrat", + "Mei", + "Pharah", + "Reaper", + "Sojourn", + "Soldier: 76", + "Sombra", + "Symmetra", + "Torbjörn", + "Tracer", + "Widowmaker" + ], + "Support": [ + "Ana", + "Baptiste", + "Brigitte", + "Illari", + "Kiriko", + "Lifeweaver", + "Lúcio", + "Mercy", + "Moira", + "Zenyatta" + ] +} \ No newline at end of file diff --git a/src/main.py b/src/main.py index 2ee7575..2ef3216 100644 --- a/src/main.py +++ b/src/main.py @@ -15,10 +15,8 @@ def __init__(self): self.config = configparser.ConfigParser() self.config.read("datastrike_python_processing.cfg") - self.kafka_url = self.config["kafka"]["url"] - print(self.kafka_url) self.producer_thread = ProducerThread(self.kafka_url) self.consumer_thread = ConsumerThread(self.kafka_url) diff --git a/src/process_file.py b/src/process_file.py new file mode 100644 index 0000000..4061443 --- /dev/null +++ b/src/process_file.py @@ -0,0 +1,8 @@ +import os +from log_analyser.log_analyser import LogAnalyser + +for file in os.listdir("logs"): + if file.endswith(".txt"): + la = LogAnalyser('logs', file, "test") + la.run() + print("a") \ No newline at end of file