Создание игры в телеграм боте
Это моя история об идее, создании бота, превращении его в игру и неудачных попытках раскрутить его без крупных вливаний. С просьбой дать хороший совет.
Несколько лет назад, когда времена были проще, а люди добрее, мы играли в ВКонтакте в игру "Вызов дня". Ведущий предлагал простые задания, в основном сделать фото с какими-то определёнными требованиями, пользователи выкладывали ответы, а потом полученные лайки переводились в игровые баллы.
Задание, в котором нужно было показать знаменитый мем с котом и лампой.Игра была не то чтобы очень популярна, но несколько десятков людей играли с удовольствием, поэтому я стал искать возможность перенести её на популярную платформу и автоматизировать. Умений у меня было меньше, чем энтузиазма, поэтому я стал искать программистов, менторов, спонсоров - это был расцвет популярности стартапов и среди тысяч прочих мой был далеко не самым плохим. Так "Вызов дня" попал на Бумстартер.
Онлайн-игра в реальном мире! Игрокам придется решать загадки, проявить остроумие, побегать с.Сумму я просил небольшую, так как очень надеялся на энтузиазм участников и видел в ней лишь proof of concept (а ещё я слабо понимал стоимость разработки, буду честен). Разумеется, ничего не вышло. Первое правило краудфандинга — ты либо знаменит и делаешь что-то, что всем очень нужно, либо относишься к этому, как к самой серьёзной работе и ежедневно дёргаешь всех, кого можешь. Я же наивно верил, что уж теперь-то деньги сами польются рекой с неба, поэтому удивительно, что мне вообще удалось набрать четверть ожидаемой суммы.
Задание, в котором нужно было сделать из подручных средств интерфейс шутера и пострелять в коллег на работе.Я был расстроен, но недостаточно, чтобы опустить руки. Хотя нет, я их опустил, но ненадолго, всего на пару лет. Потому, что потом появился и стремительно завоевал популярность Telegram , а немного позже они запустили Telegram Bot API. Случайно, я познакомился с ним по рабочим нуждам, а после этого сказал себе: "Да ведь это же то, что нужно!".
Telegram был быстр, с молниеносными мобильными клиентами, распространён, удобен и с очень хорошо описанными функциями, словно сделанными под мои задачи. К примеру, он с лёгкостью позволял показывать кнопки в чате, а потом менять их состояния, в зависимости от необходимости. Есть ли нужда говорить, что к мысли о том, что игру свою теперь я буду делать здесь, меня привели стандартные боты голосований и лайков?
Задание, в котором нужно было рассылать друг другу тёплые письма из разных стран.Пока все делали ботов с пошаговыми изменениями состояния, то есть, когда бот ведёт себя как какой-нибудь "мастер чего-то там" в Windows, давая возможность на каждом шагу выбирать только что-то конкретное — я сделал ставку на "интерфейс", когда вид бота фактически не изменяется, давая пользователю подобие сайта или обычного окна программы с кнопками, каждая из которых выполняет одно законченное действие.
Собственно, игровой процесс очень прост: бот показывает игроку список заданий, включая те, что предлагают другие игроки, а ответы анонимно постит в канале игры, давая возможность другим участникам ставить оценки.
Задание, которое доступно новичкам первым и помогает начать игру.В проектировании игры я постарался учесть все традиции игростроения. В начале игры новичку доступно только одно задание, которое знакомит его с механикой игры. Если задание выполнено правильно, то с первыми лайками становится доступно второе, закрепляющее эффект. После него в списке появляются все остальные.
Оценки бывают и отрицательные, поэтому, если стали стремительно падать минусы, лучше бы удалить свой ответ и попробовать снова, иначе при -5 ответ будет автоматически удалён, а пользователь будет на сутки забанен.
Задания в ротации обычно висят неделю и доступны 10 игрокам. Если лимит по времени или участникам исчерпан, задание закрывается и заменяется другим. Предложить своё можно ответом на специальное задание, и, если оно получит +5 очков, оно будет автоматически добавлено в список.
Я постоянно улучшаю бота, добавляя или убирая функции, смотря какой спрос на них и что пишут в чате.
Задание, в котором нужно было на Хэллоуин сделать скелета из подручных средств.Для того, чтобы найти подписчиков, я сообщил участникам старой игры и своим друзьям, в конечном итоге достигнув средненедельной активности из 50-70 игроков. Поверьте, это микроскопические цифры для канала, но для бота, к тому же рекламируемого только сарафанным способом, это внушительно.
И тут у меня закончились идеи, как можно, не продавая квартиру, машину и левую почку, раскрутить бота. При попытке рекламировать его традиционными способами, я наткнулся на нежелание людей связываться с ботами вообще, а часто и с непониманием концепций игры и взаимодействия, которые пользователь просто не хотел преодолевать.
К примеру, реклама в каналах Телеграм приводила к тому, что за каждые 1000 рублей я получал 30 заходов в бота и 6 регистраций в игре, на которые 3 были обычными спамерами, а ещё 2 — неспособны не только взаимодействовать с другими людьми, но и вызывали серьёзные опасения, могут ли они самостоятельно дышать.
Задание, в котором нужно было собрать как можно больше музыкальных "штук" на одном фото.И вот мы подходим к сути поста. Я всё ещё верю в эту, немного инфантильную, но добрую и уютную концепцию игры, сделавшую её канал и чат очень приятным местом, полным отзывчивых и интересных людей. Разумеется, пост был написан сюда в блог, в частности, чтобы привлечь аудиторию ТЖ, в массе своей являющейся как раз теми, кто играет в игры подобные моей. Но, чтобы избежать обвинений в постыдной рекламе, я написал здесь свою историю простым языком и очень надеюсь на дискуссию, где смогу заинтересовавшимся рассказать больше о концепции, попытках раскрутки, полученном опыте и любых других вещах, относящихся к теме.
Самое главное, здесь я смогу попросить совета, что мне делать дальше, потому что сейчас идея. кхм. "слегка" в стагнации.
Ах да, ссылки. Первая ведёт к боту, где можно посмотреть, как всё устроено, а вторая на канал, где становится ясно, чем это в итоге является. Я здраво рассудил, что скриншоты чата вряд ли будут кому-то интересны.
Соцсеть внутри чата, элитный клуб людей, которые никогда не вырастут, игра "Вызов дня". Бот игры: t.me/cotdbot В игре тебе доступны задания, отмеченные знаком ❗️. Выполняй их условия…Заранее благодарен за конструктив и, вообще, спасибо, что дочитали аж до этого места!
Буквально на днях, а именно 3 октября, разработчики Telegram анонсировали новость о том, что на их платформе теперь можно создавать игры. Доступны для игры как многопользовательский режим, так и игры одиночного уровня.
Ребята не стали изобретать велосипед в виде отдельного игрового движка или чего то в этом роде. Игры в Telegram можно создавать, используя знакомую всем связку HTML5 + JavaScript. На платформе уже доступно небольшое количество игр, включая полюбившуюся мне игрушку под названием Lumberjack, где задачей является срубить как можно больше веток у дерева.
Функционал доступен на iPhone >= 4 и Android >= 4.4, а также Telegram версии от 3.13. Для того, чтобы выбрать существующую игру, добавьте бота @gamee.
Как создать Telegram игру
Для того, чтобы создать игру в Telegram вам необходимо обратиться всё к тому же BotFather боту, который мы использовали при создании Telegram бота. Выполните команду: /newgame
Перед созданием игры, система попросит вас прочитать и принять условия работы, среди которых обязательными являются:
- Запрещается размещать рекламу и внешние ссылки на сторонние ресурсы
- Запрещается взимать оплату с пользователей игры
- Запрещается использовать данные, полученные в ходе игры, для последующих спам-рассылок среди пользователей Telegram
- Запрещается делиться данными, полученными во время игры, со сторонними приложениями и сервисами
- Запрещается устанавливать "куки" на страницах игры
Нарушение этих правил ведёт за собой удаление игры из платформы. Что касается монетизации Telegram игр, то администрация сервиса обещает в самое ближайшее время разработать подходящие для этого инструменты. Будем следить.
HTML5, JavaScript и CSS
Я уже достаточно давно убеждён в том, что в самом ближайшем будущем единственным приложением, которым мы будем чаще всего пользоваться, станет браузер. Это и сейчас правда: на замену настольному Office пришел Office 365, Google Apps, почта, игры, общение и органайзеры всё это уже доступно в браузере. Если каких-то 5-10 лет назад веб-страницы были жалким подобием настольных приложений, то сейчас мы уже пользуемся навороченными интерактивными веб-приложениями. Всё это стало доступно благодаря стремительному развитию браузерных движков, с каждым новым релизом появляются новые фишки в API. Интернет стирает цифровые границы: получайте доступ к данным из любой точки мира, всё что вам будет нужно - браузер :)
Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.
Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.
Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.
Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.
После запуска бота в работу мы обнаружили ещё одну проблему: хэштеги не очень удобны для поиска. Ведь задача может уйти далеко наверх, а листать до неё или забивать в поиске — достаточно неинтересное занятие, чтобы стравливать его пользователю. Поэтому мы решили сразу же закреплять задачу, которую даёт бот. Причём закрепляет как раз он сам, а не мы (и да, делает это без уведомлений).
Ну и напоследок ещё одна проблема, которую мы с успехом решили. Некоторые задачи предполагали не точное решение, а наиболее подходящее. Как в таком случае должен поступить админ и чей ответ выбрать?
Какое решение быстрее наберёт пять плюсов, то и выбирается ботом как лучшее. Это хорошее решение не только с точки зрения справедливости, но и автоматизации: нам больше не придётся следить за чатом и читать все ответы.
Дело осталось за малым: написать бота. Мы ограничились Composer, библиотекой telegram-bot-sdk и symfony/dotenv для парсинга .env-файла. Весь код приводить не буду: он большой. Посмотреть на то, что получилось, можно по ссылке.
Composer — это стандарт при разработке на PHP. Он позволяет скачивать сторонние библиотеки на проект и предоставляет удобный механизм по автозагрузке классов. Вся работа с Composer происходит через консоль и в файле composer.json. Обычно он выглядит так:
Если вы разрабатываете не на фреймворке, то во множестве случаев создаёте composer.json самостоятельно и заполняете секцию autoload, которая загружает ваши классы по правилу psr-4, о котором можно найти много информации в интернете.
Далее вы выполняете команду composer install, и автозагрузка начинает работать. Также не забудьте про библиотеки, которые нужно установить, для этого выполните в терминале в папке с проектом следующие две команды:
composer require irazasyed/telegram-bot-sdk composer require symfony/dotenvИ тогда ваш composer.json станет похож на тот, что я показывал выше.
Сразу же продемонстрирую готовую структуру проекта:
Файл app.php является точкой входа в наше приложение, на который мы вешаем веб-хук (это значит, что бот не будет постоянно опрашивать сервер на наличие обновлений; он их будет получать только тогда, когда они будут). Вот как он выглядит:
// app.php <?php use App\Bot\CommonChatHandler; use App\Bot\PrivateChatHandler; use App\Handler; use App\Storage\DB; use Telegram\Bot\Api; require __DIR__ .'/vendor/autoload.php'; $settings = require __DIR__ . '/config/settings.php'; $api = new Api($settings['token']); $bot = new Handler($api); $db = new DB($settings['db']); if ($bot->getChatType() === "private") < (new PrivateChatHandler($bot, $db))->start(); >elseif ($bot->getChatType() === "supergroup") < (new CommonChatHandler($bot, $db))->start(); >Ничего необычного, создаём объекты всех нужных нам классов и делаем проверку на то, в каком чате мы находимся — приватном или супергруппе. Да, разделить код на достаточно независимые части является хорошей практикой. К тому же легче рефакторить и добавлять код, когда проблемы того потребуют.
Мы любим чистый код, поэтому настройки храним в файле .env, что позволит любому пользователю ввести свои, и бот будет работать (разумеется, после создания всех нужных таблиц).
// .env DB_DSN=mysql:host=changeme;dbname=changeme DB_USERNAME=changeme DB_PASSWORD=changeme BOT_ADMIN=changeme TOKEN=changemeОднако получить переменные окружения из .env можно только в том случае, если вы спарсите этот файл. Делается это крайне просто:
// config/settings.php <?php use Symfony\Component\Dotenv\Dotenv; $dotenv = new Dotenv(); $dotenv->loadEnv(__DIR__ . '/../.env'); return [ 'db' => [ 'dsn' => getenv('DB_DSN'), 'username' => getenv('DB_USERNAME'), 'password' => getenv('DB_PASSWORD') ], 'token' => getenv('TOKEN') ];Это тот самый файл, который мы включили в app.php. Там мы просто по ключу достаём нужные нам настройки:
$settings = require __DIR__ . '/config/settings.php'; $settings['token']; $settings['db'];В папках Admin и User хранятся классы по работе как с приватным чатом, так и с супергруппой. Это не только удобно, как я говорил выше, но и даёт возможность отключить деятельность бота в одном из режимов, если мы соберёмся добавлять в него функциональность.
Больше томить вас кодом не буду, повторю только, что теперь он в свободном доступе.
Так мы решили сразу несколько проблем и написали достаточно неплохой, легко поддерживаемый код для бота, который по-прежнему в добром здравии и надёжно выполняет свои функции.
Telegram – очень нестандартная платформа для создания онлайн игр. Тем более, когда речь заходит о ММОРПГ. Мне стало интересно, возможно ли вообще создать качественный продукт на этой платформе, а если да – будет ли вообще востребованность в нем. Так, в июне 2017-го года я начал разработку Wasteland Wars.
Виральность
Особенности проекта, понравившиеся игрокам
Игроки во время тестирования отмечали крайне необычный для такого формата жанр игры, полноценные ПВП сражения и систему прокачки игрока без классических очков навыков и системы level-up’ов. Но, что стало для меня неожиданностью – больше всего люди хвалили игровые тексты, особенно отмечая качество юмора, отсылки к массовой культуре и атмосферные ситуации, контрастирующие с черным юмором своей драматичностью.
Технические нюансы
Первые сложности, связанные с платформой Bot API, возникли в первые же дни разработки. У Telegram есть 2 основные системы для связи их ботов с вашим сервером: так называемые Long Polling и Webhooks. Первая подразумевает, что ваш сервер будет с определенным интервалом постоянно опрашивать Telegram на предмет наличия новых запросов, и при наличии таких — обрабатывать, возвращая ответ Bot API. Второй же чуть более сложен в реализации – он заключается в том, что ваш сервер как-бы говорит Telegram «если у тебя появятся какие-то запросы – кидай их вот на этот адрес». Соответственно, для реализации бота на технологии Webhooks необходим постоянный IP адрес и обязательно SSL сертификат, хотя бы самоподписанный. Начав разработку на основе Long Polling, я в начале не заметил никаких проблем, связанных с этим методом. Однако спустя сутки беспрерывной работы, бот неожиданно упал. Telegram начал возвращать ошибку при получении запроса. Как оказалось, эта проблема преследует абсолютно все боты на основе Long Polling – телеграм закрывает обработку запросов от бота спустя какое-то время, из-за чего приходится его постоянно перезагружать. Сперва я решил попробовать автоматизировать процесс «реанимации» бота, написав cron-скриптик для проверки пульса процесса и перезапуска, если пациент не реагировал на тыканье палкой. Однако этот процесс постоянных перезапусков доставлял неудобства игрокам, т.к. занимал какое-то время, а так же сбрасывал текущие таймеры в игре. В итоге проект был перенесен на Webhooks, и данная проблема сразу же исчезла.
Дальше в плане сложностей от самого Bot API все было спокойно. До одного момента.
Следующая проблема, с которой столкнулся проект, крылась уже в моей среде разработки и коде. А конкретно, в Python 3 и в том, как он работает с потоками. Каждый новый поток в Python 3 создается вместе с переменными окружения, занимая большое количество памяти. В игре полно таймеров (2 минуты на переход между локациями, ожидание битвы и т.д.), и запуская их в отдельных потоках, создавалась утечка памяти. По мере роста онлайна игры, утечка достигла каких-то безумных масштабов, сжирая всю возможную оперативную память и подкачивая оставшуюся память SSD сервера. Разумеется, проблема была решена созданием очередей таймеров, обрабатывающихся в одном потоке для каждого типа.
Визуальная часть в текстовой игре
Одной из ключевых особенностей Wasteland Wars относительно остальных похожих игр в Telegram стало введение визуальной части. В игру был добавлен интерактивный аватар персонажа, а так же визуальное отображение каждого элемента экипировки в игре. Как в полноразмерных РПГ на игровых платформах, игрок может одевать своего персонажа в разную броню, давать ему разное оружие, а затем видеть все изменения визуально. Чуть позже я развил эту идею, теперь при встрече другого игрока в игре выводится так же его аватар – так появляется возможность не зная прокачки противника, оценить его опасность по внешнему виду. Помимо экипировки, на аватаре так же отображаются «Маски» — их можно купить за донат, они не дают никакого преимущества игроку, но изменяют его вид в аватаре. Кроме того, в игре появилась полноценная интерактивная карта. По мере нахождения какой-либо локации, она добавляется игроку на карту.
Все изображения выводятся в довольно низком разрешении, достаточном для понимания их контента. Это связано с тем, что аватары и карты собираются из множества разных элементов для каждого игрока, и при большом количестве одновременных запросов их сборка в высоком разрешении может существенно нагрузить игровой сервер.
Планы по развитию проекта
В данный момент игра переписывается на Go – этот язык, как оказалось, гораздо лучше подходит для разработки такого проекта. Наличие собственного веб-сервера в Go и его скорость работы позволила мне начать создание собственного API для проекта, чтобы отвязать его от одной единственной платформы в Telegram. API позволит получать и обрабатывать запросы с любого клиента, а вся логика будет обрабатываться только на сервере.
Таким образом, разработка клиента под любую платформу будет максимально простой, как и сам клиент, это позволит избежать многих ограничений Telegram, сложностей с его блокировкой, а так же привлечь большое количество новой аудитории в игру.
Читайте также:
- В навигаторе приложение навител ехе выполнило недопустимую операцию и будет завершено как исправить
- Как работает приложение шаги в вк
- Данный пакет имеет номер порта назначения 389 какое приложение службы запрашивает клиент
- К какому виду приложений относятся программы изображенные на рисунке
- К сожалению возникла непредвиденная ошибка и приложению word не удалось запуститься 24