From ef6712a10dda4776bbb51dd3f1cd8f872a2ecc8f Mon Sep 17 00:00:00 2001 From: John Blundell Date: Sat, 27 Jan 2024 17:28:55 +0000 Subject: [PATCH 1/3] Run `!roll` on a separate process (instead of thread) and with timeout. Fixes #237. --- cogs/commands/roll.py | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/cogs/commands/roll.py b/cogs/commands/roll.py index 9ef6357a..5fcf6b0e 100644 --- a/cogs/commands/roll.py +++ b/cogs/commands/roll.py @@ -56,6 +56,13 @@ {body} """ +TIMEOUT_OUT = """ +:hourglass: **DICE OUTTATIME** :hourglass: +{ping} - **{error}** +""" + +DICE_TIMEOUT = 3.0 # seconds + class Roll(commands.Cog): def __init__(self, bot: Bot): @@ -67,22 +74,28 @@ def __init__(self, bot: Bot): async def roll(self, ctx: Context, *, message: clean_content): loop = asyncio.get_event_loop() display_name = get_name_string(ctx.message) + p = await Parallelism.get(self.bot) + future = p.execute_on_process(run, message, display_name) - def work(): - return run(message, display_name) + try: + result = await asyncio.wait_for(future, DICE_TIMEOUT) + except asyncio.TimeoutError: + result = TIMEOUT_OUT.format(ping=display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!") - p = await Parallelism.get(self.bot) - p.send_to_ctx_after_threaded(work, ctx, loop) + await ctx.reply(result) @app_commands.command(name="roll", description=SHORT_HELP_TEXT) async def roll_slash(self, int: discord.Interaction, dice: str): loop = asyncio.get_event_loop() + p = await Parallelism.get(self.bot) + future = p.execute_on_process(run, dice, int.user.display_name) - def work(): - return run(dice, "") + try: + result = await asyncio.wait_for(future, DICE_TIMEOUT) + except asyncio.TimeoutError: + result = TIMEOUT_OUT.format(ping=int.user.display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!") - p = await Parallelism.get(self.bot) - p.send_to_int_after_threaded(work, int, loop) + await int.response.send_message(result) def run(message, display_name): From 20132be21a470cca83a6711f7b5b33054658476f Mon Sep 17 00:00:00 2001 From: EdmundGoodman Date: Sat, 27 Jan 2024 17:52:38 +0000 Subject: [PATCH 2/3] Apply black auto-formatter --- cogs/commands/roll.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cogs/commands/roll.py b/cogs/commands/roll.py index 5fcf6b0e..bce91e6f 100644 --- a/cogs/commands/roll.py +++ b/cogs/commands/roll.py @@ -80,7 +80,9 @@ async def roll(self, ctx: Context, *, message: clean_content): try: result = await asyncio.wait_for(future, DICE_TIMEOUT) except asyncio.TimeoutError: - result = TIMEOUT_OUT.format(ping=display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!") + result = TIMEOUT_OUT.format( + ping=display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!" + ) await ctx.reply(result) @@ -93,7 +95,9 @@ async def roll_slash(self, int: discord.Interaction, dice: str): try: result = await asyncio.wait_for(future, DICE_TIMEOUT) except asyncio.TimeoutError: - result = TIMEOUT_OUT.format(ping=int.user.display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!") + result = TIMEOUT_OUT.format( + ping=int.user.display_name, error=f"Ran out of time ({DICE_TIMEOUT}s)!" + ) await int.response.send_message(result) From f9dc10bfa4a2024a797d5e1d7313a1ff71455281 Mon Sep 17 00:00:00 2001 From: John Blundell Date: Sat, 27 Jan 2024 17:57:48 +0000 Subject: [PATCH 3/3] Remove unused variables --- cogs/commands/roll.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cogs/commands/roll.py b/cogs/commands/roll.py index bce91e6f..534f14a4 100644 --- a/cogs/commands/roll.py +++ b/cogs/commands/roll.py @@ -72,7 +72,6 @@ def __init__(self, bot: Bot): help=LONG_HELP_TEXT, brief=SHORT_HELP_TEXT, aliases=["r"], rest_is_raw=True ) async def roll(self, ctx: Context, *, message: clean_content): - loop = asyncio.get_event_loop() display_name = get_name_string(ctx.message) p = await Parallelism.get(self.bot) future = p.execute_on_process(run, message, display_name) @@ -88,7 +87,6 @@ async def roll(self, ctx: Context, *, message: clean_content): @app_commands.command(name="roll", description=SHORT_HELP_TEXT) async def roll_slash(self, int: discord.Interaction, dice: str): - loop = asyncio.get_event_loop() p = await Parallelism.get(self.bot) future = p.execute_on_process(run, dice, int.user.display_name)