Telegram бот для сложных квестов

game_bots_telegram_3-300x300.jpgПостоянные пользователи нашего сайта должно быть в курсе огромного количества Телеграмм ботов и большом спектре задач которые они способны выполнять. Но, не все знают о том, что некоторые разработчики в формате Телеграмм бота сумели реализовать целые игры. Конечно, это не совсем те игры в которые мы привыкли играть на современных ПК, игровых консолях или даже смартфонах. Но, скоротать за ними время в какой-нибудь очереди или долгой поездке в транспорте вполне реально. Помимо этого, в данный момент в мессенджере процветают некогда популярные жанры текстовых квестов и викторин, для которых интерфейс Telegram бота подходит как нельзя лучше.

20 Mono@M0n0Bot — Карточные игры + Мафия, Монополия, Блиц, Кости. Подробнее

19 Tic Tac Toe Bot@rxoBot — Крестики-нолики.

18 Клубничная логика@StrawberryLogicBot — Простая логическая игра в которой Вы должны обыграть бота и заставить его съесть последнюю испорченную ягоду.

17 Quizarium@QuizariumBot — Викторина. Играй с друзьями и другими пользователями Телеграмм.

16 Telegram Quests@tquestsbot — Квесты-экскурсии по Москве в Telegram. Совмещай разгадывание квестов с посещением мест о которых в них идет речь.

15 Эврика@eureka_robot — Викторина. Игра для любителей размять мозг решая различные задания.

14 Угадай фильм по кадру, Правда или ложь (по темам кино и сериалы)@kinomanbot — Фильм по кадру и правда или ложь находятся в разделе игры, и являются лишь одной из функций бота посвященного кинематографу. Подробнее

13 Правда или ложь@TruthOrLieBot — Викторина. Отвечай на вопросы и узнавай новые факты.

12 Викторина от Панды@PandaQuizBot — Более 30000 вопросов разной сложности. Каждый следующий вопрос дороже предыдущего.

11 Тетрис@MyTetrisBot — Кажется, дальнейшие объяснения излишни. Подробнее

10 Викторина@BukToPuHaBoT — Соревнуйся с другими пользователями Телеграм отвечая на вопросы которые задает бот. Подробнее

9 Логово Маньяка@questquest_gamebot — Текстовый квест. В ваших руках находится спасение жизни человека, оказавшегося в лапах кровожадного маньяка. Подробнее

8 Арзаэль@arzael_bot — Хоррор-квест. Девочка заперта в незнакомом доме. В ее телефоне только твой номер. Она пишет, звонит, шлет видео. Успей спасти ее!

7 Bastion Siege@BastionSiegeBot — Многопользовательская стратегия симулирующая средневековые войны.

6 Chat Wars@ChatWarsBot — Телеграмм-фентези, RPG в чате и карманная стратегия.

5 Танковый Рейд@TanksGameBot — Текстовый квест. Действие происходит в 1944 году. Вы командир танкового взвода и от ваших команд зависит исход игры. Подробнее

4 Найди Ассоциации@ruassoc_bot — Соревнование с другими пользователями Телеграмм. Бот предлагает вам слово на которое в течении 60 сек. вам нужно написать в ответ как можно больше других слов которые у вас с ним ассоциируются. Подробнее

3 Привет, Незнакомец!@QuestGameBot и @QuestGame2Bot — Текстовый квест. Ваша задача — помочь герою квеста выбраться живым из океанской бездны в режиме реального времени. Подробнее

2 Village Game (Деревня)@villagegamebot — Стратегия. Самая популярная игра в мессенджере. Подробнее

1 Бесконечное Лето (Everlasting Summer)@EverlastingSummerBot — Визуальная новелла. Культовая игра от российских разработчиков. Подробнее

bot_b.png

Анализ индустрии квестов показывает, что составляющая внефраншизных квестов примерно 1/3 от всего имеющегося многообразия.

Небольшим городам не выгодно арендовать движки, но что тогда, квесты на бумажках? Нет, друзья, хотим познакомить вас с БЕСПЛАТНЫМ «Квест-ботом» в телеграме и с его создателем, итак знакомьтесь — Даниил Никанов, г. Шадринск.

Пару слов о себе, так сказать для знакомства?

Впервые сыграл 23 марта 2013 года, в местный аналог Дозора, но вскоре команда, с которой я играл, распалась, поэтому пришлось собрать свою) с тех пор и пошло. Три года назад открыл для себя Энкаунтер в Челябинске, стал регулярно ездить туда на игры, понравилось играть на движке.

У нас в Шадринске игры в основном проводили вручную, это создало некоторую специфику — большого количества кодов не сделать («живой» оператор не сможет столько принять), поэтому сложность росла в основном за счет усложнения заданий, сильная местная специфика.

К тому времени у меня уже был небольшой опыт проведения игр, возникло желание делать их в формате движков — когда на локации множество кодов, множество бонусов, равные условия за счет того, что движок не тормозит в отличие от живого оператора.

Но сообщество у нас в городе небольшое и мало пополняется новыми игроками — иногда игры проходят с 3-4 командами, а если наберется 10 команд, это уже очень хорошо) поэтому наиболее доступным вариантом было создание собственного движка в виде бота Телеграм, поддерживающего автоматическую выдачу заданий, состоящих текста, картинок, аудиозаписей, файлов и т.п., прием неограниченного числа кодов, учет бонусных кодов, разделение уровней игры по секторам.

А программирование это для тебя хобби или профессия?

Это хобби, по профессии я технический переводчик, но программирую на разных языках и платформах уже 15 лет как, уровень довольно приличный

А как появилась идея создать бот-движок?

По изначальной задумке бот должен был работать на любом ПК, например с флешки, периодически сохраняя состояние в виде файлов (как в компьютерных играх) — для повышения надежности, чтобы в случае проблем с ПК или интернетом можно было просто перенести его и продолжить игру.

Но также рассматривался вариант использования и удаленного сервера, поэтому для разработки была выбрана кросс-платформенная Java.

В конце 2016-го — начале 2017 года, тогда Телеграм еще не был официально заблокирован в РФ, необходимости в прокси-серверах не было.

Потом, после блокировки, пришлось добавить поддержку прокси-серверов, хотя куда более надежным вариантом для проведения игр оказалась аренда зарубежного VDS-хостинга.

А как загружается игра в бот?

Сценарий игры пишется в виде файла скрипта, используется специально разработанный «язык» — напоминает тэговую разметку на форумах, все ключевые слова русскоязычные.

В скрипте задаются:

  • уровни игры
  • задания (которые состоят из текстовых блоков и файлов, отправляемых в заданной последовательности)
  • до 3-х подсказок (время выдачи каждой подсказки задается независимо)
  • проходные и бонусные коды
  • коды-подсказки (при вводе таких кодов также могут выводиться любые текстовые блоки и картинки/файлы)
  • секторы, которые представляют собой этапы уровня — секторы могут открываться (активизироваться) вместе с уровнем или по заданному коду, выдавать собственное «подзадание» принимать собственные коды и т.п.

Игра может быть, как линейной, так и нелинейной — порядок уровней определяется специальной секцией/секциями.

То есть автору/оргу без знаний программирования игру не запустить?

Ну программирование это сильно сказано, все проще, чем кажется. Не сложнее написания сообщения на классическом интернет-форуме с выделением текста спойлеров и картинок тэгами

Написано очень подробное руководство по разработке сценариев, с картинками.

А как команды взаимодействуют с движком?

Перед началом игры команды регистрируются команды, капитаны добавляют бот, вводят код входа в игру, создают команды. Игроки затем могут вступать в команды, подавая заявки.

Капитаны команд могут добавлять или исключать игроков — предусмотрена возможность ограничения численности состава, а также разрешения/запрета вступления в игру после старта.

Управление ботом полностью осуществляется с помощью клавиатур, которые у рядовых и капитанов отличаются. Не требуется вводить команды типа /start и т.п., просто нажимаются кнопки)

Со стороны организатора игры используется админ-панель бота — это тоже чат с ботом, но в нем также в виде клавиатур доступны управляющие команды для контроля игры, статистики, сценария.

Что нужно организатору, чтобы провести игру через бота?

Нужно зарегистрировать свой бот в Телеграм, арендовать VDS (виртуальный выделенный сервер) за границей ИЛИ надежный (лучше платный) заграничный прокси сервер, установить бота на этом VDS или домашнем ПК (при использовании прокси), создать игровой сценарий.

Подробная пошаговая инструкция по всем этим процедурам есть в руководстве.

То есть необходимо развернуть бот на сервере?

Да, бот предоставляется как исполняемый файл, а не как готовый сервис.

Когда Телега не была заблокирована в РФ, все было намного проще, можно было просто запустить бот на домашнем ПК.

Хорошо, как тогда организатору провести игру через бота?

Все просто — можно скачать свежую версию бота канале вместе с инструкцией  и запустить игру. Если вдруг будет не понятно, то пишите в личку.

И самое интересное…

А теперь предлагаем вам пройти по ссылке и потестить бота — в него загружена демонстрационная игра — код входа demo.

На каждом уровне сектор с описанием кодов — в стартовой заглушке говорится, что если ввести «коды» на любом уровне, появится подсказка с кратким описанием полевого задания и списком кодов.

Игра настроена в режим независимого старта, т.е. человек регает команду и сам запускает игру, а когда игра завершается, возвращается к экрану приветствия, чтобы можно было например снова пройти. На реальных играх команду старта дает организатор через админ-панель конечно же.

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

  1. Об идее проекта – зачем я это сделал, какие есть аналоги, но почему мне они не нравятся.
  2. Архитектурных решениях, какие возникли трудности, как были решены.
  3. Что получилось в итоге и стоило ли оно того, дальнейшее развитие.

Цель проекта

Это было в конце ноября, я понимал что скоро новый год и необходимо дарить подарки. Идея с Telegram Bot–ом, в качестве карты поиска, казалась крайней простой и в должном исполнении интересной. Единственное что необходимо было сделать – взять и загуглить. Что собственно я и сделал. Основной посыл запроса – платформа для создания квестов, или же просто чат-бот c дополнительной логикой, написанный на python (желательно Django Framework) Большинство рассмотренных приложений либо имели захордкоженные данные, либо же были своего рода викторинами. Ни то ни другое не подходило. Интересными вариантами показались: Django Telegram Bot, PermaBot. На первом репозитории долго задерживаться нет смысла, так как в описании недвусмысленно сказано «Try Permabots: more stable django app for bots.». Потому выбираем второй. Стоит отметить что данная платформа сделана достаточно качественно, хоть и без соблюдения pep8 (не камень в огород, но это же де-факто стандарт 🙂 ), однако с комментариями, тестами, а главное документацией по REST API. При наличии всех этих плюсов были обнаружены и существенные недочеты:

  • старая версия telegram API (версия 4.2.0 против 9.0.0, последний коммит Июнь 2016)
  • полное отсутствие поддержки media (здесь моя идея с изображениями накрылась медным тазом)
  • некоторые отсутствующие фичи (отложенная отправка уведомлений с настройками возможного ответа, гибкая настройка клавиатуры чата).

Как итог, был начат проект со следующим стеком: Веб фреймворк – Django, для асинхронных задач – Celery, брокер сообщений – Redis, база данных – SQLite. В дальнейшем есть возможность переехать на Postgres/MySQL, но пока тащить всю эту махину с собой бессмысленно. Что стоит отметить, для разработки и запуска проекта нужен внешний https-адрес, на который будут прилетать веб-хуки. Для этого можно использовать туннелирование на публичный домен посредством Ngrok или LocalTunnel. Я использовал localtunnel локально и на сервере в связке c nginx и let’s encrypt сертификатами.

Архитектура

Сущности:Bot – содержит общую информацию и token (аналог telegram.Bot в оф. документации)Quest – модель квеста, все просто: имя, описание, бот. вынесено в отдельную сущность для логического разграниченияStep – возможные состояния переходов. если имеет флаг is_init=True, то будет выбрано в качестве начального при инициализации квестаHandler – выступает в роли dispatcher-a, имеет логическое выражение, которое может выполняться либо нет, в зависимости от этого переводит пользователя на определенный шаг и отправляет соответствующие ответы (представлены моделью Response)Condition – содержит возможные правила для какого–то определенного поля.Update – объект, который прилетает с веб – хуком и содержит всю информациюCallbackQuery – используется для inline – сообщений, отправлять таковые возможности пока нет (основной упор был на базовую клавиатуру), однако варианты расширения учитывались.Reponse – хранит информацию о тексте сообщения, клавиатуре, ее поведении (скрыть, удалить, установить по умолчанию, показать дефолтную)Message – полученный объект сообщения (telegram.Message)Chat – хранит информацию о чате (telegram.Chat)Photo – модель хранящая информацию о изображении (telegram.PhotoSize)Event – отвечает за отправку сообщений в определенный чат, и имеет возможность одновременной установки состояния (шага) пользователя. все дополнительные данные (текст, клавиатура, настройки к ней) берет из заданной модели ReponseUser – модель пользователя унаследовал от contrib.auth.models.AbstractUser c указанием device_uid, step и еще некоторых дополнительных полей Полную UML диаграмму можно просмотреть в draw.io, файл db-diagram.xml Как мне кажется, один из любопытных аспектов это то, как происходит решение о выборе того или иного обработчика. В поле «Mathematics expression» логическое выражение можно задавать двумя способами. Первый – тот что указан в примере, в этом случае условия к данному обработчику будут подставлены в порядке их добавления, во втором варианте – можно указать id условий. Затем выполняется парсинг. Он проходит два этапа, вначале делается преобразование в булевое отображение, где 1 и 0 – истинность конкретного условия, и затем происходит разбор грамматики с использованием библиотеки pyparsing. Другая сложность с которой пришлось столкнуться – выбор и указание клавиатуры. Было решено сделать одну по умолчанию и другую предоставлять в ответе. Таким образом появляется возможность задать дефолтную на весь чат, которая может выглядеть примерно так [[«Задать вопрос»], [«Попросить подсказку»]] Также можно увидеть что telegram api позволяет скрывать текущую клавиатуру при нажатии на кнопку или же удалять ее совсем (в этом случае отправляется дефолтная). Еще одна вещь связанная с клавиатурой – это попытка узнать что же это было, то ли обычное сообщение написанное пользователем или же нажатие на кнопку. Для чего это нужно? Предположим, на каком-то шаге мы решили запросить текстовый ответ у пользователя и в то же время там отображается стандартная клавиатура с кнопкой «Поменять задание». Несмотря на то что обработчики (Handlers) содержат опциональные поля Step on success и Step on error, гораздо проще организовать логику ограничив тип действия на который они реагируют. Для этого в модели Chat содержится информация еще и о текущей клавиатуре, по ней определяется нажатие это или другой тип события. Это полезно когда необходимо узнать что творится в каком-то определенном чате. Помимо этого, из фич, которые показались нужными – это функция redirect message. В каждом обработчике можно указать кому перенаправлять сообщение при вынесении вердикта истинности. Пригождается когда нужно проследить специфические моменты (тот же вопрос администратору) или прохождение некоторых этапов пользователем.

Стоило оно того?

Определенно. Тестирование заняло пару вечеров, после чего я настроил и запустил это на сервере. Квест состоял из 10+ состояний и включал в себя выбор вариантов ответа, рассказ истории (суть была в поиске ключевых слов), выполнение задания по карте местности, отправки фотографии года и еще некоторые. Пожалуй, реакция человека, для которого я это делал, окупила те вечера перед зачетной неделей, которые я потратил.

Перспективы

На данный момент готов рабочий вариант, который разворачивается в docker-контейнере за пару минут, но для полноценной разработки необходимы тесты, продуманное окружение и еще некоторые настройки. Если кому-то проект покажется интересным, то я с желанием продолжу поддержку/разработку, реализация фронтенда под вопросом, но возможна (на emberJS или vueJS). Спасибо вам за внимание! Буду рад услышать вопросы, пожелания, критику

Мониторинг серверов Minecraft

Автоматизированный бот по поиску и продвижению Minecraft-серверов в Telegram.

LuckyRoomBot

Первое Telegram casino с проверкой на честность! Telegram бот с защитой игр от вмешательства в результат!

Solo Games

Любимые игры теперь в Telegram! 2048, Main Rusher и многое другое!

Акинатор

Привет, я — Акинатор Задумайте реального или вымышленного персонажа. Я попытаюсь отгадать его

RF Telegram

RPG Игра-бот в телеграме, прокачивай своего персонажа, вступай в клан и захватывай территории вместе с ним, участвуй в

21 очко

Играй в 21 очко с друзьями. Цель игры — набрать количество очков, которое ближе к 21 (или ровно 21). При этом оно

True Mafia

Бот-ведущий для игры в классическую Мафию

Toloka Game BOT

Экономическая онлайн-игра С возможностью реального Заработка в Телеграмм. Цель игры: 1)Приглашаем друзей. 2)Покупаем

Миллионер

Игра по мотивам телешоу «Кто хочет стать миллионером?».

Ферма: Mining

Ферма: Mining — лучший игровой бот в Telegram для заработка реальных денег.

LIGMAR MMORPG

Аналог Word of Warcraft в Telegram. LIGMAR — массовая многопользовательская ролевая онлайн-игра в режиме реального

Bitcoin Mining

Бот для майнинга биткоинов в форме игры, без инвестиций.

Игра «Битвы стартапов»

Современная текстовая ММОРПГ. Приведи свой стартап к успеху.

Old Gods Temple

Игра по мотивам рассказов Говарда Лавкрафта. Присоединяйся к пантеону и докажи что именно твой бог самый

Fantasy World

MMO RPG с интересными элементами. Помимо прокачки самого перса есть глобальные битвы за земли между странами. ПрокачкаИспользуемые источники:

  • https://protelegram.ru/2017/02/11/telegram_game_bot_top_2016/
  • https://nightquests.ru/kvest-bot-dlya-telegram/
  • https://habr.com/ru/post/347592/
  • https://telegram.org.ru/telegram-bots/bots-games/

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий