我使用的是discord.py异步版本,我需要在用户加入服务器后10.5分钟指定一个角色。我正在考虑使用threading.Timer(..)
,但是member.add_roles(...)
是一个协同器,因此Timer
不会使用它。
我尝试了一种使用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)
,因为我的程序的其余部分是异步函数。任何帮助都是非常感谢的。
发布于 2019-08-31 13:11:44
await asyncio.sleep(630)
应该能正常工作。
如果您想在on_member_join
中执行其他您不想等待10分钟的事情,可以将其设置为异步任务
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
https://stackoverflow.com/questions/57741576
复制相似问题