Доступ по ролям¶
В Raito встроена система ролей, чтобы закрывать команды по уровню доступа и не писать собственные проверки.
Встроенные роли¶
Девять ролей уже готовы. Импортируйте их из rt и применяйте как фильтры aiogram:
from aiogram import Router, filters, types
from raito import rt
from raito.rt import OWNER, ADMINISTRATOR, MODERATOR
router = Router(name="moderation")
@router.message(filters.Command("ban"), OWNER | ADMINISTRATOR | MODERATOR)
@rt.description("Ban a user")
@rt.params(user_id=int)
async def ban(message: types.Message, user_id: int, bot: Bot) -> None:
await bot.ban_chat_member(chat_id=message.chat.id, user_id=user_id)
await message.answer("✅ User banned")
Роль, использованная как фильтр, пропускает пользователя, только если он ею сейчас обладает. Объединяйте роли через | в значении «любая из перечисленных».
Полный список (OWNER, DEVELOPER, ADMINISTRATOR, MODERATOR, MANAGER, SPONSOR, GUEST, SUPPORT, TESTER) и способ завести свою роль смотрите в руководстве по ролям.
Разработчики¶
Передайте доверенные ID пользователей в developers при создании Raito. Они неявно получают роль developer, что удобно для себя во время разработки:
raito = Raito(dispatcher, "my_bot/handlers", developers=[123456789])
Назначение ролей на ходу¶
Роли хранит провайдер, выбранный по вашему FSM-хранилищу (по умолчанию в памяти; SQLite, PostgreSQL, Redis или JSON, если настроите). Пользователь с управляющей ролью может выдавать роли другим прямо из чата:
.rt roles → opens a role picker, then asks for a user ID
.rt revoke → removes a user's role
.rt staff → lists everyone and their roles
Эти команды .rt входят в набор dev-инструментов Raito, подробнее в справочнике по командам.
Предупреждение
Пользователь с ролью developer может запускать .rt eval и .rt bash (произвольный код и shell), но только если бот запущен с Raito(..., enable_dangerous_commands=True). Держите этот флаг выключенным, пока не понимаете риск.
Вот основной цикл: файлы становятся роутерами, декораторы добавляют поведение, роли ограничивают доступ. Что дальше подскажет, что есть покрупнее.