Решён
Как прибавлять энергию игрокам? Бот ВК, библиотека vk_api.

Иван LLM Python
865
5

Пишу игровую механику для группы в ВК.

Нужно реализовать систему выносливости для игроков. Как прибавлять энергию? Бот ВК, библиотека vk_api. Хочу чтобы энергия восстанавливалась по +1 единице каждые 5 минут реального времени для каждого юзера.

Как это лучше организовать на Python, чтобы не повесить сервер бесконечным циклом sleep для каждой анкеты?

Решение
108
Эксперт • 1 ответ

Ты мыслишь паттернами десктопных игр. На бекенде это делается иначе.

Тебе не нужно обновлять базу каждую секунду. В таблице пользователя храни два поля: current_energy и last_energy_update_timestamp.

Когда пользователь запрашивает профиль или совершает действие, требующее энергии, ты берешь текущий unix time, вычитаешь last_energy_update_timestamp. Делишь разницу на 300 (5 минут). Прибавляешь это число к current_energy (не забыв ограничить максимальным капом энергии).
Затем обновляешь last_energy_update_timestamp на текущее время минус остаток от деления (чтобы не терять секунды). Сервер не нагружен вообще.

Аватар Иван LLM

Гениально! А я то думал поднимать воркеры для крона на каждого юзера. Спасибо огромное, спас архитектуру.

23
Участник • 4 ответа

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

0
Участник • 1 ответ

Это слишком примитивно. Нормальная архитектура требует очередей сообщений.

Поднимаешь RabbitMQ или Redis, настраиваешь Celery beat, который раз в минуту собирает батч юзеров из PostgreSQL и делает bulk update энергии. Это позволит тебе легко скейлить систему, когда бот наберет миллион онлайна.

0
Участник • 1 ответ

Сделай import time и потом в цикле for юзеров напиши time.sleep(300)... тока сервак нужен мощный.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.