Исходный код raito.plugins.roles.providers.base
from asyncio import Lock
from aiogram.fsm.storage.base import BaseStorage, DefaultKeyBuilder, StorageKey
from .protocol import IRoleProvider
__all__ = ("BaseRoleProvider",)
[документация]
class BaseRoleProvider(IRoleProvider):
"""Base role provider class."""
def __init__(self, storage: BaseStorage) -> None:
"""Initialize BaseRoleProvider."""
self.storage = storage
self.key_builder = DefaultKeyBuilder(with_destiny=True, with_bot_id=True)
self._lock = Lock()
def _build_key(self, *, bot_id: int) -> StorageKey:
"""Build a storage key for a specific bot.
:param bot_id: The Telegram bot ID
:return: The storage key
"""
return StorageKey( # applies to a single bot across all chats
bot_id=bot_id,
chat_id=0,
user_id=0,
destiny="roles",
)
[документация]
async def get_role(self, bot_id: int, user_id: int) -> str | None:
"""Get the role for a specific user.
:param bot_id: The Telegram bot ID
:param user_id: The Telegram user ID
:return: The role slug or None if not found
"""
key = self._build_key(bot_id=bot_id)
data: dict[str, str] = await self.storage.get_data(key)
return data.get(str(user_id))
[документация]
async def set_role(self, bot_id: int, user_id: int, role_slug: str) -> None:
"""Set the role for a specific user.
:param bot_id: The Telegram bot ID
:param user_id: The Telegram user ID
:param role_slug: The role slug to assign
"""
key = self._build_key(bot_id=bot_id)
async with self._lock:
data: dict[str, str] = await self.storage.get_data(key)
data[str(user_id)] = role_slug
await self.storage.set_data(key, data)
[документация]
async def remove_role(self, bot_id: int, user_id: int) -> None:
"""Remove the role for a specific user.
:param bot_id: The Telegram bot ID
:param user_id: The Telegram user ID
"""
key = self._build_key(bot_id=bot_id)
async with self._lock:
data: dict[str, str] = await self.storage.get_data(key)
data.pop(str(user_id), None)
await self.storage.set_data(key, data)
[документация]
async def migrate(self) -> None:
"""Initialize the storage backend (create tables, etc.)."""
return
[документация]
async def get_users(self, bot_id: int, role_slug: str) -> list[int]:
"""Get all users with a specific role.
:param bot_id: The Telegram bot ID
:param role_slug: The role slug to check for
:return: A list of Telegram user IDs
"""
key = self._build_key(bot_id=bot_id)
async with self._lock:
data: dict[str, str] = await self.storage.get_data(key)
return [int(user_id) for user_id, user_role in data.items() if user_role == role_slug]