55from config import logger , EMBED_COLOR_RED , EMBED_THUMBNAIL , EMBED_FOOTER_TEXT , EMBED_IMAGE
66import pronos as pr
77
8+
89def load_json_file (path ):
910 """Charge un fichier JSON, retourne un dict vide si fichier absent ou invalide."""
1011 if not os .path .exists (path ):
@@ -17,6 +18,7 @@ def load_json_file(path):
1718 logger .error (f"Erreur lors du chargement du fichier { path } : { e } " )
1819 return {}
1920
21+
2022def match_position (entry : str , target : str , threshold : int ) -> bool :
2123 """Compare les noms avec tolérance, utilise fuzzy matching sur prénom ou nom."""
2224 parts = entry .strip ().split (' ' , 1 )
@@ -34,6 +36,7 @@ def match_position(entry: str, target: str, threshold: int) -> bool:
3436 return (fuzz .ratio (target_prenom .lower (), prenom .lower ()) >= 90 or
3537 fuzz .ratio (target_nom .lower (), nom .lower ()) >= threshold )
3638
39+
3740def save_results (race_type ):
3841 """
3942 race_type doit être une des chaînes : 'Qualif', 'CourseSprint', 'Course'
@@ -48,11 +51,13 @@ def save_results(race_type):
4851 barem = load_json_file ('data/Barem.json' )
4952
5053 if not results or not pronos or not barem :
51- logger .info ("Fichiers nécessaires absents ou invalides, arrêt de la fonction." )
54+ logger .info (
55+ "Fichiers nécessaires absents ou invalides, arrêt de la fonction." )
5256 return
5357
5458 if race_type not in barem :
55- logger .error (f"Type de course '{ race_type } ' non supporté dans le barème." )
59+ logger .error (
60+ f"Type de course '{ race_type } ' non supporté dans le barème." )
5661 return
5762
5863 bar = barem [race_type ]
@@ -69,61 +74,73 @@ def save_results(race_type):
6974
7075 logger .info (f"Calcul des points pour l'utilisateur { key } ({ pseudo } )" )
7176
72- premier_in_top3 = premier in [user_pronos .get ('1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
73- second_in_top3 = second in [user_pronos .get ('1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
74- troisieme_in_top3 = troisieme in [user_pronos .get ('1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
77+ premier_in_top3 = premier in [user_pronos .get (
78+ '1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
79+ second_in_top3 = second in [user_pronos .get (
80+ '1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
81+ troisieme_in_top3 = troisieme in [user_pronos .get (
82+ '1' , '' ), user_pronos .get ('2' , '' ), user_pronos .get ('3' , '' )]
7583
7684 premier_correct = match_position (user_pronos .get ('1' , '' ), premier , 90 )
7785 second_correct = match_position (user_pronos .get ('2' , '' ), second , 90 )
78- troisieme_correct = match_position (user_pronos .get ('3' , '' ), troisieme , 90 )
86+ troisieme_correct = match_position (
87+ user_pronos .get ('3' , '' ), troisieme , 90 )
7988
8089 all_correct = premier_correct and second_correct and troisieme_correct
8190
8291 if all_correct :
8392 points += bar .get ('allCorrect' , 0 )
84- logger .info (f"Tout juste pour { pseudo } , +{ bar .get ('allCorrect' , 0 )} pts" )
93+ logger .info (
94+ f"Tout juste pour { pseudo } , +{ bar .get ('allCorrect' , 0 )} pts" )
8595 else :
8696 if premier_correct :
8797 points += bar .get ('correctPosition' , 0 )
88- logger .info (f"Premier à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
98+ logger .info (
99+ f"Premier à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
89100 elif premier_in_top3 :
90101 points += bar .get ('inTop3' , 0 )
91- logger .info (f"Premier dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
102+ logger .info (
103+ f"Premier dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
92104
93105 if second_correct :
94106 points += bar .get ('correctPosition' , 0 )
95- logger .info (f"Deuxième à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
107+ logger .info (
108+ f"Deuxième à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
96109 elif second_in_top3 :
97110 points += bar .get ('inTop3' , 0 )
98- logger .info (f"Deuxième dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
111+ logger .info (
112+ f"Deuxième dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
99113
100114 if troisieme_correct :
101115 points += bar .get ('correctPosition' , 0 )
102- logger .info (f"Troisième à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
116+ logger .info (
117+ f"Troisième à la bonne place pour { pseudo } , +{ bar .get ('correctPosition' , 0 )} pts" )
103118 elif troisieme_in_top3 :
104119 points += bar .get ('inTop3' , 0 )
105- logger .info (f"Troisième dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
120+ logger .info (
121+ f"Troisième dans le top 3 pour { pseudo } , +{ bar .get ('inTop3' , 0 )} pts" )
106122
107123 if key not in leaderboard :
108124 leaderboard [key ] = {"Pseudo" : pseudo , "Points" : points }
109125 else :
110126 leaderboard [key ]["Points" ] += points
111127
112-
113128 try :
114129 with open (leaderboard_path , 'w' , encoding = 'utf-8' ) as f :
115130 json .dump (leaderboard , f , ensure_ascii = False , indent = 4 )
116- logger .info (f"Leaderboard mis à jour avec { len (leaderboard )} utilisateurs." )
131+ logger .info (
132+ f"Leaderboard mis à jour avec { len (leaderboard )} utilisateurs." )
117133 except Exception as e :
118134 logger .error (f"Erreur lors de la sauvegarde du leaderboard: { e } " )
119-
120-
135+
136+
121137def Leaderboard ():
122138 try :
123139 with open ("data/Leaderbord.json" , 'r' , encoding = 'utf-8' ) as f :
124140 pointsPronos = json .load (f )
125141 pronosLeaderboard = dict (
126- sorted (pointsPronos .items (), key = lambda item : item [1 ]['Points' ], reverse = True )
142+ sorted (pointsPronos .items (),
143+ key = lambda item : item [1 ]['Points' ], reverse = True )
127144 )
128145 except FileNotFoundError :
129146 logger .info ("The file doesn't exist" )
@@ -148,7 +165,8 @@ def Leaderboard():
148165
149166 # Extraction sécurisée des pseudos et points
150167 try :
151- pseudos , points = zip (* [(val ['Pseudo' ], val ['Points' ]) for val in pronosLeaderboard .values ()])
168+ pseudos , points = zip (* [(val ['Pseudo' ], val ['Points' ])
169+ for val in pronosLeaderboard .values ()])
152170 except ValueError :
153171 logger .info ("Erreur lors de l'extraction des pseudos et points." )
154172 return None
0 commit comments