![](/img/trans.png)
[英]Discord.py failing to send message to a specific channel in a cog/extension file
[英]Python: Send message to specific channel in Discord via cog and background task
我有一个 Discord Python 机器人,我正在尝试运行一个后台任务,该任务将每隔 X 秒不断地向频道发送一条消息 - 不需要命令。 目前有任意 5 秒用于测试目的。
这是有问题的 cog 文件(为提高效率而删除了导入和其他内容)
class TestCog(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.mytask.start()
@tasks.loop(seconds=5.0)
async def mytask(self):
channel = client.get_channel(my channel id here)
await channel.send("Test")
def setup(bot):
bot.add_cog(TestCog(bot))
我有一种感觉,这是由于 self 参数是唯一传递的参数,但我有点困惑阅读 API 文档,了解究竟该做什么。
我尝试过client
而不是bot
,我尝试过定义discord.Client()
(但就我所阅读的内容而言,我不应该使用我一直试图避免的那个。
在其他使用实际命令的 cogs 中,我将其设置如下:
@commands.command(name='test')
async def check(self, ctx):
if ctx.channel.name == 'channel name':
await ctx.send("Response message")
这就是让我相信我传递的参数是错误的。 我明白,因为我正在传递 ctx 我可以获取频道名称,但我不太确定如何仅使用 self. 尝试传递 ctx 参数时,我没有收到任何错误,但由于明显的原因,消息没有发送。
我到底在这里想念什么? 我很感激任何帮助!
discord.Client
object 没有get_channel()
方法。 您必须使用discord.Guild
object 代替:
await client.get_guild(guild_id_here).get_channel(channel_id_here).send("Test")
阅读文档。
您可以使用.loop.create_task(mytask(arguments))
将任务添加到异步循环中,您将在启动机器人之前调用该任务。 在此处阅读有关 asyncio 的所有信息
您将任务定义为使用async def mytask(argument)
的普通命令,但是忽略 ctx,因为 ctx 基本上是您通常会获得的有关用于调用 function 的命令的所有上下文。 相反,您需要使用频道 id 手动获取频道 object 与channel = bot.get_channel(id)
,然后您可以执行await channel.send("Your message")
向所述频道发送消息。
要让它循环,只需使用带有asyncio.sleep(delay)
的while True
循环来计时。 由于您必须等待消息发送,这可能会导致计时不准确,因此我建议您在 function 前面使用clock = asyncio.create_task(asyncio.sleep(delay))
开始计时任务并抓住它在您的 function 与await clock
之后
现在,如果您希望它在每个间隔的某个时间运行,而不仅仅是从您启动 function 时开始的设定间隔,您需要延迟 function 的启动以匹配您设置的时间。 您可以使用divmod(time.time(), interval)
来执行此操作,它返回商和剩余时间以及间隔,剩余时间是自上次间隔开始以来的时间。 如果您想在间隔开始时启动 function,您可以使用await asyncio.sleep(interval-remainder)
使 function 休眠直到下一个间隔开始。 如果您想在该时间间隔内设置一个时间,您需要将其分成两部分,一个用于您设定的时间已过,另一个用于您的设置时间尚未到来。
if remainder < set_time:
await asyncio.sleep(set_time - remainder)
else:
await asyncio.sleep(interval + set_time - remainder)
现在,如果您将所有这些添加到一个 function 中,您会得到类似这样的内容(这是我在我的机器人中使用的一段代码:
async def reminder(channel, interval, set_time, message):
await bot.wait_until_ready()
channel = bot.get_channel(channel)
quotient, remainder = divmod(time.time(), interval)
if remainder < set_time:
await asyncio.sleep(set_time-remainder)
else:
await asyncio.sleep(set_time + interval - remainder)
while True:
clock = asyncio.create_task(asyncio.sleep(interval))
await channel.send(message)
quotient, remainder = divmod(time.time(), interval)
if remainder-set_time > 1:
clock.cancel()
await asyncio.sleep(interval-1)
await clock
bot.loop.create_task(reminder(774262090801479740, 3600, 3300, "This is the 55th minute of the hour"))
bot.run(TOKEN)
(我知道这不是 100% 回答问题,但正如你所说,你尝试了bot
和client
,这个解决方案应该适合你)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.