Discord.py — Определение того, когда бот переходит в автономный режим

#python #discord.py

#python #discord.py

Вопрос:

Прямо сейчас у меня есть событие, которое отслеживает, когда определенный бот переходит в автономный режим. (Я размещаю обоих ботов) В настоящее время это мой код, мне не удалось получить ни выходных данных, ни обратной трассировки. Я чего-то не понимаю? (Я включил намерения!)

 @commands.Cog.listener()
  async def on_member_update(self, before, after):
    if before.id == 777361919211732993:
      if after.status == discord.Status.offline:
        channel = self.bot.get_channel(792485617954586634)
        timestamp = datetime.now()
        embed = discord.Embed(title = "⚠️ PortalBot is offline!", description = "Recorded Downtime (start): "   str(timestamp.strftime("%H:%M:%S")) , color = 0xf03224)
        embed.add_field(name = "Restart Link", value = "-")
        await channel.send(embed = embed)
 

Любые советы или предложения помогут!

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

1. На первый взгляд, ваш код выглядит нормально для меня. Может быть, попробуйте добавить print(channel) после определения, чтобы узнать, не может ли он получить к нему доступ?

2. идентификатор — это идентификатор бота?

Ответ №1:

Ваш код не ошибочен, однако есть пара изменений, которые я опишу после того, как объясню, почему ваш бот, вероятно, не может обнаружить обновление участника.

По состоянию на 27 октября 2020 года Discord обновили свой шлюз, добавив intents. Часть, которая, скорее всего, влияет на ваш код, как видно из этого сообщения, приведена здесь:

Для ботов, у которых нет намерения GUILD_MEMBERS ———

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

Без включения намерения привилегированного шлюза для намерения участников сервера на странице портала разработчика вашего бота вы не сможете получать эти обновления участников. Кроме того, после этого в вашем основном классе bot вы захотите указать намерение в своей __init__ функции, например:

 class Bot(discord.Client):
    def __init__(self):
        discord.Client.__init__(self, intents=discord.Intents(guilds=True, members=True))
 

Примечание: Если ваш бот состоит менее чем в 100 гильдиях, вы можете включить привилегированное намерение, но как только вы перейдете в более чем 100 гильдий, вам нужно будет пройти проверку вашего бота (рядом с тегом бота будет установлена галочка визуального подтверждения) и получить белый список данных, ссылка.


А теперь пара рекомендуемых изменений в вашем коде:

1)
Текущий способ, которым вы его настроили, он всегда будет выполнять этот код для любого обновления, которое происходит для этого бота, когда он отображается в автономном режиме. Это не должно быть проблемой, но лучше перестраховаться: if after.status == discord.Status.offline and before.status != discord.Status.offline:

2)
Еще одна модификация, которая обычно не должна быть проблемой, я бы изменил if before.id == 777361919211732993: if after.id == 777361919211732993: , потому before что переменная является кэшированной версией элемента и имеет редкую вероятность отсутствия данных, даже id атрибута.

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

1. Я попробовал ваши предложения, но по-прежнему не получаю никаких результатов.

2. @SpaceTurtle0 Вы выполнили все четыре из этих действий: 1) Включите намерение участников сервера на вашем портале разработчика 2) Ваш бот находится менее чем на 100 серверах 3) Добавили намерения в основной класс вашего бота 4) Убедились, что идентификатор бота и идентификатор канала указаны правильно