Квест-бот — конкурс пет-проектов

Posted by

Мой пет-проект, который даже смог выйти в продакшен: коллеги оценили идею развлечь участников конференции и дали возможность людям поиграть во время делового мероприятия. Если вы хотите собрать бота на JavaScript, эта статья поможет.

Суть игры

Участники конференции: руководители проектов, аналитики и прочие специалисты перемещаются от стойки к стойке, получают четырехзначные коды и отвечают на вопросы вроде этого:

По прохождении игры победителям вручают пакеты с подарками: кружка, Moleskin, шоколад и другие призы от партнеров на сумму около четырех тысяч рублей.

Состав проекта

Для краткосрочной работы телеграм-бота на JavaScript достаточно всего трех зависимостей: node-telegram-bot-api, SQLite для хранения данных игроков и util для обработки параллельных событий. По сути для каждого игрока создается копия игры со своими изменяемыми состояниями, поэтому единовременно минимальный сервер (Ubuntu 22.04 1,5 Гб RAM) может поддерживать игру почти сотни человек:

Зададим константы — они помогут запустить личного бота, чей токен отдает BotFather, а также укажут, с каким типом СУБД предстоит взаимодействовать:

Порядок методов и функций здесь сделать естественным не получится. JavaScript — интерпретируемый язык, и читает код построчно. То есть располагать объекты предстоит в таком порядке, чтобы к моменту запуска метода, обращающегося к базе данных, конфигурация была известна.

Переходы между стендами, победы, проигрыши

В этом участке кода мы проверяем прогресс игрока вне зависимости от того, новичок он или нет. Здесь же содержится обработчик для событий: «переход к следующему вопросу», «победа», «проигрыш», «изменение числа попыток».

Когда игрок вводит верный код, получает очередной вопрос:

Проверка игрока

Начинается игра с проверки пользователя. Если запись с таким ID Telegram уже есть в БД, то мы извлекаем число пройденных этапов. И затем высылаем новый вопрос:

Ниже привожу участок кода, отвечающий за запись данных игрока во время регистрации. Мы собираем имена, номера телефонов и Telegram ID. Стойки и вопросы миксуются, то есть у каждого игрока их набор индивидуальный. Это предотвращает игру толпой и минимизирует слив ответов:

Ппредусматриваем вывод ошибок в консоль:

Подсказка: Когда настало время игры, в мои обязанности входила лишь поддержка игроков. Проблем было немного, лишь три раза бот прекращал отвечать из-за ошибки, которую не удалось воспроизвести. В большинстве случаев перезапуск командой /start позволял продолжать квест.

SQL через командную строку

Я мониторила игроков, вычищала тестировщиков по окончании квеста через консоль (потому что было интересно освоить CLI-версию sqlite3).

Для чтения, записи, обновления и удаления было достаточно проложить путь к файлу.db:

И запустить предварительно установленную библиотеку:

Если нужно было проверить число игроков и донести призы впоследствии, подходил SQL-запрос, выдающий число победителей (stake – число пройденных вопросов от 0 до 10):

Хранилище отдавало такой результат:

Если речь шла о помощи игроку, застрявшему с ботом-молчуном, я пару раз дарила прохождение раунда:

Если в основной код проекта внедрялись изменения (с помощью Vim, прямо на месте), то с помощью process manager бот перезапускался:

Заключение

В мае 2023 года этот квест прошло около 150 человек, что весьма здорово, учитывая нулевые затраты на продвижение. И это увеличило время пребывания на стендах примерно на 11 часов.

Получается, людям действительно интересно проверять себя на прочность, отвечать на непростые, специфические вопросы и даже находить лазейки в моей логике. Нашлись игроки, которые увидели уязвимость в системе проверки победы. Мы решили оставить в качестве проверки демонстрацию скриншота с поздравлением о победе, и на этом сыграли два игрока: второпях проверять, реальный ли интерфейс Telegram, или просто скриншот, наши администраторы не стали. Прямо как на автомойке про 500 рублей: люди показывают мойщику лишь скриншот об оплате.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *