init
This commit is contained in:
0
repos/__init__.py
Normal file
0
repos/__init__.py
Normal file
16
repos/char_repo.py
Normal file
16
repos/char_repo.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from motor.motor_asyncio import AsyncIOMotorClient
|
||||
|
||||
from models.Character import Character
|
||||
|
||||
|
||||
class CharacterRepo:
|
||||
def __init__(self, client: AsyncIOMotorClient, db_name="bot_db"):
|
||||
self.collection = client[db_name]["characters"]
|
||||
|
||||
async def add_character(self, character: Character) -> Character:
|
||||
op = await self.collection.insert_one(character.model_dump())
|
||||
character.id = op.inserted_id
|
||||
return character
|
||||
|
||||
async def get_character(self, character_id: int) -> Character:
|
||||
return await self.collection.find_one({"id": character_id})
|
||||
9
repos/dao.py
Normal file
9
repos/dao.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from motor.motor_asyncio import AsyncIOMotorClient
|
||||
|
||||
from repos.char_repo import CharacterRepo
|
||||
from repos.user_repo import UsersRepo
|
||||
|
||||
|
||||
class DAO:
|
||||
def __init__(self, client: AsyncIOMotorClient, db_name="bot_db"):
|
||||
self.chars = CharacterRepo(client, db_name)
|
||||
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