Все материалыENGINEERING · Архитектура · 3 МИН ЧТЕНИЯ

Как заказ на Telegram-бота превратился в MMORPG

Кейс о том, как Telegram-бот с персонажами, классами, PvP и экономикой вырос в игровой сервер на Python, PostgreSQL и Redis.

Однажды ко мне пришёл клиент с задачей: «Хочу полноценную MMORPG прямо внутри Telegram-чата».

Не Mini App. Не сайт. Не /start и пять кнопок.

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

Звучало как хороший вызов. Я его принял.

И очень быстро выяснилось, что мы делаем уже не «бота», а маленький игровой сервер, где Telegram выступает клиентом.

Каждый чат — отдельный игровой мир

Первая важная идея была простой:

user_id + chat_id = игровой персонаж

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

То есть каждый Telegram-чат стал отдельным игровым миром.

А настоящий жар начался на классах и способностях. Игрок нажимает кнопку и хочет применить способность к другому человеку.

За доли секунды нужно проверить:

  • его класс;
  • доступность способности;
  • ресурс;
  • cooldown;
  • состояние цели;
  • защитные эффекты;
  • ограничения;
  • изменить состояния обоих игроков;
  • сохранить постоянные данные;
  • обновить кэш;
  • при необходимости поставить таймер или уведомление.

Для пользователя всё это выглядит как: нажал → получил результат. И именно так должно быть.

Telegram стал клиентом игрового сервера

Постепенно Telegram перестал быть просто ботом.

  • Сообщения стали игровыми событиями.
  • Inline-кнопки — интерфейсом.
  • FSM — последовательностями игровых действий.
  • PostgreSQL — постоянной памятью мира.
  • Redis — быстрым состоянием, cooldown, эффектами и кэшем.

А бизнес-логика переехала в отдельные сервисы, чтобы не получить несколько тысяч строк if внутри Telegram handlers.

Самой сложной оказалась экономика

Добавить валюту легко. Сделать баланс — нет.

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

Слишком много наград — экономика обесценивается. Слишком мало — игрок теряет мотивацию. Один новый предмет способен сломать целый класс.

Потом началось тестирование:

  • способность + предмет;
  • способность + эффект;
  • два игрока действуют одновременно;
  • ресурс заканчивается в момент действия;
  • в Redis осталось старое состояние;
  • игрок нажал старую кнопку.

Каждая механика отдельно работает. Проблемы появляются на пересечениях.

В итоге проект вырос примерно до 15 тысяч строк Python и более 400 тестов.

Когда обсуждают уже не систему, а игру

И вот наступил первый большой бета-тест.

Я ждал список сломанных сценариев и архитектурных переделок. Но заказчик вернулся в основном с правками вроде: «здесь поменять текст», «здесь немного изменить механику», «здесь другая формулировка».

То есть мы обсуждали уже не систему. Мы обсуждали игру.

В итоге получились:

  • 5 классов персонажей;
  • PvP и способности;
  • инвентарь и предметы;
  • квесты;
  • ресурсы и cooldown;
  • экономика;
  • временные эффекты;
  • уведомления;
  • отдельный мир для каждого чата;
  • веб-панель администратора.

Под капотом: Python, Aiogram, PostgreSQL, Redis и FastAPI.

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

Главный вывод у меня остался другой.

Сначала я думал, что мы запихиваем MMORPG внутрь Telegram.

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

Telegram оказался не ограничением. Он стал частью игрового движка.

Читать дальше