choix du preset par les resetteurs
This commit is contained in:
43
spoutnik.py
43
spoutnik.py
@@ -11,6 +11,8 @@ from geopy.distance import geodesic
|
||||
from geopy.geocoders import Nominatim
|
||||
from math import sinh, atan, pi, log, tan, cos, ceil
|
||||
from PIL import Image
|
||||
from itertools import chain
|
||||
from tabulate import tabulate
|
||||
|
||||
geolocator = Nominatim(user_agent="discord-bot-spoutnik")
|
||||
|
||||
@@ -49,7 +51,7 @@ class Game:
|
||||
self.winner = None
|
||||
self.last_player = None
|
||||
self.last_datetime = None
|
||||
self.resetters = set()
|
||||
self.reset_data = {key.lower(): [value["label"], set()] for key, value in SPOUTNIK_PRESETS.items()}
|
||||
self.jump_url = None
|
||||
|
||||
async def reset(self, preset, force=False):
|
||||
@@ -81,7 +83,7 @@ class Game:
|
||||
self.winner = None
|
||||
self.last_player = None
|
||||
self.last_datetime = None
|
||||
self.resetters = set()
|
||||
self.reset_data = {key.lower(): [value["label"], set()] for key, value in SPOUTNIK_PRESETS.items()}
|
||||
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.*"
|
||||
@@ -92,17 +94,32 @@ class Game:
|
||||
guess = unidecode(message.content.strip()).upper()
|
||||
|
||||
# if it's the special keyword 'reset', consider resetting
|
||||
if guess == "RESET" and SPOUTNIK_RESETTERS_NEEDED != 0:
|
||||
if message.author in self.resetters:
|
||||
if (regex := re.match(r"^RESET( [A-Z]+)?$", guess)) and SPOUTNIK_RESETTERS_NEEDED != 0:
|
||||
if message.author in set(chain.from_iterable(value[1] for value in self.reset_data.values())):
|
||||
await self.channel.send(f"{message.author.mention} : tu as déjà proposé une réinitialisation")
|
||||
return
|
||||
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:
|
||||
try:
|
||||
preset = self.preset
|
||||
except NameError:
|
||||
preset = list(SPOUTNIK_PRESETS)[0]
|
||||
await self.reset(preset=preset, force=True)
|
||||
|
||||
choice = (regex.group(1) or "").strip().lower()
|
||||
if choice not in self.reset_data.keys():
|
||||
options = []
|
||||
for key, value in self.reset_data.items():
|
||||
options.append(f"* `{key}` : {value[0]}")
|
||||
await self.channel.send(f"{message.author.mention} : je ne connais pas ce preset, les options sont :\n{'\n'.join(options)}")
|
||||
return
|
||||
|
||||
self.reset_data[choice][1].add(message.author)
|
||||
|
||||
chosen = None
|
||||
table = []
|
||||
for key, value in self.reset_data.items():
|
||||
table.append([key, value[0], f"{len(value[1])}/{SPOUTNIK_RESETTERS_NEEDED}"])
|
||||
if len(value[1]) >= SPOUTNIK_RESETTERS_NEEDED:
|
||||
chosen = key
|
||||
table = "```\n" + tabulate(table, tablefmt="rounded_grid") + "\n```"
|
||||
await self.channel.send(f"Réinitialisation :\n{table}")
|
||||
|
||||
if chosen:
|
||||
await self.reset(preset=SPOUTNIK_PRESETS[chosen], force=True)
|
||||
return
|
||||
|
||||
# if somebody has already won, return silently
|
||||
@@ -139,7 +156,7 @@ class Game:
|
||||
zoom = self.preset["zoom"]
|
||||
if distance <= self.preset["max_distance"]:
|
||||
self.winner = message.author
|
||||
self.resetters = set()
|
||||
self.reset_data = set()
|
||||
output = f":trophy: YOUPI ! {message.author.mention} a trouvé le lieu ! :trophy:"
|
||||
output += f"\n\n[Lieu exact](<https://www.google.ch/maps/@{self.target[0]},{self.target[1]},{zoom+1}z>)"
|
||||
await self.channel.send(output)
|
||||
|
||||
Reference in New Issue
Block a user