show results of tirage

This commit is contained in:
ddorn 2020-04-26 13:30:52 +02:00
parent aa7efb67b1
commit 4c63c0509e
1 changed files with 64 additions and 16 deletions

View File

@ -4,7 +4,7 @@ import os
import random import random
import sys import sys
import traceback import traceback
from collections import defaultdict from collections import defaultdict, namedtuple
from operator import attrgetter from operator import attrgetter
from time import sleep from time import sleep
from typing import Dict, Type from typing import Dict, Type
@ -37,6 +37,10 @@ MAX_REFUSE = len(PROBLEMS) - 5
ROUND_NAMES = ["premier tour", "deuxième tour"] ROUND_NAMES = ["premier tour", "deuxième tour"]
def in_passage_order(teams, round=0):
return sorted(teams, key=lambda team: team.passage_order[round], reverse=True)
class TfjmError(Exception): class TfjmError(Exception):
def __init__(self, msg): def __init__(self, msg):
self.msg = msg self.msg = msg
@ -97,6 +101,10 @@ class Tirage:
next_class = await self.phase.next(ctx) next_class = await self.phase.next(ctx)
if next_class is None: if next_class is None:
await ctx.send(
"Le tirage est fini ! Bonne chance à tous pour la suite !"
)
await self.show_tirage(ctx)
await self.end(ctx) await self.end(ctx)
else: else:
# Continue on the same round. # Continue on the same round.
@ -106,12 +114,60 @@ class Tirage:
await self.phase.start(ctx) await self.phase.start(ctx)
async def end(self, ctx): async def end(self, ctx):
await ctx.send("Le tirage est fini ! Bonne chance à tous pour la suite !")
del tirages[self.channel] del tirages[self.channel]
# Allow everyone to send messages again # Allow everyone to send messages again
send = discord.PermissionOverwrite(send_messages=None) # reset send = discord.PermissionOverwrite(send_messages=None) # reset
await ctx.channel.edit(overwrites={ctx.guidl.default_role: send}) await ctx.channel.edit(overwrites={ctx.guild.default_role: send})
async def show_tirage(self, ctx):
teams = ", ".join(team.mention for team in self.teams)
msg = f"Voici un résumé du tirage entre les équipes {teams}."
if len(self.teams) == 3:
table = """```
+-----+---------+---------+---------+
| | Phase 1 | Phase 2 | Phase 3 |
| | Pb {0.pb} | Pb {1.pb} | Pb {2.pb} |
+-----+---------+---------+---------+
| {0.name} | Déf | Rap | Opp |
+-----+---------+---------+---------+
| {1.name} | Opp | Déf | Rap |
+-----+---------+---------+---------+
| {2.name} | Rap | Opp | Déf |
+-----+---------+---------+---------+
```"""
else:
table = """```
+-----+---------+---------+---------+---------+
| | Phase 1 | Phase 2 | Phase 3 | Phase 4 |
| | Pb {0.pb} | Pb {1.pb} | Pb {2.pb} | Pb {3.pb} |
+-----+---------+---------+---------+---------+
| {0.name} | Déf | | Rap | Opp |
+-----+---------+---------+---------+---------+
| {0.name} | Opp | Déf | | Rap |
+-----+---------+---------+---------+---------+
| {0.name} | Rap | Opp | Déf | |
+-----+---------+---------+---------+---------+
| {0.name} | | Rap | Opp | Déf |
+-----+---------+---------+---------+---------+
```"""
Record = namedtuple("Record", ["name", "pb"])
records = [
[
Record(team.name, team.accepted_problems[round][0])
for team in in_passage_order(self.teams, round)
]
for round in (0, 1)
]
msg += "\n\nPremier tour:\n"
msg += table.format(*records[0])
msg += "\n\n Deuxième tour:\n"
msg += table.format(*records[1])
await ctx.send(msg)
class Phase: class Phase:
@ -229,17 +285,9 @@ class OrderPhase(Phase):
return self.__class__ return self.__class__
class ShowPhase(Phase):
"""Phase where the bot resumes all that happened."""
NEXT = None
class TiragePhase(Phase): class TiragePhase(Phase):
"""The phase where captains accept or refuse random problems.""" """The phase where captains accept or refuse random problems."""
NEXT = ShowPhase
def __init__(self, tirage, round=0): def __init__(self, tirage, round=0):
""" """
The main phase of the Tirage. The main phase of the Tirage.
@ -419,7 +467,7 @@ class TiragePhase(Phase):
await ctx.send("Nous allons passer au deuxième tour") await ctx.send("Nous allons passer au deuxième tour")
self.round = 1 self.round = 1
return TirageOrderPhase return TirageOrderPhase
return ShowPhase return None
class PassageOrderPhase(OrderPhase): class PassageOrderPhase(OrderPhase):
@ -532,7 +580,6 @@ async def abort_draw_cmd(ctx):
if channel_id in tirages: if channel_id in tirages:
await tirages[channel_id].end(ctx) await tirages[channel_id].end(ctx)
await ctx.send("Le tirage est annulé.") await ctx.send("Le tirage est annulé.")
del tirages[channel_id]
@bot.command(name="draw-skip") @bot.command(name="draw-skip")
@ -540,10 +587,11 @@ async def draw_skip(ctx, *teams):
channel = ctx.channel.id channel = ctx.channel.id
tirages[channel] = tirage = Tirage(ctx, channel, teams) tirages[channel] = tirage = Tirage(ctx, channel, teams)
tirage.phase = TiragePhase(tirage) tirage.phase = TiragePhase(tirage, round=1)
for i, team in enumerate(tirage.teams): for i, team in enumerate(tirage.teams):
team.tirage_order = [i, None] team.tirage_order = [i, i]
team.passage_order = [i, None] team.passage_order = [i, i]
team.accepted_problems = [PROBLEMS[i], PROBLEMS[-i - 1]]
await ctx.send(f"Skipping to {tirage.phase.__class__.__name__}.") await ctx.send(f"Skipping to {tirage.phase.__class__.__name__}.")
await tirage.phase.start(ctx) await tirage.phase.start(ctx)