python - Discord.py - 如果命令被编辑,让我的机器人编辑他的响应
问题描述
我有一个使用 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”永远不会触发。所以我的机器人甚至没有检测到删除日志中的“之前”消息,即使它应该检测到,对吧?抱歉,如果这是一个愚蠢的问题,我只是不确定我在哪里搞砸了。
解决方案
使用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