Это мой код
@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)
Я хочу, чтобы мой бот узнал причину бана, возможно ли это сделать?
При бане пользователя на сервере вы можете указать причину. Он также может быть пустым. Затем вызывается 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.
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
event
Guild.audit_logs()
Вам нужно будет настроить метод predicate на что-то вроде:
predicate
def predicate(event): return event.action is discord.AuditLogAction.ban
Как только у вас есть объект события с запретом пользователя, вы можете извлечь причину запрета с помощью event.reason.
event.reason
(Примечание: я не тестировал это. Я предполагаю, что это основано на документации. )
Фактическое программирование и тестирование вам придется выполнить самостоятельно. Я дал вам несколько советов, какие методы вы должны найти и использовать.