diff options
author | 2019-12-04 17:50:08 +0100 | |
---|---|---|
committer | 2019-12-04 17:50:08 +0100 | |
commit | 54cae73ab735de9f06169bb29e668b7732e6d184 (patch) | |
tree | f21aaa356a6dca4545f69e7ca95baa617f9afaa1 /bot/utils/__init__.py | |
parent | Merge pull request #305 from python-discord/exclude-draft-prs (diff) | |
parent | Unlock AoC role to make announcements actually ping the users (diff) |
Merge pull request #328 from python-discord/aoc-announcement-mention-fix
Make the daily Advent of Code subscription service actually ping subscribers
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) |