Skip to content

Commit 02b3baa

Browse files
committed
fusion commande pronos en une fonctionnelle
1 parent c2c6206 commit 02b3baa

File tree

12 files changed

+292
-226
lines changed

12 files changed

+292
-226
lines changed
-420 Bytes
Binary file not shown.
-2.55 KB
Binary file not shown.

app/_app.py

Lines changed: 10 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,18 @@ async def helping_tools(interaction: discord.Interaction):
4949
best_lap="Meilleur tour (uniquement pour Course et Sprint, optionnel pour Qualif)"
5050
)
5151
async def submit(interaction: discord.Interaction,
52-
statue: str,
52+
statue: Literal["Course", "Qualif", "Sprint", "Sprint_Qualif"],
5353
premier: str,
5454
deuxieme: str,
5555
troisieme: str,
5656
best_lap: str = None):
5757
await interaction.response.defer(ephemeral=True)
58+
STATUSES_VALIDES = ["qualif", "course", "sprint", "sprint_qualif"]
5859
statue_lower = statue.lower()
59-
if statue_lower not in ["Qualif", "Course", "Sprint", "Sprint_Qualif"]:
60-
await embed.Error(interaction, "❌ Statue invalide. Choisis parmi : Qualif, Course, Sprint.")
60+
61+
if statue_lower not in STATUSES_VALIDES:
62+
readable = ", ".join([s.capitalize() for s in STATUSES_VALIDES])
63+
await embed.Error(interaction, f"❌ Statue invalide. Choisis parmi : {readable}.")
6164
return
6265

6366
if statue_lower in ["Course", "Sprint"] and not best_lap:
@@ -70,14 +73,13 @@ async def submit(interaction: discord.Interaction,
7073

7174
if command_enabled:
7275
try:
73-
success = pr.pronos_race(
74-
interaction.user.id,
75-
str(interaction.user),
76+
success = pr.pronos_generic(
77+
str(interaction.user), # pseudo
7678
premier,
7779
deuxieme,
7880
troisieme,
79-
best_lap,
80-
statue_lower
81+
statue_lower,
82+
best_lap
8183
)
8284
except Exception as e:
8385
logger.exception("Erreur pendant l'enregistrement du prono")
@@ -95,61 +97,6 @@ async def submit(interaction: discord.Interaction,
9597
# _______________________________________________________________________________________________________________________________
9698

9799

98-
@tree.command(name="pronos_qualif", description="Enregistre tes pronos ou modifie les si tu l'a déja fait par le passé(max 1 fois)")
99-
@app_commands.describe(premier="Le premier", deuxieme="Le deuxième", troisieme="Le troisième")
100-
async def submit_qualif(interaction: discord.Interaction, premier: str, deuxieme: str, troisieme: str):
101-
await interaction.response.defer(ephemeral=True)
102-
103-
if command_enabled:
104-
try:
105-
success = pr.pronos_qualif(
106-
interaction.user.id,
107-
str(interaction.user),
108-
premier, deuxieme, troisieme
109-
)
110-
except Exception as e:
111-
logger.exception("Erreur pendant l'enregistrement du prono qualif")
112-
await embed.Error(interaction, f"❌ Erreur pendant l'enregistrement du prono : `{e}`")
113-
return
114-
115-
if success:
116-
await interaction.followup.send("✅ Ton prono qualif a bien été pris en compte !", ephemeral=True)
117-
logger.info(f'{interaction.user} à fais son pronos qualif')
118-
else:
119-
await embed.Error(interaction, "❌ Tu ne peux modifier ton pronostic qu'une seule fois.")
120-
else:
121-
await embed.Error(interaction, "Il y a une heure pour tout faire, et celle ci n'est pas pour les pronos. Par conséquent ton prono n'a pas pu être enregistré. Si tu veux être notifié des prochaines sessions, utilise /role")
122-
123-
# _______________________________________________________________________________________________________________________________
124-
125-
126-
@tree.command(name="pronos_sprint", description="Enregistre tes pronos ou modifie les si tu l'a déja fait par le passé(max 1 fois)")
127-
@app_commands.describe(premier="Le premier", deuxieme="Le deuxième", troisieme="Le troisième", best_lap="Meilleur Tour")
128-
async def submit_sprint(interaction: discord.Interaction, premier: str, deuxieme: str, troisieme: str, best_lap: str):
129-
await interaction.response.defer(ephemeral=True)
130-
if command_enabled:
131-
try:
132-
success = pr.pronos_sprint(
133-
interaction.user.id,
134-
str(interaction.user),
135-
premier, deuxieme, troisieme, best_lap
136-
)
137-
except Exception as e:
138-
logger.exception("Erreur pendant l'enregistrement du prono sprint")
139-
await embed.Error(interaction, f"❌ Erreur pendant l'enregistrement du prono : `{e}`")
140-
return
141-
142-
if success:
143-
await interaction.followup.send("✅ Ton prono sprint a bien été pris en compte !", ephemeral=True)
144-
logger.info(f'{interaction.user} à fais son pronos course sprint')
145-
else:
146-
await embed.Error(interaction, "❌ Tu ne peux modifier ton pronostic qu'une seule fois.")
147-
else:
148-
await embed.Error(interaction, "Il y a une heure pour tout faire, et celle ci n'est pas pour les pronos. Par conséquent ton prono n'a pas pu être enregistré. Si tu veux être notifié des prochaines sessions, utilise /role")
149-
150-
# _______________________________________________________________________________________________________________________________
151-
152-
153100
@tree.command(name="visualisation", description="Te montre tes pronos")
154101
async def visu(interaction: discord.Interaction):
155102
await interaction.response.defer(ephemeral=True)

app/f1api.py

Lines changed: 76 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,74 +3,89 @@
33
import pandas as pd
44
import json
55
from config import logger
6+
import os
67

8+
os.makedirs('cache_fastf1', exist_ok=True)
9+
f1.Cache.enable_cache('cache_fastf1')
710

811
def getNextEvent():
912
year = datetime.now(timezone.utc).year
1013
calendar = f1.get_event_schedule(year)
11-
time = datetime.now(timezone.utc)
14+
now = datetime.now(timezone.utc)
15+
16+
print("Colonnes du calendrier :", calendar.columns) # print des colonnes pour vérifier
17+
1218
for row in calendar.itertuples():
13-
if (pd.isna(row.Session4DateUtc)):
14-
logger.info("Pas de Date pour la qualif à "+row.Location)
15-
elif (time > row.Session4Date):
16-
logger.info(row.Location + " est passé (Qualif)")
17-
else:
18-
logger.info("Prochaine Session Qualif à "+row.Location)
19-
session = {
20-
"Round": str(row.Index),
21-
"Country": row.Country,
22-
"Location": row.Location,
23-
"Session": 'Q',
24-
"Date": row.Session4DateUtc.strftime("%d/%m/%Y,%H:%M:%S"),
25-
"Saison": datetime.now(timezone.utc).year
26-
}
27-
with open('data/Session.json', 'w', encoding='utf-8') as f:
28-
json.dump(session, f, ensure_ascii=False, indent=4)
29-
break
30-
if (pd.isna(row.Session5DateUtc)):
31-
logger.info("Pas de Date pour la course à "+row.Location)
32-
elif (time > row.Session5Date):
33-
logger.info(row.Location + " est passé (Course)")
34-
else:
35-
logger.info("Prochaine Course à "+row.Location)
36-
session = {
37-
"Round": row.Index,
38-
"Country": row.Country,
39-
"Location": row.Location,
40-
"Session": 'R',
41-
"Date": row.Session5DateUtc.strftime("%d/%m/%Y,%H:%M:%S"),
42-
"Saison": datetime.now(timezone.utc).year
43-
}
44-
with open('data/Session.json', 'w', encoding='utf-8') as f:
45-
json.dump(session, f, ensure_ascii=False, indent=4)
46-
break
47-
if (pd.isna(row.Session6DateUtc)):
48-
logger.info("Pas de Date pour la course Sprint à "+row.Location)
49-
elif (time > row.Session6Date):
50-
logger.info(row.Location + " est passé (Course)")
51-
else:
52-
logger.info("Prochaine Course Sprint à "+row.Location)
53-
session = {
54-
"Round": row.Index,
55-
"Country": row.Country,
56-
"Location": row.Location,
57-
"Session": 'S',
58-
"Date": row.Session5DateUtc.strftime("%d/%m/%Y,%H:%M:%S"),
59-
"Saison": datetime.now(timezone.utc).year
19+
round_number = row.Index
20+
country = row.Country
21+
location = row.Location
22+
23+
# On parcourt toutes les sessions et on cherche leur nom pour savoir laquelle est le sprint, qualif, etc.
24+
sessions = []
25+
for i in range(1, 6): # Session1 à Session5
26+
session_name = getattr(row, f'Session{i}', None)
27+
session_date = getattr(row, f'Session{i}DateUtc', None)
28+
29+
if session_name is None or session_date is None:
30+
continue
31+
32+
# On associe les codes aux noms des sessions
33+
code = None
34+
if "Race" in session_name:
35+
code = "R"
36+
elif "Sprint" in session_name:
37+
code = "S"
38+
elif "Qualifying" in session_name:
39+
code = "Q"
40+
elif "Practice" in session_name:
41+
code = "P"
42+
43+
if code:
44+
sessions.append((code, session_date))
45+
46+
for session_code, session_date in sessions:
47+
if pd.isna(session_date):
48+
logger.info(f"[{country}] Pas de date pour la session '{session_code}'")
49+
continue
50+
51+
# ✅ Correction ici : forcer la timezone si manquante
52+
if session_date.tzinfo is None:
53+
session_date = session_date.replace(tzinfo=timezone.utc)
54+
55+
if now > session_date:
56+
logger.info(f"[{country}] Session '{session_code}' déjà passée")
57+
continue
58+
59+
session_data = {
60+
"Round": round_number,
61+
"Country": country,
62+
"Location": location,
63+
"Session": session_code,
64+
"Date": session_date.strftime("%d/%m/%Y,%H:%M:%S"),
65+
"Saison": year
6066
}
67+
68+
os.makedirs('data', exist_ok=True)
6169
with open('data/Session.json', 'w', encoding='utf-8') as f:
62-
json.dump(session, f, ensure_ascii=False, indent=4)
63-
break
70+
json.dump(session_data, f, ensure_ascii=False, indent=4)
6471

72+
logger.info(f"[{country}] Prochaine session trouvée : {session_code} à {location}")
73+
return
6574

75+
logger.warning("Aucune session future trouvée dans le calendrier.")
76+
6677
def getResults():
6778
with open('data/Session.json', 'r', encoding='utf-8') as f:
6879
data = json.load(f)
6980

7081
country = data.get('Country', 'unknown').lower()
71-
session_type = data.get("Session", "") # garder la casse telle quelle
82+
session_type = data.get("Session", "") # garder la casse
7283

73-
session = f1.get_session(data['Saison'], data["Location"], data["Session"])
84+
try:
85+
session = f1.get_session(data['Saison'], data["Round"], session_type)
86+
except Exception as e:
87+
logger.error(f"Erreur lors de la récupération de la session : {e}")
88+
return 5
7489

7590
if not session.f1_api_support:
7691
logger.info("L'API FastF1 n'est pas disponible pour cette session.")
@@ -86,23 +101,27 @@ def getResults():
86101
logger.warning("Les résultats ne sont pas encore disponibles.")
87102
return 1
88103

104+
if len(session.results) < 3:
105+
logger.warning("Pas assez de résultats pour un top 3.")
106+
return 1
107+
89108
try:
90109
number = session.laps.pick_fastest().DriverNumber
91-
row = session.results.loc[session.results.DriverNumber == str(number)]
92-
driver = row.FullName.values[0]
110+
row = session.results[session.results.DriverNumber == str(number)]
111+
driver = row.FullName.values[0] if not row.empty else "Inconnu"
93112

94113
result = {
95114
"1": session.results.FullName.iloc[0],
96115
"2": session.results.FullName.iloc[1],
97116
"3": session.results.FullName.iloc[2],
98-
"Best Lap": driver
117+
"Best Lap": driver,
118+
"timestamp": datetime.now().isoformat()
99119
}
100120

101-
except (ValueError, IndexError) as e:
121+
except Exception as e:
102122
logger.warning(f"Erreur dans le traitement des résultats : {e}")
103123
return 1
104124

105-
# Choix du fichier selon le type exact de session
106125
if session_type == "Q":
107126
filename = f'data/Results_Qualif_{country}.json'
108127
elif session_type == "S":

0 commit comments

Comments
 (0)