Skip to content

Commit d928c14

Browse files
authored
Merge pull request #24 from DataStrike/0.1.1
0.1.1
2 parents d94f541 + 51bbe4b commit d928c14

File tree

12 files changed

+262
-201
lines changed

12 files changed

+262
-201
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.vscode
22
__pycache__/
3-
.idea/
3+
.idea/
4+
./src/logs

src/kafka_lib.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
class ProducerThread(threading.Thread):
1313

14-
def __init__(self, url, date=None, nb_try_connection=10):
14+
def __init__(self, url, date=None, nb_try_connection=30):
1515

1616
threading.Thread.__init__(self)
1717

@@ -79,7 +79,7 @@ def stop(self):
7979

8080

8181
class ConsumerThread(threading.Thread):
82-
def __init__(self, url, date=None, nb_try_connection=10):
82+
def __init__(self, url, date=None, nb_try_connection=30):
8383

8484
threading.Thread.__init__(self)
8585

src/log_analyser/log_analyser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ def process_map_start(self, data):
7474
def process_hero_spawn(self, data):
7575

7676
player_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[5]}
77-
self.map.add_player(player_data)
77+
self.map.add_hero_spawn(player_data)
7878

7979
def process_hero_swap(self, data):
8080

81-
hero_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[5], "character_swap": data[6]}
81+
hero_data = {"time": data[2], "team_name": data[3], "player_name": data[4], "character_name": data[6], "character_swap": data[5]}
8282
self.map.add_hero_swap(hero_data)
8383

8484
def convert_timefile_to_datetime(self, time_string):

src/log_analyser/objects/character.py

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,48 @@
11
from log_analyser.objects.object import Object
2+
import json
3+
import os
24

35

46
class Character(Object):
57
def __init__(self, **kwargs):
6-
8+
79
data_schema = {"name": str,
810
"stats": dict,
911
"played_time": list,
1012
"kills": list,
1113
"deaths": list,
1214
"ultimate_charged": list,
13-
"ultimate_use": list}
14-
15+
"ultimate_use": list,
16+
"role": str}
17+
1518
super().__init__(data_schema, **kwargs)
19+
self.role = self.find_role()
20+
21+
def find_role(self):
1622

23+
roles_file = 'log_analyser/roles/roles.json'
24+
lang_folder = 'log_analyser/roles/lg'
1725

26+
roles_data = self.load_roles(roles_file)
27+
28+
role = self.find_character_role(self.name, roles_data, lang_folder)
29+
return role
1830
def add_played_time(self, data):
1931
self.played_time.append(data)
2032

33+
def add_start_time(self, data):
34+
35+
if len(self.played_time) > 0:
36+
if "end" not in self.played_time[-1] and self.played_time[-1]["start"] == data["start"]:
37+
pass
38+
else:
39+
self.played_time.append(data)
40+
41+
def add_end_time(self, data):
42+
if len(self.played_time) == 0:
43+
return -1
44+
self.played_time[-1]["end"] = data["end"]
45+
2146
def add_kill(self, data):
2247
self.kills.append(data)
2348

@@ -43,4 +68,26 @@ def add_ultimate_end(self, data):
4368
self.ultimate_use[-1]["end"] = data["end"]
4469

4570
def add_character_stats(self, data):
46-
self.stats = data
71+
self.stats = data
72+
73+
def load_roles(self, file_path):
74+
with open(file_path, 'r', encoding='utf-8') as file:
75+
roles_data = json.load(file)
76+
return roles_data
77+
78+
def find_character_role(self, character_name, roles_data, lang_folder):
79+
for role in roles_data:
80+
if character_name in roles_data[role]:
81+
return role
82+
else:
83+
for lang_file in os.listdir(lang_folder):
84+
lang_file_path = os.path.join(lang_folder, lang_file)
85+
if os.path.isfile(lang_file_path) and lang_file.endswith('.json'):
86+
with open(lang_file_path, 'r', encoding='utf-8') as file:
87+
lang_data = json.load(file)
88+
if character_name in lang_data:
89+
name = lang_data[character_name]
90+
for role in roles_data:
91+
if name in roles_data[role]:
92+
return role
93+
return None

src/log_analyser/objects/map.py

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from log_analyser.objects.round import Round
33
from log_analyser.objects.team import Team
44
from datetime import datetime
5-
5+
import os
6+
import json
67

78
class Map(Object):
89

@@ -46,7 +47,7 @@ def add_player(self, data):
4647
return -1
4748
else:
4849
self.rounds[self.actual_round].teams[data["team_name"]].add_player(
49-
{"name": data["player_name"], "characters": {}})
50+
{"name": data["player_name"], "characters": {}, "role": ""})
5051
# print("add player", data["player_name"])
5152
self.add_character(data)
5253
return 0
@@ -56,7 +57,7 @@ def add_character(self, data):
5657
if data["character_name"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters:
5758
return -2
5859
else:
59-
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": []})
60+
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": ""})
6061

6162
if len(self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_name"]].played_time) > 0:
6263
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 +112,25 @@ def add_player_stat(self, data):
111112
def add_hero_swap(self, data):
112113

113114
self.add_player(data)
115+
116+
character_swap_dict = data.copy()
117+
character_swap_dict["character_name"] = data["character_swap"]
118+
self.add_character(character_swap_dict)
119+
114120
if data["character_swap"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters:
115-
self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_swap"]].add_played_time({"end": data["time"]})
121+
self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_swap"]].add_start_time({"start": data["time"]})
122+
if data["character_name"] in self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters:
123+
self.rounds[self.actual_round].teams[data["team_name"]].players[data["player_name"]].characters[data["character_name"]].add_end_time({"end": data["time"]})
116124

117125
self.events.append({"type": "hero_swap", "timestamp": data["time"], "player": data["player_name"],
118-
"description": "{} swap on {}".format(data["player_name"], data["character_name"])})
126+
"description": "{} swap on {}".format(data["player_name"], data["character_swap"]), "hero": self.find_character_name_in_english(data["character_swap"])})
127+
128+
def add_hero_spawn(self, data):
129+
130+
self.add_player(data)
131+
self.events.append({"type": "hero_spawn", "timestamp": data["time"], "player": data["player_name"],
132+
"description": "{} spawn with {}".format(data["player_name"], data["character_name"]), "hero": self.find_character_name_in_english(data["character_name"])})
133+
119134
def create_if_player_and_caracter_not_exist(self, team, player_name, character_name):
120135

121136
if not player_name in self.rounds[self.actual_round].teams[team].players:
@@ -132,7 +147,7 @@ def add_ultimate_start(self, data):
132147
self.rounds[self.actual_round].teams[data[3]].players[data[4]].characters[data[5]].add_ultimate_start(ultimate_start_data)
133148

134149
self.events.append({"type": "ultimate", "timestamp": data[2], "player": data[4],
135-
"description": "{} use {} ultimate".format(data[4], data[5])})
150+
"description": "{} use {} ultimate".format(data[4], data[5]), "hero": self.find_character_name_in_english(data[5])})
136151

137152
def add_ultimate_end(self, data):
138153

@@ -167,10 +182,11 @@ def end_round(self, data):
167182
self.rounds[self.actual_round].end_time = data[2]
168183
for team in self.rounds[self.actual_round].teams:
169184
for player in self.rounds[self.actual_round].teams[team].players:
185+
170186
for character in self.rounds[self.actual_round].teams[team].players[player].characters:
171187
if not "end" in self.rounds[self.actual_round].teams[team].players[player].characters[character].played_time[-1]:
172188
self.rounds[self.actual_round].teams[team].players[player].characters[character].played_time[-1]["end"] = end_round_data["time"]
173-
189+
self.rounds[self.actual_round].teams[team].players[player].find_role()
174190

175191
self.team1_score = end_round_data["team1_score"]
176192
self.team2_score = end_round_data["team2_score"]
@@ -220,4 +236,29 @@ def aggregate_stats(self):
220236
players_data[player_name] = players_data.get(player_name, [])
221237
players_data[player_name].append({"round": index, "stats": aggregated_stats})
222238

223-
self.stats_graph = players_data
239+
self.stats_graph = players_data
240+
241+
def find_character_name_in_english(self, character_name):
242+
243+
folder_path = "log_analyser/roles/lg/"
244+
files = os.listdir(folder_path)
245+
246+
# Parcourir les fichiers
247+
for file_name in files:
248+
# Vérifier si le fichier est un fichier JSON
249+
if file_name.endswith('.json'):
250+
file_path = os.path.join(folder_path, file_name)
251+
with open(file_path, 'r', encoding='utf-8') as file:
252+
data = json.load(file)
253+
if character_name in data:
254+
return data[character_name]
255+
256+
with open("log_analyser/roles/roles.json", 'r', encoding='utf-8') as file:
257+
data = json.load(file)
258+
for key, value in data.items():
259+
if character_name in value:
260+
return character_name
261+
262+
263+
print("Character name not found in english : ", character_name)
264+
return ""

src/log_analyser/objects/player.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ class Player(Object):
77

88
def __init__(self, **kwargs) -> None:
99
data_schema = {"name": str,
10-
"characters": dict}
10+
"characters": dict,
11+
"role": str}
1112

1213
super().__init__(data_schema, **kwargs)
1314

@@ -16,3 +17,20 @@ def add_event(self, event):
1617

1718
def add_character(self, data):
1819
self.characters[data["name"]] = Character.from_json(data)
20+
21+
def find_role(self):
22+
23+
if self.name == "MrSully":
24+
pass
25+
roles_time = {"Tank": 0, "DPS": 0, "Support": 0}
26+
for character in self.characters:
27+
character_role = self.characters[character].role
28+
if character_role:
29+
for play_time in self.characters[character].played_time:
30+
if "end" in play_time and "start" in play_time:
31+
roles_time[character_role] += float(play_time["end"]) - float(play_time["start"])
32+
33+
if sum(roles_time.values()) == 0:
34+
self.role = "Unknown"
35+
else:
36+
self.role = max(roles_time, key=roles_time.get)

src/log_analyser/roles/lg/es.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"D.Va": "D.Va",
3+
"Doomfist": "Doomfist",
4+
"Junker Queen": "Junker Queen",
5+
"Mauga": "Mauga",
6+
"Orisa": "Orisa",
7+
"Ramattra": "Ramattra",
8+
"Reinhardt": "Reinhardt",
9+
"Roadhog": "Roadhog",
10+
"Sigma": "Sigma",
11+
"Winston": "Winston",
12+
"Wrecking Ball": "Wrecking Ball",
13+
"Zarya": "Zarya",
14+
"Ashe": "Ashe",
15+
"Bastion": "Bastion",
16+
"Cassidy": "Cassidy",
17+
"Echo": "Echo",
18+
"Genji": "Genji",
19+
"Hanzo": "Hanzo",
20+
"Chacal": "Junkrat",
21+
"Mei": "Mei",
22+
"Pharah": "Pharah",
23+
"Reaper": "Reaper",
24+
"Sojourn": "Sojourn",
25+
"Soldado: 76": "Soldier: 76",
26+
"Sombra": "Sombra",
27+
"Symmetra": "Symmetra",
28+
"Torbjörn": "Torbjörn",
29+
"Tracer": "Tracer",
30+
"Widowmaker": "Widowmaker",
31+
"Ana": "Ana",
32+
"Baptiste": "Baptiste",
33+
"Brigitte": "Brigitte",
34+
"Illari": "Illari",
35+
"Kiriko": "Kiriko",
36+
"Lifeweaver": "Lifeweaver",
37+
"Lúcio": "Lúcio",
38+
"Mercy": "Mercy",
39+
"Moira": "Moira",
40+
"Zenyatta": "Zenyatta"
41+
}

src/log_analyser/roles/lg/fr.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"D.Va": "D.Va",
3+
"Doomfist": "Doomfist",
4+
"Reine des Junkers": "Junker Queen",
5+
"Mauga": "Mauga",
6+
"Orisa": "Orisa",
7+
"Ramattra": "Ramattra",
8+
"Reinhardt": "Reinhardt",
9+
"Chopper": "Roadhog",
10+
"Sigma": "Sigma",
11+
"Winston": "Winston",
12+
"Bouldozer": "Wrecking Ball",
13+
"Zarya": "Zarya",
14+
"Ashe": "Ashe",
15+
"Bastion": "Bastion",
16+
"Cassidy": "Cassidy",
17+
"Écho": "Echo",
18+
"Genji": "Genji",
19+
"Hanzo": "Hanzo",
20+
"Chacal": "Junkrat",
21+
"Mei": "Mei",
22+
"Pharah": "Pharah",
23+
"Faucheur": "Reaper",
24+
"Sojourn": "Sojourn",
25+
"Soldat : 76": "Soldier: 76",
26+
"Sombra": "Sombra",
27+
"Symmetra": "Symmetra",
28+
"Torbjörn": "Torbjörn",
29+
"Tracer": "Tracer",
30+
"Fatale": "Widowmaker",
31+
"Ana": "Ana",
32+
"Baptiste": "Baptiste",
33+
"Brigitte": "Brigitte",
34+
"Illari": "Illari",
35+
"Kiriko": "Kiriko",
36+
"Vital": "Lifeweaver",
37+
"Lúcio": "Lúcio",
38+
"Ange": "Mercy",
39+
"Moira": "Moira",
40+
"Zenyatta": "Zenyatta"
41+
}

src/log_analyser/roles/roles.json

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"Tank": [
3+
"D.Va",
4+
"Doomfist",
5+
"Junker Queen",
6+
"Mauga",
7+
"Orisa",
8+
"Ramattra",
9+
"Reinhardt",
10+
"Roadhog",
11+
"Sigma",
12+
"Winston",
13+
"Wrecking Ball",
14+
"Zarya"
15+
],
16+
"DPS": [
17+
"Ashe",
18+
"Bastion",
19+
"Cassidy",
20+
"Echo",
21+
"Genji",
22+
"Hanzo",
23+
"Junkrat",
24+
"Mei",
25+
"Pharah",
26+
"Reaper",
27+
"Sojourn",
28+
"Soldier: 76",
29+
"Sombra",
30+
"Symmetra",
31+
"Torbjörn",
32+
"Tracer",
33+
"Widowmaker"
34+
],
35+
"Support": [
36+
"Ana",
37+
"Baptiste",
38+
"Brigitte",
39+
"Illari",
40+
"Kiriko",
41+
"Lifeweaver",
42+
"Lúcio",
43+
"Mercy",
44+
"Moira",
45+
"Zenyatta"
46+
]
47+
}

0 commit comments

Comments
 (0)