domovoy_bot/utils/decorators.py
Admin ba4676b0af v1.0 MVP - Инициализация проекта 🏠
 Регистрация и верификация жильцов
 Рейтинг активности (уровни)
 Детект шпионов (Score 0-100)
 Анти-мат система (3 предупреждения → бан)
 Админ-панель с рассылкой
 Учёт квартир (несколько жильцов)
 Телефоны экстренных служб и мастеров
 Еженедельный экспорт JSON
 Прокси (socks5) для обхода РКН

Бекап: backups/versions/v1.0_mvp_2026-02-26/

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
2026-02-27 10:54:16 +00:00

58 lines
2.2 KiB
Python

"""
Декораторы для хендлеров
"""
from functools import wraps
from aiogram.types import Message, CallbackQuery
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from database.models import User
import config
async def get_user_from_db(session: AsyncSession, user_id: int) -> User | None:
"""Получить пользователя из БД"""
result = await session.execute(select(User).where(User.user_id == user_id))
return result.scalar_one_or_none()
def admin_only(func):
"""Только для администраторов"""
@wraps(func)
async def wrapper(message: Message, *args, **kwargs):
if not config.is_admin(message.from_user.id):
await message.answer('❌ Эта команда доступна только администраторам')
return
return await func(message, *args, **kwargs)
return wrapper
def verified_only(func):
"""Только для верифицированных жильцов"""
@wraps(func)
async def wrapper(message: Message, *args, **kwargs):
# Проверяем в БД
from database.db import AsyncSessionLocal
from sqlalchemy import select
from database.models import User
async with AsyncSessionLocal() as session:
user = await get_user_from_db(session, message.from_user.id)
if not user or not user.verified:
await message.answer(
'❗ Для использования этой команды пройдите верификацию\n'
'Отправьте номер квартиры фото квитанции'
)
return
return await func(message, *args, **kwargs)
return wrapper
def admin_callback_only(func):
"""Только для администраторов (callback queries)"""
@wraps(func)
async def wrapper(callback: CallbackQuery, *args, **kwargs):
if not config.is_admin(callback.from_user.id):
await callback.answer('❌ Только для администраторов', show_alert=True)
return
return await func(callback, *args, **kwargs)
return wrapper