Как заказ на 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 оказался не ограничением. Он стал частью игрового движка.