Reminder/start.py
2024-10-24 22:19:30 +03:00

72 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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())