【问题标题】:How To Get The Person Who Banned In Discord.py如何获取在 Discord.py 中被禁止的人
【发布时间】:2020-10-15 18:32:28
【问题描述】:

正如标题所说,我的问题是,有没有办法获得谁禁止某人的 User 对象? 可能是这样的:

async def someone_got_banned(banner, banned, reason, time):

   print(f"{banner} has just banned {banned} (The time is {time}), and their reason for doing so is {reason}")

【问题讨论】:

  • @Ironkey 你能证明它在使用中吗?编辑:Nvm 他们刚刚删除了评论,如果我做错了对不起
  • 抱歉,已经有一个内置函数:on_member_ban() 和 on_guild_remove() 可能会起作用 --> 在这里查看文档:discordpy.readthedocs.io/en/latest/api.html | atm 我无法访问 discord,所以我无法对其进行测试。
  • @Ironkey 是的,我在某处看到过,不过谢谢,但我认为它只显示谁被禁止,而不是谁实际被禁止 .

标签: python time discord discord.py


【解决方案1】:

可以,使用Guild.audit_logs()

以下是修改后的代码

@bot.event
async def on_member_ban(guild, member):
    logs = await guild.audit_logs(limit=1, action=discord.AuditLogAction.ban).flatten()
    channel = guild.get_channel(CHANNEL_ID)
    logs = logs[0]
    if logs.target == member:
        await channel.send(f'{logs.user} has just banned {logs.target} (The time is {logs.created_at}), and their reason for doing so is {logs.reason}')

【讨论】:

  • 谢谢! (抱歉,btw 回答迟了)第 3 行 ("logs=...") 中的 .flatten() 是怎么回事?
  • 我的意思是问我们为什么需要它,这种方法的意义何在,它有什么作用。还有一个问题,if logs.target==member 的结果不总是 True,因为审计日志中的第一个禁令会直接被 on_member_ban_ 捕获吗?
  • if logs.target==member 确保它是那个成员,在大规模禁止期间,如果你的机器人需要一些时间来查询审计日志 flatten() 是将 AsyncIterator 转换为列表,如果我们没有使用 flatten() 我们需要 fo 才能使用 async for x in logs:
  • 我明白了,感谢您的回复:)
【解决方案2】:

您可以使用on_member_ban() 事件,但它只有guilduser 参数。您无法获得原因,但您可以通过datetime 模块获得时间。这是一个例子:

from datetime import datetime
@client.event
async def on_member_ban(guild, member):
    await guild.text_channels[0].send(f'{member} banned at {datetime.now()}.')

在此代码中,它会将消息发送到第一个文本通道。如果要更换频道,可以用discord.utils.get定义-获取频道。

from datetime import datetime
@client.event
async def on_member_ban(guild, member):
    channel = discord.utils.get(guild.text_channels, name='the channel name that the message will send')
    await channel.send(f'{member} banned at {datetime.now()}.')

【讨论】:

  • 谢谢,很抱歉看到你的回复晚了
  • 有没有办法通过频道名称获取频道的 ID,或者在不使用 discord.utils 的情况下将其放入类别中?
  • 您可以遍历公会中的所有频道并检查它们的名称,但这有点效率低下。例如:channel = [channel for channel in guild.text_channels if channel.name=='channel name'].
  • 嗯,好的。我现在明白了。好吧,我应该习惯 utils。但是,比方说,如果有更有效的方法 - 在某些特定的事情上 - 在另一种(不是实用程序,经典)以及,如何使用每个的效率?有没有办法同时使用经典命令和utils命令?
  • 经典和“同时使用经典命令和utils命令”是什么意思?
猜你喜欢
  • 2021-09-16
  • 2019-07-28
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2021-07-27
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多