From 828c4dc70e0eed63c7e15fefba67401131a13a1e Mon Sep 17 00:00:00 2001 From: Simon Junod Date: Fri, 8 Aug 2025 17:59:27 +0200 Subject: [PATCH] ... --- run.py | 11 ++++++++--- spoutnik.py | 31 +++++++++++++++++++------------ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/run.py b/run.py index a1a1819..a75a2e2 100755 --- a/run.py +++ b/run.py @@ -15,8 +15,11 @@ from emojis import * from settings import * intents = nextcord.Intents.default() +# noinspection PyDunderSlots,PyUnresolvedReferences intents.typing = False +# noinspection PyDunderSlots,PyUnresolvedReferences intents.presences = False +# noinspection PyDunderSlots,PyUnresolvedReferences intents.message_content = True bot = nextcord.Client(intents=intents) @@ -45,6 +48,7 @@ async def on_ready(): print(f"Écoute pour Spoutnik sur {channel.guild} > {channel.name}") current_date = None + events_done = [] while True: await asyncio.sleep(HEARTBEAT) now = datetime.now() @@ -63,7 +67,7 @@ async def on_ready(): await wordle_game.reset() elif event[0] == SPOUTNIK: for spoutnik_game in spoutnik_games.values(): - await spoutnik_game.reset() + await spoutnik_game.reset(preset=SPOUTNIK_PRESETS[event[2]], force=False) # Receiving a message @@ -104,9 +108,9 @@ async def on_message(message): output += f"{spoutnik_game.channel.guild} > {spoutnik_game.channel.name} : {spoutnik_game.target}\n" await message.author.send(output) - if regex := re.search(r"^[sS]poutnik reset ([0-9]+)$", content_lowercase): + if regex := re.search(r"^[sS]poutnik reset ([0-9]+) (.+)$", content_lowercase): channel_id = int(regex.group(1)) - await spoutnik_games[channel_id].reset() + await spoutnik_games[channel_id].reset(preset=SPOUTNIK_PRESETS[regex.group(2).strip()], force=True) if re.search(r"^[eE]phemeris$", content_lowercase): embed = ephemeris.digest() @@ -244,6 +248,7 @@ async def on_message(message): poll = polls.Poll() poll.owner = message.author poll.intro = intro + letter = None for part in parts: if re.fullmatch(bullet, part): # the part is a bullet letter = part[0].lower() diff --git a/spoutnik.py b/spoutnik.py index c2f0447..5dbe5b2 100644 --- a/spoutnik.py +++ b/spoutnik.py @@ -43,6 +43,7 @@ class Game: def __init__(self, channel): self.channel = channel self.target = None + self.preset = None self.file = f"/tmp/spoutnik_{channel}.jpg" self.winner = None self.last_player = None @@ -50,22 +51,27 @@ class Game: self.resetters = set() self.jump_url = None - async def reset(self): + async def reset(self, preset, force=False): + if not force and not self.winner and self.last_datetime and (datetime.now() - self.last_datetime).total_seconds() < SPOUTNIK_EXPIRY_TIMEOUT: + return + output = "" + self.preset = preset + zoom = self.preset["zoom"] if self.target and not self.winner: - output = f":expressionless: Le lieu précédent était [ici]().\n\n" - random_lat, random_lon = random_point(SPOUTNIK_FILE) - tile_x, tile_y = wgs84_to_tile(random_lat, random_lon, SPOUTNIK_ZOOM) - req = requests.get(f"https://khms2.google.com/kh/v=1000?x={tile_x}&y={tile_y}&z={SPOUTNIK_ZOOM}") + output = f":expressionless: Le lieu précédent était [ici]().\n\n" + random_lat, random_lon = random_point(self.preset["geojson_file"]) + tile_x, tile_y = wgs84_to_tile(random_lat, random_lon, zoom) + req = requests.get(f"https://khms2.google.com/kh/v=1000?x={tile_x}&y={tile_y}&z={zoom}") with open(self.file, "wb") as f: f.write(req.content) - self.target = tile_to_wgs84(tile_x + 0.5, tile_y + 0.5, SPOUTNIK_ZOOM) + self.target = tile_to_wgs84(tile_x + 0.5, tile_y + 0.5, zoom) self.winner = None self.last_player = None self.last_datetime = None self.resetters = set() - output += f":satellite_orbital: Il y a un nouveau lieu à trouver !" - output += f"\n\nDonnez-moi les coordonnées GPS du centre de l'image, à {SPOUTNIK_MAX_DISTANCE} m près." + output += f":satellite_orbital: Il y a un nouveau lieu à trouver ! Le terrain de jeu est {self.preset["label"]}." + output += f"\n\nDonnez-moi les coordonnées GPS du centre de l'image, à {self.preset["max_distance"]} m près." output += f"\n\n*Sur le site Google Maps, clic droit puis clic sur les coordonnées.*" output += f"\n*Sur l'app Google Maps, appui long puis appui sur les coordonnées.*" self.jump_url = (await self.channel.send(output, file=File(self.file))).jump_url @@ -80,7 +86,7 @@ class Game: self.resetters.add(message.author) await self.channel.send(f"Réinitialisation : {len(self.resetters)}/{SPOUTNIK_RESETTERS_NEEDED}") if len(self.resetters) >= SPOUTNIK_RESETTERS_NEEDED: - await self.reset() + await self.reset(preset=self.preset, force=True) return # if somebody has already won, return silently @@ -114,17 +120,18 @@ class Game: distance = geodesic((lat, lon), self.target).meters blurred_distance = f"{ceil(distance / 1000)} km" if distance > 1000 else f"{ceil(distance / 100) * 100} m" - if distance <= SPOUTNIK_MAX_DISTANCE: + zoom = self.preset["zoom"] + if distance <= self.preset["max_distance"]: self.winner = message.author self.resetters = set() output = f":trophy: YOUPI ! {message.author.mention} a trouvé le lieu ! :trophy:" - output += f"\n\n[Lieu exact]()" + output += f"\n\n[Lieu exact]()" await self.channel.send(output) else: try: address = clean_address(geolocator.reverse((lat, lon), language="fr").address) except ValueError: address = "un lieu apparemment invalide" - output = f"{message.author.mention} propose [un point]() proche de {address}." + output = f"{message.author.mention} propose [un point]() proche de {address}." output += f"\n\nC'est pas ça chef, mais tu es à moins de {blurred_distance} de [la cible](<{self.jump_url}>) !" await self.channel.send(output) \ No newline at end of file