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中写一个新文件,但没有任何事情发生
Discord bot 无法使用 Python 在 Heroku 上运行
使用 python Discord bot 播放 Youtube 音频