Как настроить бота так, чтобы он мог ожидать определенное время перед ответом на запросы, но при этом продолжал обрабатывать их?

Как можно сделать так, чтобы чат-бот Telegram на Aiogram 2.25.1 после отправления сообщения с кнопкой "Присоединиться" дождался минуту и затем проверил количество пользователей, присоединившихся к игре (нажавших на кнопку)?
  • 18 августа 2024 г. 12:13
Ответы на вопрос 2
Для этого можно использовать асинхронные функции в библиотеке Aiogram для создания таймера и ожидания определенного времени перед выполнением определенных действий. В вашем случае, после отправки сообщения с кнопкой "Присоединиться", вы можете установить таймер на минуту и затем проверить количество пользователей, присоединившихся к игре.

Примерный код для реализации этой функциональности может выглядеть примерно так:

```python
import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor

API_TOKEN = 'your_api_token'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    button = types.KeyboardButton('Присоединиться')
    keyboard.add(button)
    
    await message.answer("Нажмите на кнопку 'Присоединиться'", reply_markup=keyboard)

@dp.message_handler(lambda message: message.text == 'Присоединиться')
async def join(message: types.Message):
    await asyncio.sleep(60)  # ожидание 1 минуты
    # здесь вы можете добавить логику проверки количества пользователей, присоединившихся к игре
    
    await message.answer("Проверяю количество пользователей, присоединившихся к игре...")

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

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

Не забудьте вставить свой API токен в переменную `API_TOKEN`.
asyncio.sleep() вполне хватит. 
Бот должен знать своё состояние ("покой", "сбор игроков", "игра идёт", ну и так далее).
Один обработчик (начало игры) проверяет, что сейчас состояние "покой", отправляет приглашение, ставит состояние "сбор игроков" и ждёт заданное время. По итогам ожидания проверяет список игроков. Если нужного числа игроков в списке нет, ставит состояние "покой", иначе "игра идёт".
Второй обработчик (игрок присоединился) проверяет, что сейчас состояние "сбор игроков". Если да, добавляет отправителя в список игроков.

Как хранить состояние, список игроков и другую игровую инфу, зависит от того, может ли параллельно идти несколько игровых сессий. Если не может, то достаточно простых глобальных переменных. Если может... всё сложнее.
Похожие вопросы