Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
__pycache__/
*.py[codz]
*$py.class
.DS_Store

# C extensions
*.so
Expand Down Expand Up @@ -173,7 +174,7 @@ cython_debug/
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
.idea/

# Abstra
# Abstra is an AI-powered process automation framework.
Expand All @@ -182,15 +183,21 @@ cython_debug/
.abstra/

# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/

# Ruff stuff:
.ruff_cache/

# Generated OpenAPI client
itsreg_api/
openapi_client/
itsreg_api_client/
its_reg_api_client/

# PyPI configuration file
.pypirc

Expand Down
27 changes: 27 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- id: check-merge-conflict

- repo: https://github.com/psf/black
rev: 23.12.1
hooks:
- id: black
language_version: python3

- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
args: ["--profile", "black"]

- repo: https://github.com/PyCQA/flake8
rev: 6.1.0
hooks:
- id: flake8
args: ["--max-line-length=120", "--extend-ignore=E203"]
26 changes: 26 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
VENV=.venv
PYTHON=$(VENV)/bin/python
PIP=$(VENV)/bin/pip
OPENAPI_CLIENT=$(VENV)/bin/openapi-python-client

$(VENV):
python3 -m venv $(VENV)

install: $(VENV)
$(PIP) install --upgrade pip
$(PIP) install -r requirements.txt
$(PIP) install -r requirements-dev.txt
$(VENV)/bin/pre-commit install

generate-client: $(VENV)
rm -rf its_reg_api_client itsreg_api_client openapi_client itsreg_api
$(OPENAPI_CLIENT) generate \
--url https://raw.githubusercontent.com/bmstu-itstech/itsreg/main/api/openapi/bots.yaml \
--config openapi-config.json \
--meta none

run: generate-client
$(PYTHON) -m itsreg_cli

clean:
rm -rf $(VENV) itsreg_api
191 changes: 190 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,190 @@
# itsreg-cli
# itsreg-cli

TUI клиент для управления Telegram-ботами ITS Reg.

## Установка

### Требования

- Python 3.10+
- pip
- git

### Шаги установки

```bash
git clone https://github.com/bmstu-itstech/itsreg-cli
cd itsreg-cli
make install
```

Команда `make install` создаст виртуальное окружение и установит все зависимости.

## Запуск

### Использование переменных окружения

```bash
export ITSREG_JWT_TOKEN=your_jwt_token_here
export ITSREG_API_URL=https://itsreg.itsbmstu.ru/api/v2/
make run
```

### Использование .env файла

Создайте файл `.env` в корне проекта:

```env
ITSREG_API_URL=https://itsreg.itsbmstu.ru/api/v2/
ITSREG_JWT_TOKEN=your_jwt_token_here
```

Затем запустите:

```bash
make run
```

### Использование аргументов командной строки

```bash
python -m itsreg_cli --api https://itsreg.itsbmstu.ru/api/v2/ --jwt-token your_jwt_token
```

### Аргументы CLI

- `--api URL` - Базовый URL API (по умолчанию: из переменной окружения `ITSREG_API_URL`)
- `--jwt-token TOKEN` - JWT токен для аутентификации (по умолчанию: из переменной окружения `ITSREG_JWT_TOKEN`)

### Приоритет настроек

1. Аргументы командной строки (`--api`, `--jwt-token`)
2. Переменные окружения (`ITSREG_API_URL`, `ITSREG_JWT_TOKEN`)
3. Файл `.env`

Если JWT токен не указан ни одним из способов, приложение завершится с ошибкой.

## Функционал

### Главное меню

При запуске приложения открывается главное меню с опциями:

- **Создать бота** - интерактивное создание нового бота
- **Мои боты** - просмотр списка ваших ботов
- **Выход** - завершение работы

### Создание бота

Интерактивный режим создания бота позволяет:

1. **Основная информация**

- Указать идентификатор бота (ID)
- Ввести Telegram токен от BotFather
2. **Создание узлов (nodes)**

- Указать номер состояния (state) - любое положительное число
- Задать название узла (title)
- Добавить одно или несколько сообщений для пользователя
- Настроить переходы (edges) между узлами:
- **Тип условия (predicate)**:
- **Всегда** - переход срабатывает на любое сообщение
- **Точный текст** - переход по точному совпадению текста
- **Регекс** - переход по регулярному выражению
- **Целевое состояние** - номер узла, к которому произойдет переход
- **Операция**:
- `noop` - ничего не происходит
- `save` - сохранить или перезаписать ответ пользователя
- `append` - добавить ответ к предыдущему
- Добавить опции (кнопки) для пользователя
3. **Создание связанных узлов**

- При указании перехода к несуществующему узлу, система предложит создать его немедленно
- Поддержка произвольных номеров состояний (1, 2, 104, 201 и т.д.)
4. **Точки входа (entries)**

- Задать ключи для входа в сценарий (например, `start`, `m_ok`, `m_progress`)
- Указать начальное состояние для каждой точки входа
- Команды доступны пользователям как `/start`, `/m_ok` и т.д.

### Просмотр ботов

В разделе "Мои боты":

- Отображается таблица со всеми вашими ботами
- Показывается ID, статус, включен ли автозапуск, количество узлов
- Выбор бота для просмотра деталей

### Управление ботом

После выбора бота доступны действия:

1. **Включить автозапуск**

- Добавляет бота в автозапуск
- Бот будет автоматически запускаться при перезагрузке сервера
2. **Выключить автозапуск**

- Удаляет бота из автозапуска
- Бот останется доступен, но не будет автоматически запускаться
3. **Удалить бота**

- Полное удаление бота со всеми данными
- Требует подтверждения
4. **Просмотр деталей**

- Статус бота (running/idle/dead)
- Полный JSON сценария со всеми узлами и переходами

## Архитектура

```
itsreg-cli/
├── itsreg_cli/
│ ├── domain/ # Доменные модели (Pydantic)
│ │ └── models.py # Bot, Node, Edge, Script, Message
│ ├── api/ # API клиент
│ │ └── client.py # ItsRegClient (httpx)
│ ├── services/ # Бизнес-логика
│ │ └── bot_service.py # Интерактивное создание ботов
│ ├── tui/ # Пользовательский интерфейс
│ │ └── menus.py # Меню и экраны (questionary + rich)
│ ├── config/ # Конфигурация
│ │ └── settings.py # Загрузка настроек из .env
│ └── main.py # Точка входа
├── api/
│ └── openapi/
│ └── bots.yaml # OpenAPI спецификация
├── requirements.txt # Зависимости для запуска
├── requirements-dev.txt # Зависимости для разработки
├── Makefile # Команды для разработки
├── .pre-commit-config.yaml # Настройки pre-commit хуков
└── README.md # Этот файл
```

## Разработка

### Установка зависимостей для разработки

```bash
make install
```

### Генерация клиента API

При обновлении OpenAPI спецификации:

```bash
make generate-client
```

Используется `openapi-python-client` и спецификация из `api/openapi/bots.yaml`.

### Ошибка подключения к API

Проверьте:

- Доступность API по адресу из `ITSREG_API_URL`
- Корректность JWT токена
- Наличие интернет-соединения
Loading
Loading