Исходный код raito.plugins.roles.filter

from __future__ import annotations

from typing import TYPE_CHECKING, Any

from aiogram import Bot
from aiogram.filters import Filter
from aiogram.types import TelegramObject, User
from typing_extensions import override

from .data import RoleData

if TYPE_CHECKING:
    from raito.core.raito import Raito

__all__ = ("RoleFilter",)

FLAG_NAME = "raito__roles"


[документация] class RoleFilter(Filter): """Filter for checking user roles. This filter is used to verify whether the user associated with a Telegram event has a specific role assigned, such as "admin", "moderator", etc. It also attaches role metadata to the handler's flags for use in command registration and visualization logic. """ def __init__( self, slug: str, name: str, description: str, emoji: str, ) -> None: """Initialize the RoleFilter. :param slug: Unique identifier of the role (e.g., "developer") :param name: Display name of the role (e.g., "Administrator") :param description: Description of the role :param emoji: Emoji used to visually represent the role """ self.data = RoleData(slug=slug, name=name, description=description, emoji=emoji)
[документация] @classmethod def from_data(cls, data: RoleData) -> RoleFilter: """Create a RoleFilter from a RoleData instance. :param data: RoleData instance containing role metadata :return: A new RoleFilter instance """ return RoleFilter( slug=data.slug, name=data.name, description=data.description, emoji=data.emoji, )
[документация] @override def update_handler_flags(self, flags: dict[str, Any]) -> None: """Attach role metadata to handler flags. This allows external tools to collect and display role-related constraints. """ roles = flags.setdefault("raito__roles", []) roles.append(self.data)
@override async def __call__( self, event: TelegramObject, raito: Raito, bot: Bot, *args: Any, **kwargs: Any, ) -> bool: """Check if the user in the event has the required role. This method is automatically called by aiogram when the filter is used. It extracts the user from the event and checks the role manager. :param event: Telegram update object (e.g., Message, CallbackQuery) :param raito: Raito context object :return: Whether the user has the specified role :raises TypeError: If user could not be resolved from the event """ user = getattr(event, "from_user", None) if not isinstance(user, User): msg = "Cannot resolve user from TelegramObject" raise TypeError(msg) return await raito.role_manager.has_role(bot.id, user.id, self.data.slug)