【问题标题】:discord.py snipe command shows deleted messages from other guildsdiscord.py snipe 命令显示来自其他公会的已删除消息
【发布时间】:2023-03-31 16:00:04
【问题描述】:

我正在发出狙击命令。它可以工作,但它也会显示来自其他公会的已删除消息,无论如何要解决这个问题?这是代码:-

snipe_message_content = None
snipe_message_author = None

@client.event
async def on_message_delete(message):
    global snipe_message_content
    global snipe_message_author


    snipe_message_content = message.content
    snipe_message_author = message.author.name 
    await asyncio.sleep(60)  
    snipe_message_author = None 
    snipe_message_content = None

@client.command()
async def snipe(message):
    if snipe_message_content==None:
        
        await message.channel.send("Nothing to snipe is found here!")
    else:
        embed = discord.Embed(description=f"{snipe_message_content}", color=message.author.color)
        embed.set_footer(text=f"Requested By {message.author.name}#{message.author.discriminator}")
        embed.set_author(name = f"Sniped the message deleted by : {snipe_message_author}")
        await message.channel.send(embed=embed)
        return

【问题讨论】:

  • 你没有指定应该从哪个公会狙击它。
  • Related(可能不重复)

标签: discord discord.py


【解决方案1】:

使用字典是关键,但Chuaat's的答案没有正确使用。

snipes = {}

@client.event
async def on_message_delete(message):
    global snipes
    snipes[message.guild.id] = (message.author.id, message.content)
    await asyncio.sleep(60)
    snipes[message.guild.id] = None

@client.command()
async def snipe(self, ctx):
    if snipe.get(ctx.guild.id, None) is None:
         print('nothing to snipe')
    else:
         await ctx.send(f" author is <@{snipe[ctx.guild.id][0]}> and content is {snipe[ctx.guild.id][1]}", allowed_mentions= discord.AllowedMentions.none)

我们使用message.guild.id 而不是message.guild 来简化检查。

参考资料:

  • 使用Allowed_Mentions 以便我们不提及作者,您也可以获取他们的姓名并使用它来代替提及。

【讨论】:

    【解决方案2】:

    我建议使用字典,并首先将它们定义为一个:

    snipe_message_content = {}
    snipe_message_author = {}
    

    然后在on_message_delete 中,编辑以使用字典中的message.guild 条目:

    snipe_message_content[message.guild] = message.content
    snipe_message_author[message.guild] = message.author.name 
    await asyncio.sleep(60)  
    snipe_message_author[message.guild] = None 
    snipe_message_content[message.guild] = None
    

    还可以编辑 snipe(message) 以使用字典中的 message.guild 条目:

    @client.command()
    async def snipe(message):
        try:
            if snipe_message_content[message.guild]==None:
                await message.channel.send("Nothing to snipe is found here!")
            else:
                embed = discord.Embed(description=f"{snipe_message_content[message.guild]}", color=message.author.color)
                embed.set_footer(text=f"Requested By {message.author.name}#{message.author.discriminator}")
                embed.set_author(name = f"Sniped the message deleted by : {snipe_message_author[message.guild]}")
                await message.channel.send(embed=embed)
                return
        except KeyError:
            await message.channel.send("Nothing to snipe is found here!")
    

    【讨论】:

    • 它可以工作,但有些东西是wrong
    • 为什么会这样?
    • 是的,我多次忘记添加[message.guild],现在可以了。请注意,它仅适用于缓存消息,因为您使用的 on_message_delete 仅适用于缓存消息。我建议使用on_raw_message_delete,为此您必须更改代码的某些部分,这里是文档:discordpy.readthedocs.io/en/stable/…
    • snipe_message_guilld[message.guild] 如果没有消息被删除,将引发 KeyError
    • 这就是我使用try: except KeyError:@Ceres的原因
    猜你喜欢
    • 2021-09-26
    • 2020-07-21
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2021-06-13
    • 2021-07-04
    相关资源
    最近更新 更多