Всем привет! Последние 4 месяца я занят разработкой некоммерческого бота для Telegram. Сейчас в него ежедневно играет от одной до четырех сотен людей и для меня это большой успех. Если вам интересна история разработки, то прошу под кат.
Начало
Немного об обстоятельствах, которые толкнули меня на это. Играясь в @godnotbot (кстати, рекомендую) захотелось создать свою текстовую бродилку с подземельями и драконами.
Определившись, что это будет текстовая РПГ в Telegram, я задумался над тем, что будет внутри этой РПГ. А внутри было схожее с годноботом решение — случайные комнаты или ситуации. Нажми на кнопку, получишь новую комнату. Ко всему прочему, были боги, которые давали различные бонусы за молитвы и злились, когда от них уходили в другую веру. А также, магазин, где продаётся всякого рода барахло облегчающее ваш путь к неизбежной смерти.
С концептом разобрались, теперь нужно было делать. Для разработки я выбрал Python. Почему? А почему бы нет — ботов на нем написано уже много, да и язык приятный.
Завязка
В итоге на свет появился простенький бот с чуть более, чем десятком комнат. Самого бота теперь можно всегда найти здесь. Детище было показано всем друзьям и на этом его история чуть не закончилась. Игра была спасена от забвения внезапной мыслью: а было бы неплохо показать кому-нибудь ещё.
У друга взял покататься VPS, настроил настройки, и запустил бота в бесконечный цикл. После чего на скорую руку сваял группу в ВК и написал пост на Пикабу. Сам того не зная, как мне объяснили позже, я выбрал время для поста настолько хорошо, что поймал всю свою аудиторию и в первый день познакомиться с ботом пришли 3,000 человек. Это было круто. Но тут же возникли проблемы.
Ситуация первая
Telegram не разрешит вам отправлять очень много сообщений. Но “много” у всех разное. Есть ограничения на сообщения в минуту в приватный чат, группу, на общее количество сообщений в день, в секунду во все чаты. Как это работает точно и точные числа неизвестны. Да, на сайте есть про это три абзаца, но на деле все сводится к тому, что есть пределы, вы можете их нарушать, но никто не знает, что тогда произойдет. Поэтому я поставил ограничение на отправку 30 сообщений в секунду и все ошибки ушли. Но в час-пик пользователям иногда приходилось ждать своих сообщений дольше десяти секунд.
Написал в саппорт, что не можем это терпеть. Спустя несколько дней там сказали, что нужно написать в саппорт по ботам. Саппорт по ботам, спустя еще несколько дней вынес вердикт: живи с этим, ничего не поделать. Порекомендовали ещё использовать inline кнопки, но этот вариант меня не устраивал — тогда будет теряться история сообщений. В итоге пришлось остаться на тридцати сообщениях в секунду и на этом остановиться.
Ситуация вторая
Проект был полностью открытым (и остается таким до сих пор! Вот исходный код) и это сыграло важную роль в развитии проекта — люди начали помогать: присылать свои идеи, править код, рисовать для бота. А главное, появилось несколько волонтеров, которые на постоянной основе помогают с ботом до сих пор. Это Андрей, Владислав и Алексей (так же хотелось бы отметить Эрика, он так же всегда помогал мне с ботом, хоть и немного не там, где это делали все остальные (: ). А еще чуть позже для всей игры был нарисован свой стикерпак (Спасибо Алексею за этот труд).
Этим абзацем я хочу заметить, что если вы не жадина и не боитесь кражи кода, то можно просить помощи у вашего же комьюнити и, скорее всего, вам помогут. А если вы думаете, что ваш код кому-то нужен — не волнуйтесь, вы наберете большую аудиторию, чем люди, укравшие у вас код (хотя может не повезет и все пойдет наперекосяк, но это значит, что либо вы где-то повернули не туда, либо вор инвестирует в клона большие деньги. Но идею у вас все равно всегда смогут украсть).
Сюжет
Идей уйма, пользователи есть, процесс идет, что дальше? Дальше мы задумываемся о переводе своего продукта на самообеспечение. Не долго думая, я организовал добровольные пожертвования на Яндекс.Деньгах и, собственно, на этих деньгах бот живет до сих пор, и это греет душу.
В ноябре на связь вышла поддержка, напомнив об ограничениях по количеству сообщений и предложила частично их снять, в качестве исключения популярному боту. Теперь мы можем моментально отвечать в обход ограничений (если команда Telegram пожелает, она всегда может вернуть их нам). Мы сняли режим очереди в коде, но позже обнаружили, что ограничения никуда не делись. Поддержка ответила, что моментально можно отвечать только короткими сообщениями, то есть менее 500 символов. Грустно, но правила диктуем не мы.
А прямо сейчас мы вместе с комьюнити переводим бота на английский язык. Там свыше 1,800 фраз, некоторые из которых длинные, а некоторые нельзя просто так перевести. Например: "ЗА ВДВ!". Сейчас игра полностью переведена и находится у редактора на корректировании.
Развязка
Что я хотел? Тектовое РПГ в телеграме. Что я получил? Бота, в которого каждую неделю играет тысяча человек, в которого убивают время в пробках, и 4 месяца разработки с веселыми людьми, а также интересные знакомства. А пока готовимся к переводу, выпуску бота в веб и внедрению масштабной мультиплеерной системы (:
Что из этого выйдет? Кто знает…
Если вам будет интересна эта тема, то в следующем посте будут описания проблем в самой разработке и о механизмах работы игры (можно задать вопросы для следущего поста, если есть такие). Самого бота можно найти вот здесь.
Комментарии (58)
rekby
17.12.2016 22:20По 30 сообщений/секунду: можно например плодить ботов, а все боты будут общаться с одним приложением на стороне сервера.
AreD
18.12.2016 01:36+2и будет 30 разных аккаунтов бота для пользователей, и какой из них рекламировать?
Получится как с «Проблемы с доступом к Джойказино? Добавьте цифру 1 названию сайта»rekby
18.12.2016 07:00рекламировать основной, а там когда есть проблемы делать рассылку, что тормоза связаны с ограничениями телеграм. Можно оставаться тут с тормозами или регнуться в таком-то боте где места есть и всё быстро.
KpoKec
18.12.2016 17:33Основной бот перекидывает на любой свободный бот
yegorf1
18.12.2016 17:33Каждый лишний клик юзера заставляет юзера уходить, что не круто
KpoKec
19.12.2016 00:00Можно сделать главного бота как «Центр управления подземельями» или «Выбор проводника подземелья». Обставить в виде антуража. Снижение ограничений + масштабируемость на выходе. Хоть это и не так красиво, как всего один бот.
Nigrimmist
19.12.2016 14:37Да. Просто, такой же выход, как и в популярных мморпг — шардирование с выбором шарда перед входом… Да, будут запоминаться левые боты в телеграме, но увы, всё таки это в первую очередь мессенжер
TimsTims
18.12.2016 11:35+2Как говорится, все идет по кругу. Раньше игры были текстовые. Потом 2d, 3d, потом на планшетах и телефонах, потом игры в браузерах на любую платформу. Сейчас мы видим игры текстовые в Телеграмме, а потом Телеграмм будет со своей песочницей для запуска игр на любом телефоне. Ну а потом снова все будет в браузерах, который есть у всех, в отличии от мессендеров
rubero
18.12.2016 20:38В Телеграме уже есть поддержка своей платформы игр, для примера есть бот GameBot. Хотя по сути эти игры — браузерные, просто с интеграцией Телеграма.
ifgeny87
18.12.2016 17:32Спасибо за хороший рассказ. Сам писал бота-калькулятор. Телеграмм прекрасен.
Ardogar
19.12.2016 09:03На самом деле игра жутко странная, молитва рассказчику, последующий сбор мороженного и его продажа позволяет получить со старта бесконечные деньги, которые дают бесконечное всё остальное. Не то бы это было так уж важно, но настоящий манчкин вполне может зависнуть в трёх действиях и тупо набирать предметы и деньги.
Собственно я так и делаю.VovanZ
19.12.2016 10:51Ещё можно продать душу дьяволу за условно бесконечные деньги и магическую силу.
Только, наличие денег и силы не мешает потом умереть.
Captain_Sparrow
19.12.2016 11:16Не знаю, у меня мороженка используется только для атаки. Для продажи в инвентаре оно отсутствовало.
tgchans
19.12.2016 13:53А почему использование Call-back кнопок не позволяет сохранять историю сообщений? Историю же вы все равно храните самостоятельно у себя на сервере в любой удобной вам форме. В чем проблема преобразовать callback_data в текст сообщения и записать это как обычный месседж от пользователя? Не совсем понятна правда что имела в виду техподдержка когда говорила об использовании этих кнопок, ведь они заменят собой действия пользователя — который вместо того чтобы присылать сообщение будет нажимать на кнопку, и на количество отправляемых сообщений от бота к пользователю это никак не повлияет.
Полагаю, что помочь может использование editMessageText и т.д. по нажатию на инлайн кнопку, поскольку в данном случае отправки нового сообщения не произойдет, а так же по возможности использовать answerInlineQuery для уведомлений разного характера, которые не обязательно отправлять сообщением. У нас в боте проблем с лимитом на отправленные сообщения не возникало, однако в районе половины всех ответов пользователю у нас уходят именно как editMessage по инлайн-кнопке.yegorf1
19.12.2016 13:53Да, поддержка именно это и предлагала.
Мы не храним на сервре историю сообщений. Только данное состояние пользователя.
Joshua-kun
19.12.2016 13:54Помнится, добавил его себе пару месяцев назад, по совету друга. Тогда ещё подумал: «Забавная штука, будет чем время скоротать!»
Но, к сожалению, бот решил мне не отвечать. Вообще. Совершенно.
nordmine
20.12.2016 12:21+1Автор, а вы не планируете реализовать поддержку сообщений на естественном языке, чтобы не нажимать на кнопки, а пытаться парсить простые предложения? Так можно создать иллюзию полной свободы действий и заложить кучу секретов и пасхалок)
yegorf1
20.12.2016 12:22Да, это есть в планах, но не в самом высоком приоритете, хотя и хотелось бы (:
alhimik45
Не особо много работал с ботами в телеграме, поэтому такой вопрос: бот запоминает состояние? То есть я могу начать игру сейчас, сделать пару ходов и продолжить через месяц?
yegorf1
Да, он сохраняет каждого пользователя в отдельный файл (чтобы не нагружать БД и не потерять в случае падения БД)
DROS
интересное обоснование отказа от БД
yegorf1
БД есть, но об этом расскажу в следующем посте
hVostt
Что же там за БД такая, что файлы лучше чем БД?
yegorf1
MongoDB, но почему был такой отказ я расскажу в следующем посте (:
rekby
база к телеграму отношения не имеет — бот это самостоятельная программа, которая рассылает/принимает сообщения через апи, т.е. база, файлы и всё остальное — это на откуп разработчика.
antonksa
sqlite: файл-бд
ну или бд-файл
не потеряется и можно на флешку project.db скопировать ))))
по боту. немного скучновато. Есть книги-игры, возьмите готовую, помню в детстве играл в "Подземелья Черного Замка". Там порядка 1000 игровых ситуаций в дереве.
Germanets
Осторожнее с фалами, их количество вообще говоря — ограничено, точнее количество инодов. Да и работать с большим количеством файлов — так себе занятие.
yegorf1
Можно поподробнее?
TimsTims
Рано или поздно все урется в возможности HDD, и тогша ваш лот будет отвечать по 10 секунд каждому пользователю. А если файлов будет миллион, то бот будет только 30 минут открывать один файл
TimsTims
Автозамена…
Урется — упрется
Тошда — тогда
Лот — бот
TheCreator
Я тоже делал свой первый проект в 2004 году на файлах, типа чтобы базу не нагружать (просто плохо знал, как ей пользоваться).
Внезапно закончилось место, каждый файлик занимал 4 килобайта, даже если в нём был один символ, а файликов было мнооого.
Поэтому очень-очень рекомендую вам использовать для хранения данных базу данных, они для этого и придуманы.
yegorf1
Там сейчас 11к файлов и они занимают 50 мегабайтов. Искрине верю, что место не закончится в ближайшее время (:
TimsTims
Чтобы найти лучшего игрока, или игроков с именем на T* вам придется пройти все 11000 файлов. Это огромная нагрузка на HDD. Да, все начинают с файлов, но надо обязательно переходить на БД. Ничего страшного признаться, что вы не знаете их преимуществ (а иначе бы точно перешли бы на них изначально). БД позволяют выдерживать самую первую нагрузку — нагрузку на диск, и это как раз ваш случай.
yegorf1
Но мне не нужен поиск по юзерам
TimsTims
Да даже загрузить последние команды пользователя у вас будет уходить по несколько секунд перегрузки HDD, а значит остальные пользователи будут ждать бота, и повторять команды. Все это будет еще больше перегружать бота как снежная лавина, и в итоге вам нужно будет что-то делать.
TimsTims
И дело вовсе не в размере файлов, а в их количестве