Skip to content

Commit 6f6e4de

Browse files
committed
Mise a jour des pronos et des fichiers + visualisation
1 parent 1bbff3f commit 6f6e4de

14 files changed

+262
-56
lines changed
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
4.74 KB
Binary file not shown.
437 Bytes
Binary file not shown.

app/_app.py

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import pronos as pr
99
import json
1010
import f1api
11-
from datetime import timedelta,datetime
11+
from datetime import timedelta
1212

1313

1414
@bot.event
@@ -63,19 +63,54 @@ async def helping_tools(interaction: discord.Interaction):
6363
@app_commands.describe(premier="Le premier", deuxieme="Le deuxième", troisieme="Le troisième", best_lap="Meilleur Tour")
6464
async def submit(interaction: discord.Interaction, premier: str, deuxieme: str, troisieme: str, best_lap: str):
6565
await interaction.response.defer(ephemeral=True)
66-
if (command_enabled):
66+
if command_enabled:
67+
try:
68+
success = pr.pronos(
69+
interaction.user.id,
70+
str(interaction.user),
71+
premier, deuxieme, troisieme, best_lap
72+
)
73+
except Exception as e:
74+
logger.exception("Erreur pendant l'enregistrement du prono qualif")
75+
await embed.Error(interaction, f"❌ Erreur pendant l'enregistrement du prono : `{e}`")
76+
return
6777

68-
if(pr.pronos(interaction.user.id, str(interaction.user),
69-
premier, deuxieme, troisieme, best_lap)):
70-
await interaction.followup.send("Ton prono a bien été pris en compte", ephemeral=True)
78+
if success:
79+
await interaction.followup.send("✅ Ton prono qualif a bien été pris en compte !", ephemeral=True)
80+
logger.info(f'{interaction.user} à fais son pronos course')
7181
else:
72-
await embed.Error(interaction, "Tu ne peux modifier ton pronostic qu'une fois")
73-
74-
82+
await embed.Error(interaction, "❌ Tu ne peux modifier ton pronostic qu'une seule fois.")
83+
else:
84+
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")
85+
86+
# _______________________________________________________________________________________________________________________________
7587

88+
@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)")
89+
@app_commands.describe(premier="Le premier", deuxieme="Le deuxième", troisieme="Le troisième")
90+
async def submit_qualif(interaction: discord.Interaction, premier: str, deuxieme: str, troisieme: str):
91+
await interaction.response.defer(ephemeral=True)
92+
93+
if command_enabled:
94+
try:
95+
success = pr.pronos_qualif(
96+
interaction.user.id,
97+
str(interaction.user),
98+
premier, deuxieme, troisieme
99+
)
100+
except Exception as e:
101+
logger.exception("Erreur pendant l'enregistrement du prono qualif")
102+
await embed.Error(interaction, f"❌ Erreur pendant l'enregistrement du prono : `{e}`")
103+
return
104+
105+
if success:
106+
await interaction.followup.send("✅ Ton prono qualif a bien été pris en compte !", ephemeral=True)
107+
logger.info(f'{interaction.user} à fais son pronos qualif')
108+
else:
109+
await embed.Error(interaction, "❌ Tu ne peux modifier ton pronostic qu'une seule fois.")
76110
else:
77111
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")
78112

113+
79114
# _______________________________________________________________________________________________________________________________
80115

81116
@tree.command(name="visualisation", description="Te montre tes pronos")

app/pronos.py

Lines changed: 158 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,36 @@
11
# Gestion des pronostiques, écriture et lecture
22
import json
33
import os
4+
import re
45
import discord
6+
import fastf1 as f1
7+
from datetime import datetime, timezone
8+
import pandas as pd
59
from config import logger
10+
import tools as tool
611

12+
def sanitize_filename(name):
13+
return re.sub(r'[^\w\-]', '_', name)
14+
15+
def country_fonction():
16+
year = datetime.now(timezone.utc).year
17+
calendar = f1.get_event_schedule(year)
18+
now = datetime.now(timezone.utc)
19+
20+
for row in calendar.itertuples():
21+
if pd.isna(row.Session5DateUtc):
22+
continue
23+
elif now <= row.Session5DateUtc.replace(tzinfo=timezone.utc):
24+
return sanitize_filename(row.Country)
25+
26+
return "Unknown" # fallback par défaut si rien trouvé
27+
728

829
def pronos(id: int, pseudo: str, premier: str, second: str, troisieme: str, bt: str):
9-
file_path = 'data/Pronos.json'
30+
31+
country = country_fonction()
32+
file_path = f'data/pronos_{country}.json'
33+
1034
if not os.path.exists(file_path):
1135
pronos_database = {
1236
str(id): {
@@ -31,7 +55,7 @@ def pronos(id: int, pseudo: str, premier: str, second: str, troisieme: str, bt:
3155
"Modif":False
3256
}
3357
else:
34-
if(pronos_database[str(id)]["Modif"] == True):
58+
if pronos_database[str(id)]["Modif"]:
3559
return False
3660
else:
3761

@@ -49,61 +73,148 @@ def pronos(id: int, pseudo: str, premier: str, second: str, troisieme: str, bt:
4973

5074
async def visualisation(interaction: discord.Interaction):
5175

52-
file_path = "data/Pronos.json"
53-
with open(file_path, 'r', encoding='utf-8') as f:
76+
try:
77+
country = country_fonction()
78+
file_path_course = f'data/pronos_{country}.json'
79+
file_path_qualif = f'data/pronos_{country}_qualifs.json'
80+
81+
tool.ensure_file_exists(file_path_course)
82+
tool.ensure_file_exists(file_path_qualif)
83+
84+
with open(file_path_course, 'r', encoding='utf-8') as f:
5485
pronos_database = json.load(f)
55-
56-
user = interaction.user.id
57-
58-
if str(user) in pronos_database:
59-
premier=pronos_database[str(user)]["1"]
60-
deuxieme=pronos_database[str(user)]["2"]
61-
troisieme=pronos_database[str(user)]["3"]
62-
best_lap=pronos_database[str(user)]["Best Lap"]
63-
modif=pronos_database[str(user)]["Modif"]
64-
86+
87+
with open(file_path_qualif, 'r', encoding='utf-8') as f:
88+
pronos_database_qualif = json.load(f)
89+
90+
except Exception as e:
91+
await interaction.followup.send(
92+
content=f"❌ Une erreur est survenue lors du chargement des fichiers : {e}",
93+
ephemeral=True
94+
)
95+
return
96+
97+
user_id = str(interaction.user.id)
98+
99+
# Protection si le JSON est vide ou corrompu
100+
if not isinstance(pronos_database, dict):
101+
pronos_database = {}
102+
103+
if not isinstance(pronos_database_qualif, dict):
104+
pronos_database_qualif = {}
105+
106+
# Cas : seulement prono course
107+
if user_id in pronos_database and user_id not in pronos_database_qualif:
108+
prono = pronos_database[user_id]
65109
embed = discord.Embed(
66-
title = f"🐐 Merci pour vos pronos {interaction.user} !",
67-
description="Voici tes pronostiques : ",
110+
title=f"🐐 Merci pour vos pronos {interaction.user} !",
68111
color=discord.Color.red()
69112
)
70-
71-
embed.add_field(name="Ton Premier 🥇 :", value=f"{premier}", inline=False)
72-
embed.add_field(name="Ton Deuxième 🥈 :", value=f"{deuxieme}", inline=False)
73-
embed.add_field(name="Ton Troisième 🥉 :", value=f"{troisieme}", inline=False)
74-
embed.add_field(name="Ton Meilleur Tour ⏱️ :", value=f"{best_lap}", inline=False)
75-
if(modif):
76-
value="❌ Tu as déja modifié ton pronostic par le passé"
77-
else:
78-
value="✅ Tu peux modifier ton pronostic en relançant /pronos_course"
79-
embed.add_field(name="Droit de modification :",value=value,inline=False)
80-
113+
embed.description = "Voici tes pronostics de course :"
114+
embed.add_field(name="Ton Premier 🥇 :", value=prono.get("1", "Non renseigné"), inline=False)
115+
embed.add_field(name="Ton Deuxième 🥈 :", value=prono.get("2", "Non renseigné"), inline=False)
116+
embed.add_field(name="Ton Troisième 🥉 :", value=prono.get("3", "Non renseigné"), inline=False)
117+
embed.add_field(name="Ton Meilleur Tour ⏱️ :", value=prono.get("Best Lap", "Non renseigné"), inline=False)
81118

82-
embed.set_footer(text="Bot créé par F1F Team", icon_url="https://cdn.discordapp.com/attachments/1339299411360088226/1367477935392428083/Votre_texte_de_paragraphe_12.png")
83-
embed.set_thumbnail(url=interaction.user.display_avatar.url)
84-
embed.set_image(url="https://cdn.discordapp.com/attachments/1339299411360088226/1368544420504272987/Design_sans_titre_2.png")
85-
119+
modif_text = "❌ Tu as déjà modifié ton pronostic par le passé" if prono.get("Modif", True) else "✅ Tu peux modifier ton pronostic en relançant /pronos_course"
120+
embed.add_field(name="Droit de modification :", value=modif_text, inline=False)
86121

87-
logger.info(f"{interaction.user.name} a regarder ses pronos course")
88-
89-
await interaction.followup.send(embed=embed, ephemeral=True)
90-
91-
92-
122+
# Cas : seulement prono qualif
123+
elif user_id in pronos_database_qualif and user_id not in pronos_database:
124+
prono = pronos_database_qualif[user_id]
125+
embed = discord.Embed(
126+
title=f"🐐 Merci pour vos pronos {interaction.user} !",
127+
color=discord.Color.red()
128+
)
129+
embed.description = "Voici tes pronostics de qualif :"
130+
embed.add_field(name="Ton Premier 🥇 :", value=prono.get("1", "Non renseigné"), inline=False)
131+
embed.add_field(name="Ton Deuxième 🥈 :", value=prono.get("2", "Non renseigné"), inline=False)
132+
embed.add_field(name="Ton Troisième 🥉 :", value=prono.get("3", "Non renseigné"), inline=False)
133+
134+
modif_text = "❌ Tu as déjà modifié ton pronostic par le passé" if prono.get("Modif", True) else "✅ Tu peux modifier ton pronostic en relançant /pronos_qualif"
135+
embed.add_field(name="Droit de modification :", value=modif_text, inline=False)
136+
137+
# Cas : les deux pronos existent
138+
elif user_id in pronos_database and user_id in pronos_database_qualif:
139+
pr_course = pronos_database[user_id]
140+
pr_qualif = pronos_database_qualif[user_id]
141+
embed = discord.Embed(
142+
title=f"🐐 Merci pour vos pronos {interaction.user} !",
143+
color=discord.Color.red()
144+
)
145+
146+
embed.description = "Voici tes pronostics complets :"
147+
148+
embed.add_field(name="**Qualif - Premier 🥇**", value=pr_qualif.get("1", "Non renseigné"), inline=False)
149+
embed.add_field(name="**Qualif - Deuxième 🥈**", value=pr_qualif.get("2", "Non renseigné"), inline=False)
150+
embed.add_field(name="**Qualif - Troisième 🥉**", value=pr_qualif.get("3", "Non renseigné"), inline=False)
151+
152+
embed.add_field(name="**Course - Premier 🥇**", value=pr_course.get("1", "Non renseigné"), inline=False)
153+
embed.add_field(name="**Course - Deuxième 🥈**", value=pr_course.get("2", "Non renseigné"), inline=False)
154+
embed.add_field(name="**Course - Troisième 🥉**", value=pr_course.get("3", "Non renseigné"), inline=False)
155+
embed.add_field(name="**Meilleur Tour ⏱️**", value=pr_course.get("Best Lap", "Non renseigné"), inline=False)
156+
157+
modif_q = "❌ Qualif déjà modifié" if pr_qualif.get("Modif", True) else "✅ Tu peux modifier ton prono Qualif (/pronos_qualif)"
158+
modif_c = "❌ Course déjà modifié" if pr_course.get("Modif", True) else "✅ Tu peux modifier ton prono Course (/pronos_course)"
159+
embed.add_field(name="Droits de modification :", value=f"{modif_q}\n{modif_c}", inline=False)
160+
161+
# Cas : aucun prono
93162
else:
94163
embed = discord.Embed(
95-
title = f"Désolé {interaction.user} !",
96-
description="On dirait que tu n'as pas encore fait de pronostique",
164+
title=f"Désolé {interaction.user} !",
165+
description="On dirait que tu n'as pas encore fait de pronostic.",
97166
color=discord.Color.red()
98167
)
99-
100-
embed.set_footer(text="Bot créé par F1F Team", icon_url="https://cdn.discordapp.com/attachments/1339299411360088226/1367477935392428083/Votre_texte_de_paragraphe_12.png")
101-
embed.set_thumbnail(url=interaction.user.display_avatar.url)
102-
embed.set_image(url="https://cdn.discordapp.com/attachments/1339299411360088226/1368544420504272987/Design_sans_titre_2.png")
103-
logger.info(f"{interaction.user.name} a tenter de regarder ses pronos course alors qu'il n'en avais pas fais")
104-
await interaction.followup.send(embed=embed, ephemeral=True)
105-
106-
168+
169+
# Envoi final
170+
await interaction.followup.send(embed=embed, ephemeral=True)
171+
logger.info(f"{interaction.user} à visualisé ses pronos.")
172+
173+
174+
def pronos_qualif(id: int, pseudo: str, premier: str, second: str, troisieme: str):
175+
176+
country = country_fonction()
177+
file_path = f'data/pronos_{country}_qualifs.json'
178+
179+
if not os.path.exists(file_path):
180+
pronos_database = {
181+
str(id): {
182+
"Pseudo": pseudo,
183+
"1": premier,
184+
"2": second,
185+
"3": troisieme,
186+
"Modif":False
187+
}
188+
}
189+
else:
190+
with open(file_path, 'r', encoding='utf-8') as f:
191+
pronos_database = json.load(f)
192+
if str(id) not in pronos_database:
193+
pronos_database[str(id)] = {
194+
"Pseudo": pseudo,
195+
"1": premier,
196+
"2": second,
197+
"3": troisieme,
198+
"Modif":False
199+
}
200+
else:
201+
if pronos_database[str(id)]["Modif"]:
202+
return False
203+
else:
204+
205+
pronos_database[str(id)]["Pseudo"] = pseudo
206+
pronos_database[str(id)]["1"] = premier
207+
pronos_database[str(id)]["2"] = second
208+
pronos_database[str(id)]["3"] = troisieme
209+
pronos_database[str(id)]["Modif"] = True
210+
211+
212+
with open(file_path, 'w', encoding='utf-8') as f:
213+
json.dump(pronos_database, f, ensure_ascii=False, indent=4)
214+
return True
215+
216+
217+
107218

108219

109220

app/tools.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import json
99
from error_embed import info_embed, no_prono
1010

11+
def ensure_file_exists(path):
12+
if not os.path.exists(path):
13+
with open(path, 'w', encoding='utf-8') as f:
14+
json.dump({}, f)
1115

1216

1317
async def help(interaction: discord.Interaction):

0 commit comments

Comments
 (0)