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