本文介绍了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按需运行异步函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 02:54