/
artyuhovs
/
AIFeedBackTrainingBot
Обзор
Документация
Войти
/
artyuhovs
/
AIFeedBackTrainingBot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/bot/command_specs.py
72 строки
4 KB
Codex
Добавить статистику использования по пользователям
21 июл 2026, 01:34
21 июл 2026, 01:34
02504ee
Код
Авторство
О чём код?
from __future__ import annotations from dataclasses import dataclass from enum import StrEnum class CommandCapability(StrEnum): PUBLIC = "public" PARTICIPANT = "participant" CURATOR = "curator" ADMIN = "admin" @dataclass(frozen=True) class CommandSpec: name: str description: str capability: CommandCapability aliases: tuple[str, ...] = () visible_in_menu: bool = True COMMAND_SPECS: tuple[CommandSpec, ...] = ( CommandSpec("start", "что умеет бот и выбор потока", CommandCapability.PUBLIC), CommandSpec("help", "помощь и список команд", CommandCapability.PUBLIC), CommandSpec("train", "свободно потренировать обратную связь", CommandCapability.PUBLIC), CommandSpec("enroll", "подать заявку на учебный поток", CommandCapability.PUBLIC), CommandSpec("streams", "потоки и заявки на доступ", CommandCapability.PUBLIC, aliases=("stream",)), CommandSpec("whoami", "мой статус доступа", CommandCapability.PUBLIC), CommandSpec("version", "версия бота", CommandCapability.PUBLIC), CommandSpec("course", "моя программа обучения", CommandCapability.PARTICIPANT, visible_in_menu=False), CommandSpec("tasks", "мои учебные задания", CommandCapability.PARTICIPANT), CommandSpec("progress", "мой учебный прогресс", CommandCapability.PARTICIPANT), CommandSpec("results", "мои итоги обучения", CommandCapability.PARTICIPANT), CommandSpec("reviews", "анонимные работы на проверку", CommandCapability.PARTICIPANT), CommandSpec("review", "оценить работу", CommandCapability.PARTICIPANT, visible_in_menu=False), CommandSpec("ratereview", "оценить рецензию", CommandCapability.PARTICIPANT, visible_in_menu=False), CommandSpec("selfreview", "самооценка", CommandCapability.PARTICIPANT, visible_in_menu=False), CommandSpec("cohort", "мой поток как куратора", CommandCapability.CURATOR), CommandSpec("users", "пользователи и доступы", CommandCapability.ADMIN), CommandSpec("stats", "статистика использования по пользователям", CommandCapability.ADMIN), CommandSpec("adduser", "выдать доступ: /addUser @username [поток]", CommandCapability.ADMIN), CommandSpec("removeuser", "исключить из потока: /removeUser @username [поток]", CommandCapability.ADMIN), CommandSpec("addstream", "создать поток: /addStream Название", CommandCapability.ADMIN), CommandSpec("courses", "курсы и опубликованные версии", CommandCapability.ADMIN), CommandSpec( "startcourse", "запустить курс: /startCourse STREAM_ID VERSION_ID YYYY-MM-DD", CommandCapability.ADMIN, ), CommandSpec("teststage", "тестовый этап: /testStage next|prev [поток]", CommandCapability.ADMIN), CommandSpec("admin", "выдать права администратора", CommandCapability.ADMIN, visible_in_menu=False), CommandSpec("unadmin", "снять права администратора", CommandCapability.ADMIN, visible_in_menu=False), CommandSpec("role", "изменить роль в потоке", CommandCapability.ADMIN, visible_in_menu=False), ) def command_names(capability: CommandCapability) -> set[str]: names: set[str] = set() for spec in COMMAND_SPECS: if spec.capability == capability: names.add(spec.name) names.update(spec.aliases) return names def menu_commands(capability: CommandCapability) -> tuple[tuple[str, str], ...]: return tuple( (spec.name, spec.description) for spec in COMMAND_SPECS if spec.capability == capability and spec.visible_in_menu )