init
This commit is contained in:
65
repos/user_repo.py
Normal file
65
repos/user_repo.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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
|
||||
Reference in New Issue
Block a user