choix du preset par les resetteurs
This commit is contained in:
@@ -23,6 +23,7 @@ dependencies = [
|
|||||||
"requests==2.31.0",
|
"requests==2.31.0",
|
||||||
"shapely>=2.1.1",
|
"shapely>=2.1.1",
|
||||||
"soupsieve==2.5",
|
"soupsieve==2.5",
|
||||||
|
"tabulate>=0.9.0",
|
||||||
"typing-extensions==4.11.0",
|
"typing-extensions==4.11.0",
|
||||||
"unidecode==1.3.8",
|
"unidecode==1.3.8",
|
||||||
"urllib3==2.2.1",
|
"urllib3==2.2.1",
|
||||||
|
|||||||
43
spoutnik.py
43
spoutnik.py
@@ -11,6 +11,8 @@ from geopy.distance import geodesic
|
|||||||
from geopy.geocoders import Nominatim
|
from geopy.geocoders import Nominatim
|
||||||
from math import sinh, atan, pi, log, tan, cos, ceil
|
from math import sinh, atan, pi, log, tan, cos, ceil
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
from itertools import chain
|
||||||
|
from tabulate import tabulate
|
||||||
|
|
||||||
geolocator = Nominatim(user_agent="discord-bot-spoutnik")
|
geolocator = Nominatim(user_agent="discord-bot-spoutnik")
|
||||||
|
|
||||||
@@ -49,7 +51,7 @@ class Game:
|
|||||||
self.winner = None
|
self.winner = None
|
||||||
self.last_player = None
|
self.last_player = None
|
||||||
self.last_datetime = 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
|
self.jump_url = None
|
||||||
|
|
||||||
async def reset(self, preset, force=False):
|
async def reset(self, preset, force=False):
|
||||||
@@ -81,7 +83,7 @@ class Game:
|
|||||||
self.winner = None
|
self.winner = None
|
||||||
self.last_player = None
|
self.last_player = None
|
||||||
self.last_datetime = 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":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\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\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()
|
guess = unidecode(message.content.strip()).upper()
|
||||||
|
|
||||||
# if it's the special keyword 'reset', consider resetting
|
# if it's the special keyword 'reset', consider resetting
|
||||||
if guess == "RESET" and SPOUTNIK_RESETTERS_NEEDED != 0:
|
if (regex := re.match(r"^RESET( [A-Z]+)?$", guess)) and SPOUTNIK_RESETTERS_NEEDED != 0:
|
||||||
if message.author in self.resetters:
|
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
|
return
|
||||||
self.resetters.add(message.author)
|
|
||||||
await self.channel.send(f"Réinitialisation : {len(self.resetters)}/{SPOUTNIK_RESETTERS_NEEDED}")
|
choice = (regex.group(1) or "").strip().lower()
|
||||||
if len(self.resetters) >= SPOUTNIK_RESETTERS_NEEDED:
|
if choice not in self.reset_data.keys():
|
||||||
try:
|
options = []
|
||||||
preset = self.preset
|
for key, value in self.reset_data.items():
|
||||||
except NameError:
|
options.append(f"* `{key}` : {value[0]}")
|
||||||
preset = list(SPOUTNIK_PRESETS)[0]
|
await self.channel.send(f"{message.author.mention} : je ne connais pas ce preset, les options sont :\n{'\n'.join(options)}")
|
||||||
await self.reset(preset=preset, force=True)
|
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
|
return
|
||||||
|
|
||||||
# if somebody has already won, return silently
|
# if somebody has already won, return silently
|
||||||
@@ -139,7 +156,7 @@ class Game:
|
|||||||
zoom = self.preset["zoom"]
|
zoom = self.preset["zoom"]
|
||||||
if distance <= self.preset["max_distance"]:
|
if distance <= self.preset["max_distance"]:
|
||||||
self.winner = message.author
|
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":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>)"
|
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)
|
await self.channel.send(output)
|
||||||
|
|||||||
11
uv.lock
generated
11
uv.lock
generated
@@ -123,6 +123,7 @@ dependencies = [
|
|||||||
{ name = "requests" },
|
{ name = "requests" },
|
||||||
{ name = "shapely" },
|
{ name = "shapely" },
|
||||||
{ name = "soupsieve" },
|
{ name = "soupsieve" },
|
||||||
|
{ name = "tabulate" },
|
||||||
{ name = "typing-extensions" },
|
{ name = "typing-extensions" },
|
||||||
{ name = "unidecode" },
|
{ name = "unidecode" },
|
||||||
{ name = "urllib3" },
|
{ name = "urllib3" },
|
||||||
@@ -149,6 +150,7 @@ requires-dist = [
|
|||||||
{ name = "requests", specifier = "==2.31.0" },
|
{ name = "requests", specifier = "==2.31.0" },
|
||||||
{ name = "shapely", specifier = ">=2.1.1" },
|
{ name = "shapely", specifier = ">=2.1.1" },
|
||||||
{ name = "soupsieve", specifier = "==2.5" },
|
{ name = "soupsieve", specifier = "==2.5" },
|
||||||
|
{ name = "tabulate", specifier = ">=0.9.0" },
|
||||||
{ name = "typing-extensions", specifier = "==4.11.0" },
|
{ name = "typing-extensions", specifier = "==4.11.0" },
|
||||||
{ name = "unidecode", specifier = "==1.3.8" },
|
{ name = "unidecode", specifier = "==1.3.8" },
|
||||||
{ name = "urllib3", specifier = "==2.2.1" },
|
{ name = "urllib3", specifier = "==2.2.1" },
|
||||||
@@ -523,6 +525,15 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7", size = 36131, upload-time = "2023-09-02T12:48:20.552Z" },
|
{ url = "https://files.pythonhosted.org/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7", size = 36131, upload-time = "2023-09-02T12:48:20.552Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tabulate"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = { registry = "https://pypi.org/simple" }
|
||||||
|
sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" }
|
||||||
|
wheels = [
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.11.0"
|
version = "4.11.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user