from datetime import datetime, timedelta from enum import Enum from aiogram.types import User from motor.motor_asyncio import AsyncIOMotorClient class UserStatus: ALLOWED = "allowed" DENIED = "denied" PENDING = "pending" NONE = "none" # Пользователя нет в базе class UsersRepo: def __init__(self, client: AsyncIOMotorClient, db_name="bot_db"): self.collection = client[db_name]["users"] async def get_user(self, user_id: int): return await self.collection.find_one({"user_id": user_id}) async def create_or_update_request(self, user: User): """ Обновляет дату последнего запроса и ставит статус PENDING. Сохраняет всю инфу о юзере. """ now = datetime.now() data = { "user_id": user.id, "username": user.username, "full_name": user.full_name, "status": UserStatus.PENDING, "last_request_date": now } await self.collection.update_one( {"user_id": user.id}, {"$set": data}, upsert=True ) async def set_status(self, user_id: int, status: str): """Меняет статус (разрешен/запрещен)""" await self.collection.update_one( {"user_id": user_id}, {"$set": {"status": status}} ) async def can_request_access(self, user_id: int) -> bool: """ Проверяет, можно ли отправить запрос (прошло ли 24 часа). Возвращает True, если пользователя нет или прошло > 24ч. """ user = await self.get_user(user_id) if not user: return True last_date = user.get("last_request_date") if not last_date: return True # Проверка на 24 часа if datetime.now() - last_date > timedelta(hours=24): return True return False