...
This commit is contained in:
31
spoutnik.py
31
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](<https://www.google.ch/maps/@{self.target[0]},{self.target[1]},{SPOUTNIK_ZOOM}z>).\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](<https://www.google.ch/maps/@{self.target[0]},{self.target[1]},{zoom}z>).\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](<https://www.google.ch/maps/@{self.target[0]},{self.target[1]},{SPOUTNIK_ZOOM}z>)"
|
||||
output += f"\n\n[Lieu exact](<https://www.google.ch/maps/@{self.target[0]},{self.target[1]},{zoom}z>)"
|
||||
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](<https://www.google.ch/maps/@{lat},{lon},{SPOUTNIK_ZOOM}z>) proche de {address}."
|
||||
output = f"{message.author.mention} propose [un point](<https://www.google.ch/maps/@{lat},{lon},{zoom}z>) 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)
|
||||
Reference in New Issue
Block a user