Как позволить боту получить причину, когда произошло событие on_member_ban? - PullRequest
0 голосов
/ 28 мая 2020

Это мой код

@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 Ответ

1 голос
/ 28 мая 2020

При бане пользователя на сервере вы можете указать причину. Он также может быть пустым. Затем вызывается
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
При этом вы получаете объект guild и user.

Только в журнале аудита указывается причина бана. Вы можете выполнить поиск в журнале аудита. 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)

Только пример. Это возвращает последнее событие, для которого есть причина. Это может быть любое событие (разблокировка пользователя, блокировка пользователя, удаление сообщения и т. Д. c.)

Переменная 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.

(Примечание: я не тестировал это. Я предполагаю, что это основано на документации. )


Фактическое программирование и тестирование вам придется выполнить самостоятельно. Я дал вам несколько советов, какие методы вы должны найти и использовать.

...