提问人:syrok 提问时间:11/17/2023 最后编辑:Blue Robinsyrok 更新时间:11/18/2023 访问量:63
来自斜杠命令 pycord 的待处理机器人回复
Pending bot reply from a slash command pycord
问:
我有一个机器人,我想键入命令,然后让机器人创建一个线程并响应那里的命令。我成功地做到了,但问题是即使在机器人完成了我要求的所有事情后,“机器人正在思考”的消息仍然处于待处理状态。/chat
所以我想知道,我怎样才能在代码中消除这个待处理的问题?
我的代码:
import discord
from tools.config import TOKEN
from tools.gpt_helper.gpt_custom_classes import generate_response
from discord.ext import commands
bot = discord.Bot()
@bot.event
async def on_ready():
print(f"{bot.user} is ready and online!")
@bot.slash_command(name="chat", description="some desc")
async def chat(ctx, msg):
channel = bot.get_channel(MY_CHANNEL_ID)
await ctx.response.defer(ephemeral=True)
resp = await generate_response(prompt=msg)
thread = await channel.create_thread(name="wop", type=None)
await thread.send(resp)
bot.run(TOKEN)
我在这里使用 g4f python 模块与聊天 gpt 交互,它生成用户响应(chat() 函数中的变量“msg”)的答案。然后我创建一个线程并在那里回复:resp = await generate_response(prompt=msg)
thread = await channel.create_thread(name="wop", type=None)
await thread.send(resp)
这是待处理的机器人回复的图片
答:
问题在于你的回应方式:
await ctx.response.defer(ephemeral=True)
我假设线程创建是 100% 正确的,这里就不一一赘述了。 延迟线程(请参阅此处):
延迟交互响应。
这通常在确认交互和 次要操作将在稍后完成。
您没有辅助操作,因此交互将保持“延迟”状态。所以,你应该做:
await ctx.respond('insert message here')
这将在同一通道中响应该消息,并取消延迟状态。
评论
基本上是为耗时超过 3 秒(Discord 超时前的最大时间)的代码设计的响应。
因此,它仍然处于待处理状态,因为 discord 正在等待机器人为该部分提供后续操作。所以不是为您的情况设计的。defer()
defer()
我看到您正在尝试在线程中响应用户,而不是在命令的回复中。
但是,斜杠命令至少需要一个且只有一个响应,因此无法删除命令回复部分。
若要避免挂起状态,首先必须删除该语句。
您可以简单地将其替换为await ctx.response.defer(ephemeral=True)
await ctx.response.send_message('a message you want')
或者不给出任何响应,强制离开命令功能,例如:
@bot.slash_command(name="chat", description="some desc")
async def chat(ctx, msg):
channel = bot.get_channel(MY_CHANNEL_ID)
resp = await generate_response(prompt=msg)
thread = await channel.create_thread(name="wop", type=None)
await thread.send(resp)
return
请注意,这不是正确的方法,因此可能会出现一条错误消息,告知命令失败但实际上没有。
评论