Discord.py : `on_member_update()` вызывается повторно [только для 1 гильдии]

#discord #discord.py #discord.py-rewrite

#Discord #discord.py #discord.py-перезаписать

Вопрос:

Я хочу, чтобы мой бот менял роли пользователей в зависимости от шаблонов псевдонимов (в основном идентификатора компании). Когда пользователь вводит свой идентификатор в ник, on_member_update() вызывается нормально.
В функции бот добавляет роли и снова меняет ник на определенный шаблон. Это запускает on_member_update() еще раз.
Обратите внимание, что у меня бот только в 1 гильдии.

Я попытался остановить это, добавив

 if before.display_name == after.display_name:
  return
 

Но он все равно входит в функцию при изменении псевдонима. Есть ли способ избежать повторного запуска функции?

Код:

 @bot.event
async def on_member_update(before, after):
    if before.display_name == after.display_name:
        return
    id = re.findall(r'd{6,7}', after.display_name)
    if not id:
        return
    else:
        # Business logic (changing nickname, adding roles etc...)
 

Ответ №1:

Это не полный ответ, но он направит вас в правильном направлении.

Вы должны вести учет идентификаторов измененных пользователей либо в базе данных, либо с помощью файла JSON. Я вызвал его users_changed , который должен быть списком.

Примечание: это id зарезервировано в Python, вы должны использовать другую вещь, может быть, даже id_

 users_changed = [11111,22222,33333] # get this from the db or file.

@bot.event
async def on_member_update(before, after):
    if before.id in users_changed:
        return

    # code here
    # then add before.id into the users_changed
 

Комментарии:

1. Это вроде как помогает. Спасибо, брат Абдулазиз. Я думаю, что менять ник внутри — плохая идея on_member_update() , но я пока не вижу других вариантов.

2. На самом деле есть лучший метод, создайте задачу и запускайте ее каждые 15 минут. Внутри него перебирайте всех участников и делайте свое дело.