Gestion des captures fonctionnelle

This commit is contained in:
Emmy D'Anello 2025-03-10 22:13:41 +01:00
parent e28f1415e3
commit d6ac48a8ff
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
3 changed files with 69 additions and 6 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ __pycache__
config.py config.py
map.svg map.svg
map.png map.png
data.json

70
bot.py
View File

@ -1,6 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from functools import partial from functools import partial
import json
from pathlib import Path
import random import random
from typing import Literal from typing import Literal
from xml.dom import minidom from xml.dom import minidom
@ -43,6 +45,7 @@ CANTONS = {
CodeCanton = Literal["AG", "AI", "AR", "BE", "BL", "BS", "FR", "GE", "GL", "GR", "JU", "LU", "NE", CodeCanton = Literal["AG", "AI", "AR", "BE", "BL", "BS", "FR", "GE", "GL", "GR", "JU", "LU", "NE",
"NW", "OW", "SG", "SH", "SO", "SZ", "TH", "TI", "UR", "VD", "VS", "ZG", "ZH"] "NW", "OW", "SG", "SH", "SO", "SZ", "TH", "TI", "UR", "VD", "VS", "ZG", "ZH"]
Couleur = Literal["rouge", "vert"]
intents = discord.Intents.default() intents = discord.Intents.default()
@ -50,21 +53,80 @@ intents.message_content = True
bot = commands.Bot(command_prefix='$', intents=intents) bot = commands.Bot(command_prefix='$', intents=intents)
@bot.command() DATA_FILE = Path(__file__).parent / "data.json"
async def capture(ctx: commands.Context, canton: CodeCanton): if DATA_FILE.exists():
with DATA_FILE.open() as data_file:
data = json.load(data_file)
else:
data = {'equipes': {'rouge': [], 'vert': []}, 'cantons': {code_canton: {'capture': None, 'verrouille': False} for code_canton in CANTONS.keys()}}
with DATA_FILE.open('w') as data_file:
json.dump(data, data_file, indent=4)
def generer_carte():
doc = minidom.parse("map_blank.svg") doc = minidom.parse("map_blank.svg")
path = next(e for e in doc.getElementsByTagName('path') if e.getAttribute('id') == canton) for code_canton, data_canton in data['cantons'].items():
path.setAttribute('class', "captured-green") if data_canton['capture']:
path = next(e for e in doc.getElementsByTagName('path') if e.getAttribute('id') == code_canton)
couleur = data_canton['capture']
path.setAttribute('class', f"capture-{couleur}")
with open('map.svg', 'w') as f: with open('map.svg', 'w') as f:
doc.writexml(f) doc.writexml(f)
cairosvg.svg2png(url='map.svg', write_to='map.png') cairosvg.svg2png(url='map.svg', write_to='map.png')
@bot.command()
async def carte(ctx: commands.Context):
with open('map.png', 'rb') as f: with open('map.png', 'rb') as f:
await ctx.send(file=discord.File(f, filename="battle4suisse.png"), ephemeral=True) await ctx.send(file=discord.File(f, filename="battle4suisse.png"), ephemeral=True)
@bot.command()
async def capture(ctx: commands.Context, canton: CodeCanton, *, couleur: Couleur | None = None):
if couleur is None:
author_id = ctx.author.id
for couleur, membres_equipe in data['equipes'].items():
if author_id in membres_equipe:
break
else:
raise commands.BadArgument("Vous n'appartez à aucune équipe. Merci de faire `$equipe [rouge|vert]`.")
data['cantons'][canton]['capture'] = couleur
with DATA_FILE.open('w') as data_file:
json.dump(data, data_file, indent=4)
generer_carte()
return await carte(ctx)
@capture.error @capture.error
async def capture_error(ctx, error): async def capture_error(ctx, error):
if isinstance(error, commands.BadLiteralArgument): if isinstance(error, commands.BadLiteralArgument):
await ctx.send(f"Canton inconnu : {error.argument}, valeurs possibles : {", ".join(error.literals)}") await ctx.send(f"Canton inconnu : {error.argument}, valeurs possibles : {", ".join(error.literals)}")
else:
await ctx.send(str(error))
@bot.command()
async def reset(ctx: commands.Context, canton: CodeCanton):
data['cantons'][canton]['capture'] = None
data['cantons'][canton]['verrouille'] = False
with DATA_FILE.open('w') as data_file:
json.dump(data, data_file, indent=4)
generer_carte()
return await carte(ctx)
@bot.command()
async def equipe(ctx: commands.Context, couleur: Couleur):
author_id = ctx.author.id
for membres_equipe in data['equipes'].values():
if author_id in membres_equipe:
membres_equipe.remove(author_id)
data['equipes'][couleur].append(author_id)
with DATA_FILE.open('w') as data_file:
json.dump(data, data_file, indent=4)
await ctx.send(f"Équipe {couleur} rejointe")
@equipe.error
async def equipe_error(ctx, error):
await ctx.send(str(error))
bot.run(DISCORD_TOKEN) bot.run(DISCORD_TOKEN)

View File

@ -44,12 +44,12 @@
stroke-width:0.2; stroke-width:0.2;
} }
.captured-red .capture-rouge
{ {
fill:#ff0000; fill:#ff0000;
} }
.captured-green .capture-vert
{ {
fill:#338000; fill:#338000;
} }

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 283 KiB