discord.py | on_member_update
я не знаю почему, но событие on_member_update вызывается только когда изменяется профиль бота, если изменится профиль обычного пользователя, то событие не вызывается. Во мой код:
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='>')
@bot.event
async def on_ready():
print("Bot connect!")
@bot.event
async def on_member_update(before, after):
print("Before roles:")
for x in before.roles:
print(x)
print("After roles:")
for x in after.roles:
print(x)
bot.run("gg")
Список ролей выводится только когда изменяется профиль бота, а на профили обычных пользователей ему всё равно. Как это можно исправить?
Ответы (1 шт):
Автор решения: Mike
→ Ссылка
Вот мой код. Он выполняет ту же задачу которую ты хотел и так же есть и еще несколько фич в нём. Не забудь добавить библиотеку asyncio
@Bot.event
async def on_member_update(before, after):
if before.roles != after.roles:
global cooldown
if before in cooldown:
return
cooldown.append(before)
await asyncio.sleep(5) #5 секунд cooldown для обработки действия
cooldown.remove(before)
channel = Bot.get_channel(827986763606786099) #ID канала с логами, а именно куда должны появлятся сообщения об изменениях ролях.
emb = discord.Embed(description=f'**Обновление ролей пользователя - {before.mention}**', colour=discord.Color.orange())
emb.add_field(name='Роли до', value=" ".join([r.mention for r in before.roles][1:]), inline=False)
emb.add_field(name='Роли после', value=" ".join([r.mention for r in after.roles][1:]), inline=False)
changed_roles = []
for role in before.roles:
if role in after.roles:
pass
else:
changed_roles.append(role)
for role in after.roles:
if role in before.roles:
pass
else:
if role in changed_roles:
pass
else:
changed_roles.append(role)
text = ""
blacklist=[797920206407598098,817750571330961410,797916381621256202] #здесь находятся роли на которые бот не должен реагировать.
for role in changed_roles:
if role.id in blacklist:
return
text = text + role.mention + " "
emb.add_field(name="Изменённые роли", value=text, inline=False)
async for event in before.guild.audit_logs(limit=1, action=discord.AuditLogAction.member_role_update):
if getattr(event.target, "id", None) != before.id:
continue
emb.add_field(name="Модератор", value=f"{event.user} \n**ID**: {event.user.id}")
break
await channel.send(embed=emb)