Discord.py получить доступ ко всем участникам на всех серверах бота без команды?

#python-3.x #discord #discord.py

Вопрос:

Можно ли получить всех участников на всех серверах бота без вызова команды или события? В настоящее время он работает с помощью команды, но я хочу сделать его асинхронной функцией, которую я вызываю при запуске бота. Я попытался передать «клиент» в функцию, и это тоже не сработало.

 intents = discord.Intents.default()
intents.members = True
client = commands.Bot(command_prefix="%", intents = intents)

@client.event
async def on_ready():
  print("Bot is up and running")
  await check()
  await currency_update()

@client.command()
async def currency_update(ctx):
  for guild in client.guilds:
     for member in guild.members:
        print(member)
  await asyncio.sleep(3600)
  await currency_update(ctx)
 

Ответ №1:

Вам не нужно создавать currency_update команду, сделайте ее простой асинхронной функцией без каких-либо аргументов

 async def currency_update():
  for guild in client.guilds:
     for member in guild.members:
        print(member)
  await asyncio.sleep(3600)
  await currency_update(ctx)
 

Я бы предложил использовать цикл while вместо рекурсии.


Если вы хотите запустить асинхронные функции «в фоновом режиме», используйте asyncio.create_task

 import asyncio

@client.event
async def on_ready():
  print("Bot is up and running")
  asyncio.create_task(check())
  asyncio.create_task(currency_update())
 

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

1. Я уже пробовал это (без ctx), и это не сработало. Это работает только тогда, когда это команда, и я действительно не понимаю, почему.

2. Можете ли вы попробовать ввести некоторые инструкции для отладки печати?

3. На самом деле я, возможно, нашел проблему, но не знаю, как ее решить. По-видимому, в функции on_ready запускаются только первые 2 строки, а затем она останавливается. Я отредактировал сообщение, чтобы показать строки, о которых я говорю. Это потому, что у меня не может быть 2 асинхронных функций подряд?

4. Вы можете иметь, но при await выполнении асинхронной функции вы ждете ее завершения, если хотите, чтобы они выполнялись «в фоновом режиме» asyncio.create_task . Позвольте мне отредактировать свой ответ

5. Также в чем преимущество цикла while над рекурсией?