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

时间:2019-08-04 20:22:15

标签: python discord discord.py

我有一个使用discord.py重写的discord机器人。我的其中一个命令针对给定查询获取了第一个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]

但是我见过其他机器人,如果编辑了命令消息,它们也可以编辑消息。我服务器上的朋友们要求我弄清楚如何使我的机器人做到这一点。我认为它应该非常简单,只需piggy带我创建的“ deletelog”,如果该日志中的youtube命令已被编辑,我们将编辑响应。

这是我第一次使用edit命令,我阅读了文档,但无法正常工作,不确定自己搞砸了什么:

@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”从未触发。因此,即使它应该,我的机器人甚至都没有检测到deletelog中的“之前”消息,对吗?抱歉,如果这是一个愚蠢的问题,我只是不确定我在哪里搞砸。

1 个答案:

答案 0 :(得分:0)

使用消息的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