diff options
| author | 2019-12-20 08:50:31 -0800 | |
|---|---|---|
| committer | 2019-12-20 08:50:31 -0800 | |
| commit | e3529c7bbc7590fed089b8197b4e98630ee10253 (patch) | |
| tree | 7333c48ed164e5819a5e610cb77aeafc7a70bc5a /bot/utils/__init__.py | |
| parent | Update bot/seasons/evergreen/trivia_quiz.py (diff) | |
| parent | Merge pull request #332 from python-discord/errorhandler-refine (diff) | |
Merge branch 'master' into quiz_fix
Diffstat (limited to 'bot/utils/__init__.py')
| -rw-r--r-- | bot/utils/__init__.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/bot/utils/__init__.py b/bot/utils/__init__.py index 0aa50af6..25fd4b96 100644 --- a/bot/utils/__init__.py +++ b/bot/utils/__init__.py @@ -1,4 +1,5 @@ import asyncio +import contextlib import re import string from typing import List @@ -127,3 +128,25 @@ def replace_many( return replacement.lower() return regex.sub(_repl, sentence) + + +async def unlocked_role(role: discord.Role, delay: int = 5) -> None: + """ + Create a context in which `role` is unlocked, relocking it automatically after use. + + A configurable `delay` is added before yielding the context and directly after exiting the + context to allow the role settings change to properly propagate at Discord's end. This + prevents things like role mentions from failing because of synchronization issues. + + Usage: + >>> async with unlocked_role(role, delay=5): + ... await ctx.send(f"Hey {role.mention}, free pings for everyone!") + """ + await role.edit(mentionable=True) + await asyncio.sleep(delay) + try: + yield + finally: + await asyncio.sleep(delay) + await role.edit(mentionable=False) |