Files
AnonBot/services/permissions/permissions.py

197 lines
8.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Конкретные реализации разрешений
Каждое разрешение - отдельный класс, что позволяет легко добавлять новые без изменения существующего кода
"""
from .base import Permission
from services.infrastructure.database import DatabaseService
from services.infrastructure.logger import get_logger
logger = get_logger(__name__)
class AdminPermission(Permission):
"""Разрешение для администраторов"""
def __init__(self):
super().__init__(
name="admin",
description="Права администратора"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка, является ли пользователь администратором"""
return user_id in config.ADMINS
class SuperuserPermission(Permission):
"""Разрешение для суперпользователей"""
def __init__(self):
super().__init__(
name="superuser",
description="Права суперпользователя"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка, является ли пользователь суперпользователем"""
try:
user = await database.get_user(user_id)
return user.is_superuser if user else False
except Exception as e:
logger.error(f"Ошибка при проверке суперпользователя {user_id}: {e}")
return False
class ViewStatsPermission(Permission):
"""Разрешение на просмотр статистики"""
def __init__(self):
super().__init__(
name="view_stats",
description="Просмотр статистики"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на просмотр статистики"""
# Администраторы и суперпользователи могут просматривать статистику
admin_permission = AdminPermission()
superuser_permission = SuperuserPermission()
is_admin = await admin_permission.check(user_id, database, config)
is_superuser = await superuser_permission.check(user_id, database, config)
return is_admin or is_superuser
class AdminPanelPermission(Permission):
"""Разрешение на доступ к админ панели"""
def __init__(self):
super().__init__(
name="admin_panel",
description="Доступ к админ панели"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на доступ к админ панели"""
# Администраторы и суперпользователи могут использовать админ панель
admin_permission = AdminPermission()
superuser_permission = SuperuserPermission()
is_admin = await admin_permission.check(user_id, database, config)
is_superuser = await superuser_permission.check(user_id, database, config)
return is_admin or is_superuser
class ManageUsersPermission(Permission):
"""Разрешение на управление пользователями"""
def __init__(self):
super().__init__(
name="manage_users",
description="Управление пользователями"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на управление пользователями"""
# Администраторы и суперпользователи могут управлять пользователями
admin_permission = AdminPermission()
superuser_permission = SuperuserPermission()
is_admin = await admin_permission.check(user_id, database, config)
is_superuser = await superuser_permission.check(user_id, database, config)
return is_admin or is_superuser
class BroadcastPermission(Permission):
"""Разрешение на рассылку сообщений"""
def __init__(self):
super().__init__(
name="broadcast",
description="Рассылка сообщений"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на рассылку"""
# Только администраторы могут делать рассылку
admin_permission = AdminPermission()
return await admin_permission.check(user_id, database, config)
class SuperuserOnlyPermission(Permission):
"""Разрешение только для суперпользователей"""
def __init__(self):
super().__init__(
name="superuser_only",
description="Только для суперпользователей"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права только для суперпользователей"""
superuser_permission = SuperuserPermission()
return await superuser_permission.check(user_id, database, config)
class ViewQuestionsPermission(Permission):
"""Разрешение на просмотр вопросов"""
def __init__(self):
super().__init__(
name="view_questions",
description="Просмотр вопросов"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на просмотр вопросов"""
# Все активные пользователи могут просматривать вопросы
try:
user = await database.get_user(user_id)
return user.is_active if user else False
except Exception as e:
logger.error(f"Ошибка при проверке активности пользователя {user_id}: {e}")
return False
class AskQuestionsPermission(Permission):
"""Разрешение на задавание вопросов"""
def __init__(self):
super().__init__(
name="ask_questions",
description="Задавание вопросов"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на задавание вопросов"""
# Все активные пользователи могут задавать вопросы
try:
user = await database.get_user(user_id)
return user.is_active and not user.is_banned if user else False
except Exception as e:
logger.error(f"Ошибка при проверке права задавать вопросы для пользователя {user_id}: {e}")
return False
class AnswerQuestionsPermission(Permission):
"""Разрешение на ответы на вопросы"""
def __init__(self):
super().__init__(
name="answer_questions",
description="Ответы на вопросы"
)
async def check(self, user_id: int, database: DatabaseService, config) -> bool:
"""Проверка права на ответы на вопросы"""
# Все активные пользователи могут отвечать на вопросы
try:
user = await database.get_user(user_id)
return user.is_active and not user.is_banned if user else False
except Exception as e:
logger.error(f"Ошибка при проверке права отвечать на вопросы для пользователя {user_id}: {e}")
return False