【问题标题】:Is there a good way to find the person who deleted a message in a on_message_delete event?有没有一种好方法可以在 on_message 删除事件中找到删除消息的人?
【发布时间】:2021-11-02 03:59:59
【问题描述】:

嘿嘿,所以我正在尝试制作一个删除记录器,它实际上只是在预定义的频道中发送一条消息,说“x 用户删除了 x 人的消息”但是我有一个问题。

因此,我目前如何通过检查最近的审核日志来了解删除邮件的人的姓名。但是,由于删除您自己的消息不会显示在审核日志中,因此如果您删除自己的消息,它会中断。因此,我正在检查审核日志是否创建于

所以现在我不完全确定如何解决这个问题。真的什么都没有想到。这是我当前的 on_message_delete 事件代码。

@client.event
async def on_message_delete(message):
pst = pytz.timezone('US/Pacific')
psttime = datetime.datetime.now(pst)
current_pst_date = psttime.strftime('%Y/%m/%d, %I:%M %p PST.')
delete_channel = message.channel.mention
nsfw_tag = ''
spoiler_tag = ''
in_nsfw = False
channel = client.get_channel(863957409293664266)
message_author = message.author

if message.content.startswith("^"):
    return

delete_author = None
delta = datetime.datetime.utcnow() - datetime.timedelta(seconds=1)
print(delta)
async for entry in message.guild.audit_logs(action=discord.AuditLogAction.message_delete, limit=1):
    print(entry.created_at)
    if entry.created_at > delta:
        delete_author = "{0.user}".format(entry)
    else:
        delete_author = message.author
if delete_author is None:
    await ctx.send("Test: Some random error ocurred.")
    return

if 'nsfw=True' in str(message):
    nsfw_tag = '**:warning: NSFW :warning:**'
    in_nsfw = True
    spoiler_tag = '||'

e = discord.Embed(title='',
                  description=f"{nsfw_tag}\n{delete_author.mention} Deleted a Message by {message_author.name} in {spoiler_tag}{delete_channel}{spoiler_tag}\n||\n||")
if in_nsfw is True:
    e.color = Color.red()
else:
    e.color = Color.gold()
e.set_author(name=f"{message_author}", icon_url=f"{message_author.avatar_url}")
e.set_footer(text=f"• {current_pst_date}")
await channel.send(embed=e)

【问题讨论】:

  • discord.Message 对象没有关于谁删除它的任何属性。删除的消息被视为discord.DeletedReferencedMessage 对象,但只有channel_idguild_idid 属性。所以,因为我不知道你的答案,所以我赞成你的答案,如果没有人在 2 天内回答,我会悬赏。
  • discord API 不会返回删除消息的用户,因此最好的方法是获取最新的审核日志操作,检查它是否在同一个频道中如果不是,则假定删除者是消息的作者。这可能会导致一些错误,例如如果 P1 在通道 A 中删除 P2 的消息,然后 P3 在通道 A 中删除自己的消息,bot 会认为 P1 删除了 P3 的消息。

标签: python discord.py audit-logging


【解决方案1】:

不可能


...因为 Discord API 不会返回删除消息的用户。
正如@Chuaat 所说,您可以尝试以其他方式进行操作,但这可能会导致一些错误。

Discord.py


Discord.py 正在开发 has ended,所以没有人可以为所欲为。

编辑


可以获得消息的删除器,但仅使用discord.Message 属性是不可能的。
您可以为此范围使用公会审核日志,如下所示:

async for entry in message.guild.audit_logs(limit=1):
    deleter = entry.user
await message.channel.send(embed = discord.Embed(title="Message deleted", description=f"{deleter.mention} deleted a message"))

【讨论】:

    【解决方案2】:

    因此,您正在尝试从已删除邮件中获取邮件作者以及删除该邮件的用户。 我认为这应该可行:

    @client.event
    async def on_message_delete(message, member):
        async for entry in message.guild.audit_logs(limit=1,action=discord.AuditLogAction.message_delete):
            deleter = entry.user
        print(f"{deleter.name} deleted message by {message.author.name}")
    

    输出:

    【讨论】:

    • 请保持你的语言。
    • 请不要将文字作为图片发布。这使得搜索引擎和一些残障用户无法访问,同时使我们无法复制和粘贴它,这只是众多缺点中的一小部分。谢谢!
    • 如果有人删除了他们自己的消息,我认为这不会起作用。遗憾的是,它没有出现在审核日志中。
    • @Der Pruefer 这应该行不通。我敢肯定,它应该可以在大多数情况下工作,但是您是否尝试过删除自己的消息并查看它是否弹出?因为如果我正在查看这个权利,它只是从审核日志中获取名称,因此如果您删除自己的消息,因为它不会显示在审核日志中,它会错误地将另一个用户标记为删除者。如果这真的可以完全发挥作用,那么我会感到非常惊讶,我以后必须尝试一下。感谢您的帮助。
    • @Broso56 是的,我确实试过了,而且效果很好。 Ohterwise 我不会说它会起作用。
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2022-01-20
    • 2011-04-22
    • 2015-10-12
    • 1970-01-01
    • 2011-02-17
    • 2021-07-23
    相关资源
    最近更新 更多