2020-04-25 16:42:06 +02:00
|
|
|
#!/bin/python
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
2020-04-25 18:58:35 +02:00
|
|
|
from typing import List
|
2020-04-25 16:42:06 +02:00
|
|
|
|
|
|
|
import discord
|
|
|
|
from discord.ext import commands
|
|
|
|
import random
|
|
|
|
|
|
|
|
from discord.ext.commands import Context
|
2020-04-25 18:58:35 +02:00
|
|
|
from discord.utils import get
|
2020-04-25 16:42:06 +02:00
|
|
|
|
|
|
|
TOKEN = os.environ.get("TFJM_DISCORD_TOKEN")
|
|
|
|
|
|
|
|
if TOKEN is None:
|
|
|
|
print("No token for the bot were found.")
|
|
|
|
print("You need to set the TFJM_DISCORD_TOKEN variable in your environement")
|
|
|
|
print("Or just run:\n")
|
|
|
|
print(f' TFJM_DISCORD_TOKEN="your token here" python tfjm-discord-bot.py')
|
|
|
|
print()
|
|
|
|
quit(1)
|
|
|
|
|
|
|
|
GUILD = "690934836696973404"
|
2020-04-25 18:58:35 +02:00
|
|
|
ORGA_ROLE = "Orga"
|
|
|
|
CAPTAIN_ROLE = "Capitaine"
|
|
|
|
|
|
|
|
|
|
|
|
class TfjmError(Exception):
|
|
|
|
def __init__(self, msg):
|
|
|
|
self.msg = msg
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
return self.msg
|
|
|
|
|
|
|
|
|
|
|
|
class Team:
|
|
|
|
def __init__(self, name):
|
|
|
|
self.name = name
|
|
|
|
|
|
|
|
|
|
|
|
class Tirage:
|
|
|
|
def __init__(self, *teams):
|
|
|
|
assert len(teams) in (3, 4)
|
|
|
|
|
|
|
|
self.teams = {team: Team(team) for team in teams}
|
|
|
|
|
2020-04-25 16:42:06 +02:00
|
|
|
|
2020-04-25 17:02:57 +02:00
|
|
|
bot = commands.Bot(
|
|
|
|
"!", help_command=commands.DefaultHelpCommand(no_category="Commandes")
|
|
|
|
)
|
2020-04-25 16:42:06 +02:00
|
|
|
|
2020-04-25 18:58:35 +02:00
|
|
|
draws = {}
|
|
|
|
|
|
|
|
|
|
|
|
@bot.command(
|
|
|
|
name="start-draw",
|
|
|
|
help="Commence un tirage avec 3 ou 4 équipes.",
|
|
|
|
usage="équipe1 équipe2 équipe3 (équipe4)",
|
|
|
|
)
|
|
|
|
@commands.has_role(ORGA_ROLE)
|
|
|
|
async def start_draw(ctx: Context, *teams):
|
|
|
|
guild: discord.Guild = ctx.guild
|
|
|
|
|
|
|
|
channel = ctx.channel.id
|
|
|
|
if channel in draws:
|
|
|
|
raise TfjmError("Il y a déjà un tirage en cours sur cette Channel.")
|
|
|
|
|
|
|
|
if len(teams) not in (3, 4):
|
|
|
|
raise TfjmError("Il faut 3 ou 4 équipes pour un tirage.")
|
|
|
|
|
|
|
|
roles = [role.name for role in ctx.guild.roles]
|
|
|
|
for team in teams:
|
|
|
|
if team not in roles:
|
|
|
|
raise TfjmError("Le nom de l'équipe doit être exactement celui du rôle.")
|
|
|
|
|
|
|
|
captain: discord.Role = get(guild.roles, name=CAPTAIN_ROLE)
|
|
|
|
|
|
|
|
# Here everything should be alright
|
|
|
|
await ctx.send(
|
|
|
|
"Nous allons commencer le tirage du premier tour. "
|
|
|
|
"Seuls les capitaines de chaque équipe peuvent désormais écrire ici. "
|
|
|
|
"Pour plus de détails sur le déroulement du tirgae au sort, le règlement "
|
|
|
|
"est accessible sur https://tfjm.org/reglement."
|
|
|
|
)
|
|
|
|
await ctx.send(
|
|
|
|
"Nous allons d'abord tirer au sort l'ordre de tirage des problèmes, "
|
|
|
|
"puis l'ordre de passage lors du tour."
|
|
|
|
)
|
|
|
|
await ctx.send(
|
|
|
|
f"Les {captain.mention}s, vous pouvez désormais lancer un dé 100 "
|
|
|
|
"comme ceci `!dice 100`. "
|
|
|
|
"L'ordre des tirages suivants sera l'ordre croissant des lancers. "
|
|
|
|
)
|
|
|
|
|
2020-04-25 16:42:06 +02:00
|
|
|
|
|
|
|
@bot.event
|
|
|
|
async def on_ready():
|
|
|
|
print(f"{bot.user} has connected to Discord!")
|
|
|
|
|
|
|
|
|
|
|
|
@bot.command(
|
|
|
|
name="dice",
|
|
|
|
help="Lance un dé à `n` faces. ",
|
|
|
|
aliases=["de", "dé", "roll"],
|
|
|
|
usage="n",
|
|
|
|
)
|
|
|
|
async def dice(ctx: Context, n: int):
|
|
|
|
if n < 1:
|
2020-04-25 18:58:35 +02:00
|
|
|
raise TfjmError(f"Je ne peux pas lancer un dé à {n} faces, désolé.")
|
2020-04-25 16:42:06 +02:00
|
|
|
|
|
|
|
dice = random.randint(1, n)
|
|
|
|
await ctx.send(f"Le dé à {n} faces s'est arrêté sur... **{dice}**")
|
|
|
|
|
|
|
|
|
|
|
|
@bot.command(
|
|
|
|
name="choose",
|
|
|
|
help="Choisit une option parmi tous les arguments.",
|
|
|
|
usage="choix1 choix2...",
|
|
|
|
aliases=["choice", "choix", "ch"],
|
|
|
|
)
|
|
|
|
async def choose(ctx: Context, *args):
|
|
|
|
choice = random.choice(args)
|
|
|
|
await ctx.send(f"J'ai choisi... **{choice}**")
|
|
|
|
|
|
|
|
|
2020-04-25 17:02:57 +02:00
|
|
|
@bot.command(
|
|
|
|
name="random-problem",
|
|
|
|
help="Choisit un problème parmi ceux de cette année.",
|
|
|
|
aliases=["rp", "problème-aléatoire", "probleme-aleatoire", "pa"],
|
|
|
|
)
|
|
|
|
async def random_problem(ctx: Context):
|
|
|
|
problems = open("problems").readlines()
|
|
|
|
problems = [p.strip() for p in problems]
|
|
|
|
problem = random.choice(problems)
|
|
|
|
await ctx.send(f"Le problème tiré est... **{problem}**")
|
|
|
|
|
|
|
|
|
2020-04-25 16:42:06 +02:00
|
|
|
@bot.event
|
2020-04-25 18:58:35 +02:00
|
|
|
async def on_command_error(ctx: Context, error, *args, **kwargs):
|
|
|
|
if isinstance(error, commands.CommandInvokeError):
|
|
|
|
msg = str(error.original)
|
|
|
|
else:
|
|
|
|
msg = str(error)
|
|
|
|
|
|
|
|
print(repr(error), file=sys.stderr)
|
|
|
|
await ctx.send(msg)
|
2020-04-25 16:42:06 +02:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
bot.run(TOKEN)
|