#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 над рекурсией?