在on_message_delete事件中有没有什么好的方法可以找到删除消息的人?
Is there a good way to find the person who deleted a message in a on_message_delete event?
嘿,所以我正在尝试制作一个删除记录器,它实际上只是在预定义的频道中发送一条消息说 'x user deleted a message by x person' 但是我遇到了问题。
所以我目前是通过检查最新的审核日志来获取删除邮件的人的姓名的。但是,由于删除您自己的消息不会显示在审核日志中,因此如果您删除自己的消息,它就会中断。为此,我正在检查审核日志是否在 < 1 秒前创建(如果不是,则将删除消息的人指定为消息作者)。但是还有另一个问题。也就是说,如果您删除多条消息并且它们都是由同一个人发送的(例如:人 1 删除了人 2 的 3 条消息),它会将审核日志压缩为一个条目(显示“x 用户从 x 用户删除了 x 条消息” ,而不是“x 用户从 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 API 没有 return 删除消息的用户。
就像@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"))
所以您正在尝试从已删除的邮件和删除邮件的用户中获取邮件作者。
我认为这应该有效:
@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}")
输出:
嘿,所以我正在尝试制作一个删除记录器,它实际上只是在预定义的频道中发送一条消息说 'x user deleted a message by x person' 但是我遇到了问题。
所以我目前是通过检查最新的审核日志来获取删除邮件的人的姓名的。但是,由于删除您自己的消息不会显示在审核日志中,因此如果您删除自己的消息,它就会中断。为此,我正在检查审核日志是否在 < 1 秒前创建(如果不是,则将删除消息的人指定为消息作者)。但是还有另一个问题。也就是说,如果您删除多条消息并且它们都是由同一个人发送的(例如:人 1 删除了人 2 的 3 条消息),它会将审核日志压缩为一个条目(显示“x 用户从 x 用户删除了 x 条消息” ,而不是“x 用户从 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 API 没有 return 删除消息的用户。
就像@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"))
所以您正在尝试从已删除的邮件和删除邮件的用户中获取邮件作者。 我认为这应该有效:
@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}")
输出: