Телеграм-бот для проверки формальных критериев и подготовки заявки на вступление в Ассоциацию Монтелиберо.
/startвсегда начинает новую попытку, а не возобновляет прежнюю.- Telegram username настоятельно рекомендуется, но не является обязательным критерием.
- Доказательство владения Stellar-адресом не требуется.
- Для рекомендации достаточно одной
RecommendToMTLAот адреса с балансомMTLAP >= 2. - После успешных проверок бот сообщает, что кандидат готов самостоятельно подать заявление через обратную связь движения. Фактическую подачу и решение Ассоциации бот не отслеживает.
- Проверка рекомендации должна использовать данные конкретного аккаунта BSN, а не скачивать полный
bsn.jsonдля каждого действия.
Основные правила процесса закреплены тестами. Рекомендации проверяются через per-account BSN endpoint, а достаточный баланс рекомендателя — по актуальному состоянию точного MTLAP asset в Horizon.
- Автоматическое определение языка пользователя (русский/английский)
- Пошаговая проверка критериев вступления
- Проверка наличия юзернейма
- Согласие с условиями Соглашения
- Ввод и проверка Стеллар адреса
- Проверка линии доверия к токену MTLAP
- Проверка BSN рекомендаций от верифицированных участников МТЛА
- Хранение данных в MongoDB
- Отслеживание прогресса пользователей
- Административные инструменты для анализа
- Python 3.11
python-telegram-bot- для работы с Telegram APIstellar-sdk- для работы со Стеллар блокчейномpymongo- для работы с MongoDBpython-dotenv- для загрузки переменных окруженияaiohttp- для асинхронных HTTP запросов к BSN Expert
- MongoDB 4.0+
- Доступ к интернету для работы с Telegram API и Stellar Network
- Доступ к BSN Expert API для проверки рекомендаций
- Клонируйте репозиторий:
git clone <repository-url>
cd MTLA_join_bot- Установите зависимости:
pip install -r requirements.txt- Установите и запустите MongoDB:
# Ubuntu/Debian
sudo apt-get install mongodb
# macOS (с Homebrew)
brew install mongodb-community
brew services start mongodb-community
# Или используйте Docker
docker run -d -p 27017:27017 --name mongodb mongo:7.0- Создайте файл
.envна основеenv_example.txt:
cp env_example.txt .env
chmod 600 .env- Отредактируйте
.envфайл, указав:TELEGRAM_TOKEN- токен вашего бота от @BotFatherADMIN_IDS- ID администраторов через запятую (например: 123456789,987654321)MONGODB_URI- URI для подключения к MongoDBMONGODB_DB- название базы данныхMONGODB_COLLECTION- название коллекции
python main.py-
Убедитесь, что установлен Docker
-
Создайте файл
.envна основеenv_example.txt:cp env_example.txt .env chmod 600 .env # Отредактируйте .env файл, указав TELEGRAM_TOKEN и ADMIN_IDSФайл
.envисключён из Docker build context и не попадает в образ. Compose передаёт его только сервису бота при запуске. После изменения.envдостаточно перезапустить сервисы; пересобирать образ не требуется. Это совместимый режим, но значениеTELEGRAM_TOKENостаётся доступно администраторам Docker через сведения о контейнере.Чтобы использовать другой файл окружения, задайте путь перед запуском:
MTLA_JOIN_BOT_ENV_FILE=/secure/path/mtla-join-bot.env ./docker-simple.sh run
Для production предпочтителен отдельный файл, содержащий только Telegram token. Удалите строку
TELEGRAM_TOKENиз общего env-файла, ограничьте доступ к обоим файлам и передайте абсолютный путь:chmod 600 /secure/path/mtla-join-bot.env /secure/path/telegram-token MTLA_JOIN_BOT_ENV_FILE=/secure/path/mtla-join-bot.env \ MTLA_JOIN_BOT_TELEGRAM_TOKEN_FILE=/secure/path/telegram-token \ ./docker-simple.sh run
В этом режиме token подключается через Compose secret read-only в
/run/secretsи не сохраняется в Docker image илиConfig.Env.compose.yamlзапускает два отдельных сервиса: bot и MongoDB 7.0. MongoDB закреплена по digest, имеет healthcheck и хранит данные в прежнем named volumemtla_join_bot_data; остановка сервисов volume не удаляет. Bot запускается непривилегированным пользователем и стартует только после готовности MongoDB. -
Запустите бота:
# Только для действительно новой пустой установки, один раз: ./docker-simple.sh bootstrap # Собрать образ и запустить ./docker-simple.sh build && ./docker-simple.sh run
Если production volume уже должен существовать, не запускайте
bootstrap: отсутствиеmtla_join_bot_dataозначает ошибку имени, хоста или восстановления, иrunнамеренно завершится без запуска пустой базы. -
Проверьте статус:
./docker-simple.sh status
-
Посмотрите логи:
./docker-simple.sh logs
-
Остановите бота:
./docker-simple.sh stop
- Сборка образа:
./docker-simple.sh build - Явно создать пустой volume новой установки:
./docker-simple.sh bootstrap - Запуск:
./docker-simple.sh run - Остановка:
./docker-simple.sh stop - Логи:
./docker-simple.sh logs - Перезапуск:
./docker-simple.sh restart - Очистка данных после backup:
MTLA_JOIN_BOT_CONFIRM_CLEAN=YES ./docker-simple.sh clean - Войти в контейнер:
./docker-simple.sh shell
Production-релизы собираются в GitHub Actions и публикуются в GHCR с обычным
тегом latest и неизменяемыми тегами версий. Portainer Swarm stack, первый
перенос MongoDB в отдельный сервис, проверки и откат описаны в
docs/RELEASE.md.
MTLA_join_bot/
├── src/
│ └── mtla_bot/ # Основной пакет
│ ├── __init__.py # Инициализация пакета
│ ├── bot.py # Основной файл бота
│ ├── config.py # Конфигурация и настройки
│ ├── stellar_client.py # Клиент для работы со Стеллар блокчейном
│ ├── eligibility.py # Чистые правила допуска кандидата
│ ├── recommendation_gateway.py # Per-account BSN и live Horizon
│ ├── user_states.py # Управление состояниями пользователей
│ ├── database.py # Модуль для работы с MongoDB
│ ├── admin_tools.py # Административные инструменты
│ ├── admin_config.py # Конфигурация администраторов
│ └── messages.py # Тексты сообщений на разных языках
├── main.py # Точка входа для запуска
├── requirements.txt # Зависимости проекта
├── Dockerfile # Bot-only Docker image
├── compose.yaml # Bot + отдельная MongoDB
├── compose.secret.yaml # File-secret override
├── docker-simple.sh # Безопасная обвязка Docker Compose
└── .env # Переменные окружения
/start- начать процесс заново/restart- начать процесс заново/language- сменить язык
Бот поддерживает административные команды для мониторинга и анализа:
/stats- показывает статистику по пользователям/incomplete- показывает незавершенных пользователей/reminders [дни]- показывает кандидатов для напоминания (по умолчанию 7 дней)/user_info <user_id>- показывает детали конкретного пользователя/help_admin- показывает справку по административным командам
- Получите ваш Telegram ID у бота @userinfobot
- Добавьте ваш ID в переменную
ADMIN_IDSв файле.env - Перезапустите бота
Пример в .env файле:
ADMIN_IDS=123456789,987654321- Рекомендация юзернейма - при его отсутствии бот настоятельно рекомендует установить username, но позволяет явно продолжить без него
- Согласие с условиями - пользователь должен согласиться с Соглашением
- Ввод Стеллар адреса - пользователь вводит свой адрес с возможностью получить справку
- Проверка адреса - проверяется существование адреса и линия доверия к MTLAP
- Проверка рекомендаций - проверяется наличие рекомендации от верифицированного участника (минимум 2 MTLAP токена)
- Завершение - если все проверки пройдены, бот сообщает, что кандидат готов подать заявление через обратную связь движения
- Обычные клавиатурные кнопки вместо inline кнопок для лучшего UX
- Раздельные сообщения для каждой проблемы (не один длинный список)
- Автоматическое очищение кнопок при переходе между шагами
- Контекстная помощь с ссылками на статьи и чаты
Бот использует MongoDB для хранения данных пользователей. Структура документа пользователя:
{
"user_id": 123456789,
"username": null,
"attempt_id": "7fa8e4d6d4994c7f86aab8f9bf43c424",
"language": "ru",
"state": "checking_username",
"stellar_address": "G...",
"has_username": false,
"username_warning_acknowledged": true,
"agreed_to_terms": true,
"has_trustline": true,
"candidate_mtlap_balance": "0",
"has_recommendation": false,
"recommender_username": null,
"created_at": "2024-01-01T00:00:00Z",
"last_activity": "2024-01-01T00:00:00Z",
"progress": {
"username_check": false,
"agreement": true,
"address_entered": true,
"trustline_check": true,
"recommendation": false
}
}/start и /restart создают новый attempt_id и сбрасывают текущий прогресс.
Inline-кнопки процесса привязаны к попытке, поэтому кнопка из старого запуска
не может изменить новый процесс. Поле username допускает null.
PYTHONPATH=src python -m unittest discover -s tests -q- candidate_mtlap_balance - канонический баланс кандидата из проверенного snapshot
- has_recommendation - есть ли квалифицированная рекомендация
- final_delivery_message_id - Telegram message ID доставленного финального ответа
- final_delivered_at - время подтверждённой доставки
- final_delivery_attempts - общее число попыток отправки результата
Состояние finalizing означает, что все факты уже сохранены, но доставку
финального ответа или запись completed нужно повторить. Бот автоматически
подбирает такие записи после восстановления сервиса и после перезапуска;
каждая отправка сначала получает атомарный lease, а после трёх записанных
попыток фон перестаёт отправлять сам. Явная кнопка кандидата остаётся доступна:
она повторяет только доставку, а не проверки. Доставка at-least-once, поэтому при редком сбое между Telegram
и MongoDB финальное сообщение может прийти повторно.
Модуль admin_tools.py предоставляет инструменты для анализа данных:
from mtla_bot.admin_tools import AdminTools
admin = AdminTools()
# Получить статистику
stats = admin.get_user_statistics()
# Получить незавершенных пользователей
incomplete = admin.get_incomplete_users_report()
# Получить кандидатов для напоминания
reminders = admin.get_reminder_candidates(days_inactive=7)
# Получить детали пользователя
user_details = admin.get_user_details(user_id=123456789)Бот интегрирован с BSN Expert для проверки рекомендаций:
- Загрузка входящих
RecommendToMTLAтолько для проверяемого аккаунта - Проверка live-баланса рекомендателя (минимум 2 MTLAP точного issuer)
- Ограниченные timeout, retry, размер ответа и параллельность запросов
- Информативные сообщения о статусе рекомендаций
- Ссылки на чат Площади для получения рекомендаций
- Обычные клавиатурные кнопки для лучшего UX
- Раздельные сообщения для каждой проблемы
- Автоматическое очищение кнопок при переходах
- Контекстная помощь с эмодзи и ссылками
В файле config.py можно настроить:
- Ссылки на инструкции и статьи
- Адрес токена MTLAP
- Сеть Стеллар (mainnet/testnet)
- Параметры подключения к MongoDB
- Ссылки на чаты и боты для помощи
В файле messages.py добавьте новый язык в словарь MESSAGES и соответствующие ссылки в config.py.
Бот автоматически отслеживает:
- Прогресс каждого пользователя
- Время создания и последней активности
- Распределение пользователей по состояниям
- Пользователей для напоминания
При необработанной технической ошибке бот отправляет безопасное сообщение о временной недоступности вместо молчания. Ошибки BSN/Horizon не записываются как отсутствие обязательного условия.
MIT License