72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
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())
|