本文介绍了Discord.py按需运行异步函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要在特定时间运行以下异步函数。
async def test(ctx):
channel = bot.get_channel(730099302130516058)
await channel.send('hello')
我正在用它进行测试asyncio.run(test(bot.get_context))
。但是当我运行它时,我得到'NoneType' object has no attribute 'send'
,并且我对此进行了测试,这意味着通道等于无,因此它不能像通道=无&q;那样发送消息。现在,当我执行以下操作时,它起作用了。但当然我必须运行命令test
@bot.command()
async def test(ctx):
channel = bot.get_channel(730099302130516058)
await channel.send('hello')
我计划使用Schedule在我需要的时间运行它,但仍然会以类似的方式调用该函数。是否有办法调用异步函数并正确传递CTX?
整个代码:
import discord
from discord.ext import commands
import asyncio
TOKEN = "Token Would Be Here"
bot = commands.Bot(command_prefix='+')
async def test(ctx):
channel = bot.get_channel(730099302130516058)
await channel.send('hello')
asyncio.run(test(bot.get_context))
bot.run(TOKEN)
推荐答案
bot.get_channel()
返回None
,因为机器人尚未连接,这意味着它看不到任何频道。您需要添加await bot.wait_until_ready()
,这将强制机器人等到连接后再继续。
您也不需要传递ctx
,因为您从未使用过它。
discord.py
也已经有了可以使用的自己的事件循环。您可以使用bot.loop.create_task()
将协同例程添加到循环中。
from discord.ext import commands
TOKEN = "Token Would Be Here"
bot = commands.Bot(command_prefix='+')
async def test():
await bot.wait_until_ready()
channel = bot.get_channel(370935329353367568)
await channel.send('hello')
bot.loop.create_task(test())
bot.run(TOKEN)
这篇关于Discord.py按需运行异步函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!