当事件on_member_ban发生时,如何让漫游器获取原因?

时间:2020-05-28 08:21:11

标签: python python-3.x discord discord.py

这是我的代码

@commands.Cog.listener()
async def on_member_ban(self, guild, user: discord.User):
    db = sqlite3.connect("./data/modlog.db")
    cursor = db.cursor()
    cursor.execute(
        f"SELECT channel_id FROM auditlog WHERE guild_id = {guild.id}"
    )
    result = cursor.fetchone()
    if result is None:
        return
    else:
        embed = discord.Embed(title=f"Member Banning Case", colour=discord.Colour.red())
        embed.add_field(name="Member Name", value=user.name)
        embed.add_field(name="Reason", value=user.)
        embed.set_footer(text=f"User ID: {user.id}")
        embed.timestamp = datetime.datetime.utcnow()
        channel = self.client.get_channel(id=int(result[0]))
        await channel.send(embed=embed)

我希望我的机器人得到禁止的原因,有可能这样做吗?

1 个答案:

答案 0 :(得分:1)

从服务器禁止用户时,可以提供原因。也可以是空的。
https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_member_ban#discord.Guild.ban

然后会在您的代码中引用

on_member_ban()
https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_member_ban#discord.on_member_ban
这样,您将获得guilduser对象。

仅在审核日志中说明了禁令的原因。您可以搜索审核日志。 https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_member_ban#discord.AsyncIterator.find

def predicate(event):
    return event.reason is not None

event = await guild.audit_logs().find(predicate)

仅是示例。这将返回有原因的最后一个事件。这可以是任何事件(用户取消禁止,用户禁止,消息删除等)

event变量是此类的实例:https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_member_ban#discord.AuditLogEntry
通过Guild.audit_logs()检索的:https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_member_ban#discord.Guild.audit_logs

您必须将predicate方法调整为类似以下内容:

def predicate(event):
    return event.action is discord.AuditLogAction.ban

一旦事件对象带有用户禁令,您就可以使用event.reason提取禁令原因。

(注意:我没有对此进行测试。我猜是根据文档编写的。)


您必须自己进行实际的编程和测试。我为您提供了一些指导,您需要查找和使用哪些方法。