mirror of
				https://gitlab.com/ddorn/tfjm-discord-bot.git
				synced 2025-11-04 07:02:12 +01:00 
			
		
		
		
	🚧 started TiragePhase
This commit is contained in:
		@@ -29,8 +29,8 @@ GUILD = "690934836696973404"
 | 
			
		||||
ORGA_ROLE = "Orga"
 | 
			
		||||
CAPTAIN_ROLE = "Capitaine"
 | 
			
		||||
 | 
			
		||||
TIRAGE_ORDER = 0
 | 
			
		||||
PASSAGE_ORDER = 1
 | 
			
		||||
with open("problems") as f:
 | 
			
		||||
    PROBLEMS = f.read().splitlines()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TfjmError(Exception):
 | 
			
		||||
@@ -48,6 +48,10 @@ class Team:
 | 
			
		||||
        self.tirage_order = None
 | 
			
		||||
        self.passage_order = None
 | 
			
		||||
 | 
			
		||||
        self.accepted_problem = None
 | 
			
		||||
        self.rejected = []
 | 
			
		||||
        self.can_refuse = len(PROBLEMS) - 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Tirage:
 | 
			
		||||
    def __init__(self, ctx, channel, teams):
 | 
			
		||||
@@ -103,6 +107,13 @@ class Phase:
 | 
			
		||||
    def teams(self):
 | 
			
		||||
        return self.tirage.teams
 | 
			
		||||
 | 
			
		||||
    @teams.setter
 | 
			
		||||
    def teams(self, teams):
 | 
			
		||||
        self.tirage.teams = teams
 | 
			
		||||
 | 
			
		||||
    def captain_mention(self, ctx):
 | 
			
		||||
        return get(ctx.guild.roles, name=CAPTAIN_ROLE).mention
 | 
			
		||||
 | 
			
		||||
    async def dice(self, ctx: Context, author, dice):
 | 
			
		||||
        await self.fais_pas_chier(ctx)
 | 
			
		||||
 | 
			
		||||
@@ -123,10 +134,10 @@ class Phase:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OrderPhase(Phase):
 | 
			
		||||
    def __init__(self, tirage, name, order_name, reversed=False):
 | 
			
		||||
    def __init__(self, tirage, name, order_name, reverse=False):
 | 
			
		||||
        super().__init__(tirage)
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.reverse = reversed
 | 
			
		||||
        self.reverse = reverse
 | 
			
		||||
        self.order_name = order_name
 | 
			
		||||
 | 
			
		||||
    def order_for(self, team):
 | 
			
		||||
@@ -151,10 +162,7 @@ class OrderPhase(Phase):
 | 
			
		||||
        orders = [self.order_for(team) for team in self.teams]
 | 
			
		||||
        if len(set(orders)) == len(orders):
 | 
			
		||||
            # All dice are different: good
 | 
			
		||||
            # We sort the teams so all tirages are in this order
 | 
			
		||||
            self.tirage.teams = sorted(
 | 
			
		||||
                self.teams, key=self.order_for, reverse=self.reverse
 | 
			
		||||
            )
 | 
			
		||||
            self.teams.sort(key=self.order_for, reverse=self.reverse)
 | 
			
		||||
            await ctx.send(
 | 
			
		||||
                f"L'ordre {self.name} pour ce tour est donc :\n"
 | 
			
		||||
                " - "
 | 
			
		||||
@@ -188,7 +196,55 @@ class OrderPhase(Phase):
 | 
			
		||||
            return self
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TiragePhase(Phase):
 | 
			
		||||
    """The phase where captains accept or refuse random problems."""
 | 
			
		||||
 | 
			
		||||
    async def choose_problem(self, ctx: Context, author, problem):
 | 
			
		||||
        return await super().choose_problem(ctx, author, problem)
 | 
			
		||||
 | 
			
		||||
    async def accept(self, ctx: Context, author, yes):
 | 
			
		||||
        return await super().accept(ctx, author, yes)
 | 
			
		||||
 | 
			
		||||
    def finished(self) -> bool:
 | 
			
		||||
        return all(team.accepted_problem for team in self.teams)
 | 
			
		||||
 | 
			
		||||
    async def start(self, ctx: Context):
 | 
			
		||||
        # First sort teams according to the tirage_order
 | 
			
		||||
        self.teams.sort(key=attrgetter("tirage_order"))
 | 
			
		||||
 | 
			
		||||
        async with ctx.typing():
 | 
			
		||||
            sleep(0.5)
 | 
			
		||||
            await ctx.send("Passons au tirage des problèmes !")
 | 
			
		||||
            sleep(0.5)
 | 
			
		||||
            await ctx.send(
 | 
			
		||||
                f"Les {self.captain_mention(ctx)} vont tirer des problèmes au "
 | 
			
		||||
                f"hasard, avec `!random-problem` ou `!rp` pour ceux qui aiment "
 | 
			
		||||
                f"les abbréviations."
 | 
			
		||||
            )
 | 
			
		||||
            sleep(0.5)
 | 
			
		||||
            await ctx.send(
 | 
			
		||||
                "Ils pouront ensuite accepter ou refuser les problèmes avec "
 | 
			
		||||
                "`!accept` ou `!refuse`."
 | 
			
		||||
            )
 | 
			
		||||
            sleep(0.5)
 | 
			
		||||
            await ctx.send(
 | 
			
		||||
                f"Chaque équipe peut refuser jusqu'a {len(PROBLEMS) - 5} "
 | 
			
		||||
                f"problèmes sans pénalité (voir §13 du règlement). "
 | 
			
		||||
                f"Un problème déjà rejeté ne compte pas deux fois."
 | 
			
		||||
            )
 | 
			
		||||
            await ctx.send("C'est parti !")
 | 
			
		||||
            sleep(0.5)
 | 
			
		||||
            await self.send_instructions(ctx)
 | 
			
		||||
 | 
			
		||||
    async def send_instructions(self, ctx):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PassageOrderPhase(OrderPhase):
 | 
			
		||||
    """The phase to determine the chicken's order."""
 | 
			
		||||
 | 
			
		||||
    NEXT = TiragePhase
 | 
			
		||||
 | 
			
		||||
    def __init__(self, tirage):
 | 
			
		||||
        super().__init__(tirage, "de passage", "passage_order", True)
 | 
			
		||||
 | 
			
		||||
@@ -208,6 +264,8 @@ class PassageOrderPhase(OrderPhase):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TirageOrderPhase(OrderPhase):
 | 
			
		||||
    """Phase to determine the tirage's order."""
 | 
			
		||||
 | 
			
		||||
    NEXT = PassageOrderPhase
 | 
			
		||||
 | 
			
		||||
    def __init__(self, tirage):
 | 
			
		||||
@@ -243,8 +301,6 @@ tirages: Dict[int, Tirage] = {}
 | 
			
		||||
)
 | 
			
		||||
@commands.has_role(ORGA_ROLE)
 | 
			
		||||
async def start_draw(ctx: Context, *teams):
 | 
			
		||||
    guild: discord.Guild = ctx.guild
 | 
			
		||||
 | 
			
		||||
    channel = ctx.channel.id
 | 
			
		||||
    if channel in tirages:
 | 
			
		||||
        raise TfjmError("Il y a déjà un tirage en cours sur cette Channel.")
 | 
			
		||||
@@ -269,6 +325,20 @@ async def start_draw(ctx: Context, *teams):
 | 
			
		||||
    await tirages[channel].phase.start(ctx)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bot.command(name="draw-skip")
 | 
			
		||||
async def draw_skip(ctx, *teams):
 | 
			
		||||
    channel = ctx.channel.id
 | 
			
		||||
    tirages[channel] = tirage = Tirage(ctx, channel, teams)
 | 
			
		||||
 | 
			
		||||
    tirage.phase = TiragePhase(tirage)
 | 
			
		||||
    for i, team in enumerate(tirage.teams):
 | 
			
		||||
        team.tirage_order = i
 | 
			
		||||
        team.passage_order = i
 | 
			
		||||
 | 
			
		||||
    await ctx.send(f"Skipping to {tirage.phase.__class__.__name__}.")
 | 
			
		||||
    await tirage.phase.start(ctx)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@bot.event
 | 
			
		||||
async def on_ready():
 | 
			
		||||
    print(f"{bot.user} has connected to Discord!")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user