我使用的是discord.py异步版本,我需要在用户加入服务器后10.5分钟分配一个角色。我当时正在考虑使用threading.Timer(..)
,但是member.add_roles(...)
是协程,因此Timer
不会await
。
我尝试使用loop.call_later(...)
的另一种方法,但在测试中得到RuntimeWarning
,我的协程添加角色add_roles
从未等待。这是我到目前为止尝试过的:
import discord, asyncio
from discord.utils import get
client = discord.Client()
async def on_member_join(member):
...
newuser, noparty = get(member.guild.roles, name="New Member"), get(member.guild.roles, name="No Party")
async def add_roles(member, newuser, noparty):
await member.add_roles(newuser, noparty, reason="Auto-role new users.")
loop = asyncio.get_event_loop()
loop.call_later(630, add_roles, member, newuser, noparty)
预期结果是,在10.5分钟后,将为该成员分配New User
和No Party
角色,但是我得到了上述的RuntimeWarning
。我的问题是:这是正确的方法吗?还是因为程序的其余部分是异步函数,我是否可以简单地使用asyncio.sleep(630)
?任何帮助表示赞赏。
答案 0 :(得分:1)
await asyncio.sleep(630)
应该可以正常工作。
如果您想在on_member_join
内做其他不想等待10分钟的事情,可以将其设置为以asyncio task的身份运行
async def give_permission_later(member, newuser, noparty):
await asyncio.sleep(630)
await member.add_roles(newuser, noparty, reason="Auto-role new users.")
async def on_member_join(member):
...
newuser, noparty = get(member.guild.roles, name="New Member"), get(member.guild.roles, name="No Party")
client.loop.create_task(give_permission_later(member, newuser, noparty))
# More code that should execute now