【问题标题】:Discord.py delete message on_raw_reaction_addDiscord.py 删除消息 on_raw_reaction_add
【发布时间】:2021-09-08 23:02:42
【问题描述】:

我在 python 中做了一个小不和谐机器人,它正在工作!我有一个小问题:我希望机器人发送的消息(第 11 行)在有人做出反应时被删除:(我该怎么做?

@commands.command()
async def casino(self, ctx, arg):
    embed = (Embed(title=f"Viens défier {ctx.message.author.name} qui mets en jeu {arg} po!", description=f"Appuies sur les <:goldcoin:857043361813889044> pour un /rand avec {ctx.message.author.name} :)")
             .add_field(name="<:goldcoin:857043361813889044>Joueur 1", value=f"{ctx.author.mention}", inline = False)
             .add_field(name="<:goldcoin:857043361813889044>Joueur 2", value="<:goldcoin:857043361813889044>", inline = False)
             .set_footer(text=f"Défi de {ctx.author.display_name}"))
    message = await ctx.send(embed=embed)
    emojis = ['<:goldcoin:857043361813889044>', '<:deny:849631648135118889>']
    for emoji in emojis:
        await message.add_reaction(emoji)
    await ctx.send("<@&857916481747943434> A vos golds !")

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):
    member = payload.member
    if member.bot:
        return

    channel = self.bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)

    try:
        if not message.embeds:
            return
        if 'Viens défier' not in message.embeds[0].title:
            return
    except:
        return

    possible_responses = [str(i) for i in range(1, 101)]
    emoji = payload.emoji
    reaction = get(message.reactions, emoji=emoji)
    embed = message.embeds[0]

    if emoji.name == 'deny':
        if member.display_name in embed.footer.text:
            for reac in message.reactions:
                await reac.clear()
            await message.edit(content='Défi annulé', embed=None)
        elif payload.member in get(member.guild.roles, id=849270094952792084).members:
            for reac in message.reactions:
                await reac.clear()
            await message.edit(content='Défi annulé', embed=None)
        else:
            await reaction.remove(member)
        return

    names = [field.name for field in embed.fields]
    values = [field.value for field in embed.fields]
    test = values[0]

    index = ['', 'goldcoin'].index(emoji.name)

    result1 = random.choice(possible_responses)
    result2 = random.choice(possible_responses)

    bravo1 = f"Bravo {test} ! Tu as gagné avec un {result1} !"
    bravo2 = f"Bravo {payload.member.mention} ! Tu as gagné avec un {result2} !"

    if values.count(member.mention) >= 1:
        await channel.send("Tu as déjà joué, attends un peu", delete_after=5)
        await reaction.remove(payload.member); return
    elif '@' in values[1]:
        await channel.send("Quelqu'un a déjà joué, retente ta chance !", delete_after=5)
        await reaction.remove(payload.member); return

    embed.set_field_at(index, name=f"<:goldcoin:857043361813889044>Tu as fait : {result2} !", value=f"{payload.member.mention}", inline=False)
    embed.set_field_at(0, name=f"<:goldcoin:857043361813889044>Tu as fait : {result1} !", value=f"{test}", inline=False)
    await message.edit(embed=embed)
    if result1 > result2:
        await channel.send(bravo1)
    elif result1 < result2:
        await channel.send(bravo2)
    elif result1 == result2:
        await channel.send("EGALITEEEEEE")

    if (message != None) and (message.content == "<@&857916481747943434> A vos golds !"):
        await message.delete() 


@casino.error
async def casino_error(self, ctx, error):
    if isinstance(error, commands.MissingRequiredArgument):
        await ctx.send("Merci d'utiliser le bot avec ?casino XX. Exemple: ?casino 100", delete_after=25)
        await ctx.message.delete(delay=25)

默认设置(机器人): bot.add_cog(赌场(bot))

我尝试使用“if message.content()”,但它没有做任何事情:( 谢谢你的帮助:)

【问题讨论】:

  • 你分享的代码哪里有问题?什么不工作?
  • 代码没有问题,只是不知道有人反应后如何删除第11行
  • send() 具有返回类型 Message,它具有 id 属性。因此,从返回对象中获取id 并将其保存在数据库或其他持久缓存中。然后,当您收到反应的消息 ID 与您保存的消息 ID 匹配的反应事件时,您可以使用 raw events 运行删除代码。
  • 谢谢 Noah :) 我正在学习和 atm,我只是不知道如何将 id 保存在持久缓存中(我什至不谈论数据库,你把我弄丢了 xD)

标签: discord.py bots


【解决方案1】:

您基本上已经在标题中说明了您的需求。缺少的只是代码

@client.event
async def on_raw_reaction_add(payload): 
    channel = client.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    async for msg in channel.history(after = message, limit = 20):
        if (msg != None) and (msg.content == "<@&857916481747943434> A vos golds !"):
        await msg.delete()

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):
    member = payload.member

    channel = self.bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)

    async for msg in channel.history(after = message, limit = 20):
        if (msg != None) and (msg.content == "<@&857916481747943434> A vos golds !"):
        await msg.delete()

    if member.bot:
        return

    try:
        if not message.embeds:
            return
        if 'Viens défier' not in message.embeds[0].title:
            return
    except:
        return
    # code continues

【讨论】:

  • 谢谢 :) 但它不起作用 T__T 我编辑了第一篇文章,使用所有代码,可能更容易找到:/
  • if not message.embeds: return 你在.delete() 被调用之前返回。将.delete() 移到返回上方。我将使用您提供的额外信息编辑我的答案
  • if member.bot: return 相同。
  • 我完全按照你的做法做了,但它不起作用:/ 编辑:顺便说一句,它什么也没做
  • 我把它放在任何回报之前,但它不会删除那个@casino...i.postimg.cc/jdsmfQkq/casino.jpg
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多