# CodeReview Bot Реализовано: - Регистрация в Telegram: `/register ` - Период недоступности: `/away ` - Настройка времени напоминания: `/reminder HH:MM` - Просмотр открытых ревью: `/myreviews` - Webhook Gitea по PR: - при создании PR без ревьюера бот назначает доступных участников - количество автоназначаемых ревьюеров задается `AUTO_ASSIGN_REVIEWERS_COUNT` (по умолчанию `2`) - при ручном назначении ревьюеров автоназначение пропускается - ставится метка `auto-assigned` (для автоназначения) - отправляются уведомления в Telegram ЛС - Уведомления по событиям PR: - новое назначение ревьюера; - новый комментарий; - новые коммиты в открытом PR (`synchronize`/`synchronized`); - статус ревью (`approved` / `request changes`); - закрытие/merge PR; - достижение порога approve: "можно мерджить" (`APPROVALS_REQUIRED_FOR_MERGE`). - Ежедневное напоминание по открытым ревью в настроенное время. - Техническая проверка сервиса: `GET /health` Время в боте (напоминания и проверка `away`) используется по МСК (UTC+3). ## Запуск ```bash python -m venv .venv . .venv/Scripts/activate pip install -r requirements.txt python -m uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env ``` ## Переменные окружения - `TELEGRAM_BOT_TOKEN` - обязательно - `TELEGRAM_WEBHOOK_SECRET` - обязательно, секрет для заголовка `X-Telegram-Bot-Api-Secret-Token` - `GITEA_BASE_URL` - обязательно для назначения ревьюера, например `https://git.example.com` - `GITEA_TOKEN` - обязательно для назначения/меток - `GITEA_WEBHOOK_SECRET` - обязательно, общий секрет webhook от Gitea - `REMINDER_TIME` - необязательно, по умолчанию `09:00` - `AUTO_ASSIGNED_LABEL` - необязательно, по умолчанию `auto-assigned` - `AUTO_ASSIGN_REVIEWERS_COUNT` - необязательно, по умолчанию `2` (сколько ревьюеров назначать автоматически) - `APPROVALS_REQUIRED_FOR_MERGE` - необязательно, по умолчанию `2` (порог approve для сообщения "можно мерджить") - `ALLOW_SELF_ASSIGN` - необязательно, по умолчанию `false` (для локального теста можно `true`) - `TELEGRAM_ALLOWED_CHAT_IDS` - необязательно, CSV списка `chat_id`, которым можно управлять ботом - `TELEGRAM_ALLOWED_USERNAMES` - необязательно, CSV списка Telegram username (без `@`) - `GITEA_COUNT_REPOS` - необязательно, CSV репозиториев `org/repo` для расчета нагрузки (исторический счетчик назначений) - `BOT_DB_PATH` - необязательно, по умолчанию `botreviewer.sqlite3` ## Webhook-эндпоинты - Обновления Telegram: `POST /telegram/webhook` - Webhook Gitea: `POST /gitea/webhook` Для Telegram укажите URL вашего сервиса с путем `/telegram/webhook` и `secret_token`. Для Gitea задайте общий secret и включите события: - `pull_request` - `issue_comment` - `pull_request_review` ## Локальная разработка через Tuna Если бот запущен локально, Gitea/Telegram не смогут достучаться до `localhost` без туннеля. 1. Запустите бота: ```bash python -m uvicorn main:app --host 0.0.0.0 --port 8080 --reload --env-file .env ``` 2. Поднимите туннель в Tuna(https://my.tuna.am/) на локальный порт `8080` и получите публичный URL, например: ```text https://example.ru.tuna.am ``` 3. Проверьте доступность сервиса: ```text https://example.ru.tuna.am/health ``` 4. Настройте webhook в Gitea: - Target URL: `https://example.ru.tuna.am/gitea/webhook` - Method: `POST` - Content Type: `application/json` - Secret: тот же, что в `GITEA_WEBHOOK_SECRET` - Events: `Pull Request`, `Issue Comment`, `Pull Request Review` 5. Настройте webhook в Telegram: ```text https://api.telegram.org/bot/setWebhook?url=https://example.ru.tuna.am/telegram/webhook&secret_token= ``` 6. Проверьте, что webhook установлен: ```text https://api.telegram.org/bot/getWebhookInfo ```