Всем привет! Последние 4 месяца я занят разработкой некоммерческого бота для Telegram. Сейчас в него ежедневно играет от одной до четырех сотен людей и для меня это большой успех. Если вам интересна история разработки, то прошу под кат.



Начало


Немного об обстоятельствах, которые толкнули меня на это. Играясь в @godnotbot (кстати, рекомендую) захотелось создать свою текстовую бродилку с подземельями и драконами.


Определившись, что это будет текстовая РПГ в Telegram, я задумался над тем, что будет внутри этой РПГ. А внутри было схожее с годноботом решение — случайные комнаты или ситуации. Нажми на кнопку, получишь новую комнату. Ко всему прочему, были боги, которые давали различные бонусы за молитвы и злились, когда от них уходили в другую веру. А также, магазин, где продаётся всякого рода барахло облегчающее ваш путь к неизбежной смерти.


С концептом разобрались, теперь нужно было делать. Для разработки я выбрал Python. Почему? А почему бы нет — ботов на нем написано уже много, да и язык приятный.


Завязка


В итоге на свет появился простенький бот с чуть более, чем десятком комнат. Самого бота теперь можно всегда найти здесь. Детище было показано всем друзьям и на этом его история чуть не закончилась. Игра была спасена от забвения внезапной мыслью: а было бы неплохо показать кому-нибудь ещё.


У друга взял покататься VPS, настроил настройки, и запустил бота в бесконечный цикл. После чего на скорую руку сваял группу в ВК и написал пост на Пикабу. Сам того не зная, как мне объяснили позже, я выбрал время для поста настолько хорошо, что поймал всю свою аудиторию и в первый день познакомиться с ботом пришли 3,000 человек. Это было круто. Но тут же возникли проблемы.


Ситуация первая


Telegram не разрешит вам отправлять очень много сообщений. Но “много” у всех разное. Есть ограничения на сообщения в минуту в приватный чат, группу, на общее количество сообщений в день, в секунду во все чаты. Как это работает точно и точные числа неизвестны. Да, на сайте есть про это три абзаца, но на деле все сводится к тому, что есть пределы, вы можете их нарушать, но никто не знает, что тогда произойдет. Поэтому я поставил ограничение на отправку 30 сообщений в секунду и все ошибки ушли. Но в час-пик пользователям иногда приходилось ждать своих сообщений дольше десяти секунд.


Написал в саппорт, что не можем это терпеть. Спустя несколько дней там сказали, что нужно написать в саппорт по ботам. Саппорт по ботам, спустя еще несколько дней вынес вердикт: живи с этим, ничего не поделать. Порекомендовали ещё использовать inline кнопки, но этот вариант меня не устраивал — тогда будет теряться история сообщений. В итоге пришлось остаться на тридцати сообщениях в секунду и на этом остановиться.


Ситуация вторая


Проект был полностью открытым (и остается таким до сих пор! Вот исходный код) и это сыграло важную роль в развитии проекта — люди начали помогать: присылать свои идеи, править код, рисовать для бота. А главное, появилось несколько волонтеров, которые на постоянной основе помогают с ботом до сих пор. Это Андрей, Владислав и Алексей (так же хотелось бы отметить Эрика, он так же всегда помогал мне с ботом, хоть и немного не там, где это делали все остальные (: ). А еще чуть позже для всей игры был нарисован свой стикерпак (Спасибо Алексею за этот труд).


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


Сюжет


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


В ноябре на связь вышла поддержка, напомнив об ограничениях по количеству сообщений и предложила частично их снять, в качестве исключения популярному боту. Теперь мы можем моментально отвечать в обход ограничений (если команда Telegram пожелает, она всегда может вернуть их нам). Мы сняли режим очереди в коде, но позже обнаружили, что ограничения никуда не делись. Поддержка ответила, что моментально можно отвечать только короткими сообщениями, то есть менее 500 символов. Грустно, но правила диктуем не мы.


А прямо сейчас мы вместе с комьюнити переводим бота на английский язык. Там свыше 1,800 фраз, некоторые из которых длинные, а некоторые нельзя просто так перевести. Например: "ЗА ВДВ!". Сейчас игра полностью переведена и находится у редактора на корректировании.


Развязка


Что я хотел? Тектовое РПГ в телеграме. Что я получил? Бота, в которого каждую неделю играет тысяча человек, в которого убивают время в пробках, и 4 месяца разработки с веселыми людьми, а также интересные знакомства. А пока готовимся к переводу, выпуску бота в веб и внедрению масштабной мультиплеерной системы (:


Что из этого выйдет? Кто знает…


Если вам будет интересна эта тема, то в следующем посте будут описания проблем в самой разработке и о механизмах работы игры (можно задать вопросы для следущего поста, если есть такие). Самого бота можно найти вот здесь.

Поделиться с друзьями
-->

Комментарии (58)


  1. alhimik45
    17.12.2016 20:09

    Не особо много работал с ботами в телеграме, поэтому такой вопрос: бот запоминает состояние? То есть я могу начать игру сейчас, сделать пару ходов и продолжить через месяц?


    1. yegorf1
      17.12.2016 20:12
      +1

      Да, он сохраняет каждого пользователя в отдельный файл (чтобы не нагружать БД и не потерять в случае падения БД)


      1. DROS
        17.12.2016 20:32
        +20

        интересное обоснование отказа от БД


        1. yegorf1
          17.12.2016 22:18

          БД есть, но об этом расскажу в следующем посте


      1. hVostt
        17.12.2016 20:57
        +7

        Что же там за БД такая, что файлы лучше чем БД?


        1. yegorf1
          17.12.2016 22:18
          +2

          MongoDB, но почему был такой отказ я расскажу в следующем посте (:


        1. rekby
          17.12.2016 22:18
          +1

          база к телеграму отношения не имеет — бот это самостоятельная программа, которая рассылает/принимает сообщения через апи, т.е. база, файлы и всё остальное — это на откуп разработчика.


      1. antonksa
        17.12.2016 22:30
        -1

        sqlite: файл-бд
        ну или бд-файл
        не потеряется и можно на флешку project.db скопировать ))))


        по боту. немного скучновато. Есть книги-игры, возьмите готовую, помню в детстве играл в "Подземелья Черного Замка". Там порядка 1000 игровых ситуаций в дереве.


      1. Germanets
        18.12.2016 00:32
        +1

        Осторожнее с фалами, их количество вообще говоря — ограничено, точнее количество инодов. Да и работать с большим количеством файлов — так себе занятие.


        1. yegorf1
          18.12.2016 09:47

          Можно поподробнее?


          1. TimsTims
            18.12.2016 11:12

            Рано или поздно все урется в возможности HDD, и тогша ваш лот будет отвечать по 10 секунд каждому пользователю. А если файлов будет миллион, то бот будет только 30 минут открывать один файл


            1. TimsTims
              18.12.2016 21:17
              -2

              Автозамена…
              Урется — упрется
              Тошда — тогда
              Лот — бот


          1. TheCreator
            18.12.2016 17:36

            Я тоже делал свой первый проект в 2004 году на файлах, типа чтобы базу не нагружать (просто плохо знал, как ей пользоваться).
            Внезапно закончилось место, каждый файлик занимал 4 килобайта, даже если в нём был один символ, а файликов было мнооого.
            Поэтому очень-очень рекомендую вам использовать для хранения данных базу данных, они для этого и придуманы.


            1. yegorf1
              18.12.2016 17:36
              -1

              Там сейчас 11к файлов и они занимают 50 мегабайтов. Искрине верю, что место не закончится в ближайшее время (:


              1. TimsTims
                18.12.2016 21:21
                +1

                Чтобы найти лучшего игрока, или игроков с именем на T* вам придется пройти все 11000 файлов. Это огромная нагрузка на HDD. Да, все начинают с файлов, но надо обязательно переходить на БД. Ничего страшного признаться, что вы не знаете их преимуществ (а иначе бы точно перешли бы на них изначально). БД позволяют выдерживать самую первую нагрузку — нагрузку на диск, и это как раз ваш случай.


                1. yegorf1
                  18.12.2016 23:17

                  Но мне не нужен поиск по юзерам


                  1. TimsTims
                    19.12.2016 00:02

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


                  1. TimsTims
                    19.12.2016 00:03

                    И дело вовсе не в размере файлов, а в их количестве


  1. rekby
    17.12.2016 22:20

    По 30 сообщений/секунду: можно например плодить ботов, а все боты будут общаться с одним приложением на стороне сервера.


    1. AreD
      18.12.2016 01:36
      +2

      и будет 30 разных аккаунтов бота для пользователей, и какой из них рекламировать?
      Получится как с «Проблемы с доступом к Джойказино? Добавьте цифру 1 названию сайта»


      1. rekby
        18.12.2016 07:00

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


      1. KpoKec
        18.12.2016 17:33

        Основной бот перекидывает на любой свободный бот


        1. yegorf1
          18.12.2016 17:33

          Каждый лишний клик юзера заставляет юзера уходить, что не круто


          1. KpoKec
            19.12.2016 00:00

            Можно сделать главного бота как «Центр управления подземельями» или «Выбор проводника подземелья». Обставить в виде антуража. Снижение ограничений + масштабируемость на выходе. Хоть это и не так красиво, как всего один бот.


            1. Nigrimmist
              19.12.2016 14:37

              Да. Просто, такой же выход, как и в популярных мморпг — шардирование с выбором шарда перед входом… Да, будут запоминаться левые боты в телеграме, но увы, всё таки это в первую очередь мессенжер


  1. VovanZ
    18.12.2016 00:52
    +5

    Отступы табами в питоне?! Но как же PEP8...


    1. yegorf1
      18.12.2016 13:00
      +1

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


  1. GennPen
    18.12.2016 02:32

    куча плюсов за кучу отсылок… порадовали в выходные =)


  1. Borz
    18.12.2016 08:50
    +2

    MUD добрался до Telegram?


    1. yanchick
      18.12.2016 14:54

      Интересно было бы текущие (аля Былины) портировать в телеграм


      1. Borz
        18.12.2016 14:57

        зачем? есть же, к примеру, BlowTorch MUD Client


    1. u1tr0n
      24.12.2016 11:52
      +1

      ну в телеграмме есть много MUD игр, данная игра не единственная, вот еще есть


  1. dos
    18.12.2016 10:49

    Интересно, а вот популярная в IRC игра Арена уже есть в Телеграм?


  1. TimsTims
    18.12.2016 11:35
    +2

    Как говорится, все идет по кругу. Раньше игры были текстовые. Потом 2d, 3d, потом на планшетах и телефонах, потом игры в браузерах на любую платформу. Сейчас мы видим игры текстовые в Телеграмме, а потом Телеграмм будет со своей песочницей для запуска игр на любом телефоне. Ну а потом снова все будет в браузерах, который есть у всех, в отличии от мессендеров


    1. yegorf1
      18.12.2016 12:47
      +1

      Колесо сансары крутится-вертится (:


      1. TimsTims
        18.12.2016 16:38

        Ага) кстати, месяц назад примерно Телеграмм и так вывел новое обновление с быстрым запуском HTML страниц прямо из Телеграмм. Так-что мессенжер-комбайн все-в-одном вот вот и будет.


        1. BelBES
          18.12.2016 18:34

          Так-что мессенжер-комбайн все-в-одном вот вот и будет.

          Уже...Emacs называется.


    1. rubero
      18.12.2016 20:38

      В Телеграме уже есть поддержка своей платформы игр, для примера есть бот GameBot. Хотя по сути эти игры — браузерные, просто с интеграцией Телеграма.


  1. Captain_Sparrow
    18.12.2016 17:32

    А здоровье как-то можно восстанавливать?)


    1. yegorf1
      18.12.2016 17:32

      Зелья, Боги


  1. ifgeny87
    18.12.2016 17:32

    Спасибо за хороший рассказ. Сам писал бота-калькулятор. Телеграмм прекрасен.


  1. dwajot
    18.12.2016 17:32

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


    1. yegorf1
      18.12.2016 17:32

      У юзера или у бота?


      1. dwajot
        19.12.2016 03:07

        Ну эксепшен у бота возникает.


  1. dmial
    18.12.2016 22:29
    +3

    Эээ, не справляется ваш бот :-)

    image


  1. kenoma
    18.12.2016 23:24
    +1

    Скоро нас ждет возрождение MUD'ов?


    1. Tujh
      19.12.2016 08:02

      Кстати, вполне себе вариант.


  1. Ardogar
    19.12.2016 09:03

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

    Собственно я так и делаю.


    1. VovanZ
      19.12.2016 10:51

      Ещё можно продать душу дьяволу за условно бесконечные деньги и магическую силу.
      Только, наличие денег и силы не мешает потом умереть.


    1. Captain_Sparrow
      19.12.2016 11:16

      Не знаю, у меня мороженка используется только для атаки. Для продажи в инвентаре оно отсутствовало.


  1. tgchans
    19.12.2016 13:53

    А почему использование Call-back кнопок не позволяет сохранять историю сообщений? Историю же вы все равно храните самостоятельно у себя на сервере в любой удобной вам форме. В чем проблема преобразовать callback_data в текст сообщения и записать это как обычный месседж от пользователя? Не совсем понятна правда что имела в виду техподдержка когда говорила об использовании этих кнопок, ведь они заменят собой действия пользователя — который вместо того чтобы присылать сообщение будет нажимать на кнопку, и на количество отправляемых сообщений от бота к пользователю это никак не повлияет.

    Полагаю, что помочь может использование editMessageText и т.д. по нажатию на инлайн кнопку, поскольку в данном случае отправки нового сообщения не произойдет, а так же по возможности использовать answerInlineQuery для уведомлений разного характера, которые не обязательно отправлять сообщением. У нас в боте проблем с лимитом на отправленные сообщения не возникало, однако в районе половины всех ответов пользователю у нас уходят именно как editMessage по инлайн-кнопке.


    1. yegorf1
      19.12.2016 13:53

      Да, поддержка именно это и предлагала.
      Мы не храним на сервре историю сообщений. Только данное состояние пользователя.


  1. Joshua-kun
    19.12.2016 13:54

    Помнится, добавил его себе пару месяцев назад, по совету друга. Тогда ещё подумал: «Забавная штука, будет чем время скоротать!»
    Но, к сожалению, бот решил мне не отвечать. Вообще. Совершенно.


    1. yegorf1
      19.12.2016 13:54

      А сейчас работает?


      1. Joshua-kun
        19.12.2016 22:59

        К счастью, да.
        Рад, что вспомнил о нём благодаря посту.
        Спасибо. :)


  1. alterpub
    19.12.2016 19:03

    Бот слоупок, иногда секунд по 20 думает


  1. nordmine
    20.12.2016 12:21
    +1

    Автор, а вы не планируете реализовать поддержку сообщений на естественном языке, чтобы не нажимать на кнопки, а пытаться парсить простые предложения? Так можно создать иллюзию полной свободы действий и заложить кучу секретов и пасхалок)


    1. yegorf1
      20.12.2016 12:22

      Да, это есть в планах, но не в самом высоком приоритете, хотя и хотелось бы (: