@black_dis

Как сделать достижения в асинхронном боте телеграм(aiogram)?

Я пишу бота на aiogram с бд sqlite3. С асинхронкой пересекаюсь впервые. К примеру я имею:

@tg.message_handler(commands = ['start'])
async def send_welcome(msg: types.Message):
....
@tg.message_handler(content_types = ['text'])
async def sender(msg: types.Message):
....
@tg.callback_query_handler(lambda call: True)
async def callback_inline(call):
....
И вот как мне написать новую функцию, которая вечно проверяет данные юзера с бд, чтобы в случае достижения нужного результата она отправляла сообщение об выполненном достижении?
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Грубо говоря, для асинхронной программы верно одно утверждение: "пока ты выполняешь код, не являющийся await вызовом, остальная программа простаивает".
Каждый await вызов (а также его завершение) - это повод переключиться на другую задачу.
Таким образом, бесконечный цикл - это просто:
while True:
  await asyncio.sleep(5) #пока текущая корутина спит, остальной бот работает
  do_stuff() #пока do_stuff() работает, остальной бот спит

Вопрос в другом: нужен ли бесконечный цикл?
Я бы посоветовал начать с создания системы сбора статистики.
Например, завести таблицу вида id юзера - имя статы - значение статы.
Скажем "id - число_сообщений - 100500". И в обработчиках соответствующих событий делать UPDATE на эту таблицу. А потом в отдельном модуле периодически проверять статы пользователей, проверять, есть ли у них уже ачивка за эту стату, и если нет - то давать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы