import asyncio from datetime import datetime, timedelta from math import trunc from aiogram import Bot, Dispatcher from aiogram.fsm.storage.memory import MemoryStorage from loguru import logger from bot.handlers import users from bot.utils.otask_api import get_regular_projects from bot.auth.auth import update_token from bot.auth.crypto import generate_key_to_file from database.db_main import UserManager from settings import BOT_TOKEN, NOTIFICATION_TIMES # Инициализация бота и диспетчера bot = Bot(token=BOT_TOKEN) storage = MemoryStorage() # Хранилище для машины состояний dp = Dispatcher(storage=storage) dp.include_routers(users.router) user_manager = UserManager() # генерирует новый ключ шифрования для паролей # generate_key_to_file() # Функция для запуска уведомлений # Функция для отправки уведомлений пользователям async def send_notifications(): users_query = user_manager.get_all_users() for user in users_query: if (datetime.now() - user.last_token_update) > timedelta(days=4): await update_token(user) regular_projects = await get_regular_projects(user.token) for project in regular_projects: await bot.send_message(user.telegram_id, f"Регулярный платеж:\n" f"{project['name']}\n" f"{project['amount']}\n" f"{project['first_name']}\n" f"{project['description']}\n") # else: # await bot.send_message(user.telegram_id, "Нет проектов с регулярными платежами на данный момент.") def should_send_notifications(): current_time = datetime.now().strftime("%H:%M") return current_time in NOTIFICATION_TIMES # Функция для проверки, нужно ли отправлять уведомления в текущее время async def scheduler(): while True: if should_send_notifications(): await send_notifications() await asyncio.sleep(45) # Асинхронная функция для запуска polling и планировщика async def main(): # Запуск планировщика asyncio.create_task(scheduler()) # Параллельно запускаем планировщик logger.info("Планировщик запущен") # Запуск polling бота await dp.start_polling(bot) logger.info("Polling бота запущен") if __name__ == '__main__': # Запуск основного цикла событий asyncio.run(main())