Discord Python Bot 在使用后台任务时破坏了我的命令

Posted

技术标签:

【中文标题】Discord Python Bot 在使用后台任务时破坏了我的命令【英文标题】:Discord Python Bot Breaking My Commands When Using Background Task 【发布时间】:2021-08-12 02:24:55 【问题描述】:

我正在使用 python 开发一个不和谐的机器人,它每天在非常特定的时间在服务器中发送预定的消息以及其他功能。执行预定消息后,机器人命令不再起作用 - 因此用户无法使用任何命令,但预定消息有效。

我已设置机器人,因此它会在 12:00,19:00,21:00,22:00,23:00 UTC 发送消息。唯一的问题是现在“;help”等命令不起作用。

import discord
import datetime
import asyncio
from discord.ext import commands
from discord.utils import get

client = commands.Bot(command_prefix = ';',help_command=None) #prefix

race_times_utc = [12,19,21,22,23]
time = datetime.datetime.now
    
async def timer():

  await client.wait_until_ready()

  msg_sent = False

  while not client.is_closed():
    if any(time().hour == race for race in race_times_utc) and time().minute == 0:
      if not msg_sent:
        channel = client.get_channel(838626115326636022)
        racer_role = get(channel.guild.roles, name = 'Racers')

        embed = discord.Embed(
          title = 'Race Time',
          description = 'Scheduled reminder for everyone that race starts soon.',
          colour = discord.Colour.blue()
        )
    
        await channel.send(f'racer_role.mention',embed=embed)
        msg_sent = True
    else:
      msg_sent = False

  await asyncio.sleep(1)

@client.event
async def on_ready():
    await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=' ;help'))
    client.loop.create_task(timer())
    print('Bot is alive')

#Functions such as this no longer working
@client.command()
async def help(ctx):
...

【问题讨论】:

你知道asyncio.sleep在while循环之外吗? 【参考方案1】:

您应该使用discord.ext.tasks,因为您的部分代码似乎被阻塞了。

import discord
import datetime
import asyncio
from discord.ext import tasks, commands
from discord.utils import get

client = commands.Bot(command_prefix = ';',help_command=None) #prefix

race_times_utc = [12,19,21,22,23]
time = datetime.datetime.now

@tasks.loop(seconds=1.0)  # replaces the sleep
async def timer():
    msg_sent = False
    if any(time().hour == race for race in race_times_utc) and time().minute == 0:
      if not msg_sent:
        channel = client.get_channel(838626115326636022)
        racer_role = get(channel.guild.roles, name = 'Racers')

        embed = discord.Embed(
          title = 'Race Time',
          description = 'Scheduled reminder for everyone that race starts soon.',
          colour = discord.Colour.blue()
        )
    
        await channel.send(f'racer_role.mention',embed=embed)
        msg_sent = True
    else:
      msg_sent = False

@client.event
async def on_ready():
    await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=' ;help'))
    print('Bot is alive')
    timer.start()

【讨论】:

代码并没有真正阻塞,他只是没有让事件循环空闲,他一直在忙,其他协程无法调度

以上是关于Discord Python Bot 在使用后台任务时破坏了我的命令的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 从后台线程关闭 Bot

试图在Discord.py中写一个新文件,但没有任何事情发生

Discord bot 无法使用 Python 在 Heroku 上运行

使用 python Discord bot 播放 Youtube 音频

Discord bot python:discord.errors.ClientException:找不到ffmpeg

Discord Bot Client.User 在 Python 中转换为 Discord.Utils 时出错