Discord.py - 如果命令被编辑,让我的机器人编辑他的响应

Posted

技术标签:

【中文标题】Discord.py - 如果命令被编辑,让我的机器人编辑他的响应【英文标题】:Discord.py - Getting my bot to edit his response if the command is edited 【发布时间】:2019-12-12 11:14:25 【问题描述】:

我有一个使用 discord.py 重写的不和谐机器人。我的一个命令获取给定查询的第一个 Youtube 视频结果。如果用户使用命令删除他们的消息,机器人会删除他的响应。该部分工作正常,但这里仅供参考:

@bot.command()
async def yt(ctx):
    ytquery = urllib.parse.urlencode("search_query" : ctx.message.content[4:])
    html_cont = urllib.request.urlopen("http://youtube.com/results?"+ytquery)
    ytresult = re.findall(r'href=\"\/watch\?v=(.11)', html_cont.read().decode())
    delcmd = await ctx.send("http://youtube.com/watch?v=" + ytresult[0])
    deletelog[ctx.message] = delcmd

deletelog=

@bot.event
async def on_message_delete(message):
    if message in deletelog:
        dellog = deletelog[message]
        await dellog.delete()
        del deletelog[message]

但是,如果命令消息被编辑,我已经看到其他机器人也可以编辑消息。我服务器上的朋友要求我弄清楚如何让我的机器人做到这一点。我认为它应该很简单,只需背负我制作的“删除日志”,如果该日志中的 youtube 命令被编辑,我们将编辑响应。

这是我第一次使用编辑命令,我阅读了文档,但我无法让它工作并且不确定我在搞砸什么:

@bot.event
async def on_message_edit(before, after):
    print("test")
    if before in deletelog:
        print("test2")
        ytquery = urllib.parse.urlencode("search_query": after.message.content[4:])
        html_cont = urllib.request.urlopen("http://youtube.com/results?" + ytquery)
        ytresult = re.findall(r'href=\"\/watch\?v=(.11)', html_cont.read().decode())
        delcmd = await before.edit(content=("http://youtube.com/watch?v=" + ytresult[0]))
        deletelog[after] = delcmd

第二个测试打印,“test2”永远不会触发。所以我的机器人甚至没有检测到删除日志中的“之前”消息,即使它应该检测到,对吧?抱歉,如果这是一个愚蠢的问题,我只是不确定我在哪里搞砸了。

【问题讨论】:

【参考方案1】:

使用消息的id 属性而不是Message 对象本身。

@bot.command()
async def yt(ctx):
    ytquery = urllib.parse.urlencode("search_query" : ctx.message.content[4:])
    html_cont = urllib.request.urlopen("http://youtube.com/results?"+ytquery)
    ytresult = re.findall(r'href=\"\/watch\?v=(.11)', html_cont.read().decode())
    delcmd = await ctx.send("http://youtube.com/watch?v=" + ytresult[0])
    deletelog[ctx.message.id] = delcmd

deletelog=

@bot.event
async def on_message_delete(message):
    if message.id in deletelog:
        dellog = deletelog[message.id]
        await dellog.delete()
        del deletelog[message.id]

@bot.event
async def on_message_edit(before, after):
    print("test")
    if before.id in deletelog:
        print("test2")
        ytquery = urllib.parse.urlencode("search_query": after.message.content[4:])
        html_cont = urllib.request.urlopen("http://youtube.com/results?" + ytquery)
        ytresult = re.findall(r'href=\"\/watch\?v=(.11)', html_cont.read().decode())
        delcmd = await before.edit(content=("http://youtube.com/watch?v=" + ytresult[0]))
        deletelog[after.id] = delcmd

【讨论】:

谢谢,这行得通。它让机器人编辑其他人的消息,因为我写错了实际的编辑部分,但至少现在它正在触发底部。 也想出了那部分,记录在案。感谢您对拦截器的帮助!

以上是关于Discord.py - 如果命令被编辑,让我的机器人编辑他的响应的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py 机器人:如何让我的不和谐机器人向我发送对用户在 DM 中使用的命令的响应,例如进行调查?

我该怎么做才能让我的机器人再次工作? discord.py [关闭]

Discord.py:嵌入作者在编辑时返回 embed.Empty

我想使用 discord.py 创建一个多页帮助命令

Discord.py 帮助命令(对编辑消息做出反应)

(discord.py) 如何使我的 setprefix 命令正常工作?