Reminder/start.py

72 lines
2.8 KiB
Python
Raw Normal View History

2024-10-24 19:19:30 +00:00
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())