Задача
Каждый думает, что умеет угадывать погоду. Идея Totometeo — превратить это в игру с лигами по образцу футбольного тотализатора TotoMondiale: игроки прогнозируют погоду в городе на заданный час, а реальные данные решают, кто получает очки. Игра должна работать сама: вовремя закрывать прогнозы, получать фактическую погоду, начислять очки и обновлять таблицы — без ручной работы.
Что я сделал
Я создал Totometeo — онлайн-игру в прогнозы погоды с публичными и частными лигами и автоматическим подсчётом очков по реальным метеоданным.
- Лиги — игроки создают публичные или частные лиги и приглашают друзей кодом из 6 символов, в котором нет похожих друг на друга символов вроде I, O, 0 и 1. В общую лигу входят все.
- Туры и прогнозы — каждый тур включает погодные события с городом, временем и дедлайном. Для каждого события игрок прогнозирует состояние неба, температуру, будет ли дождь, количество осадков в миллиметрах, скорость ветра и, по желанию, редкое явление вроде града или сильного ветра. Прогнозы можно менять до дедлайна, после чего они фиксируются.
- Реальные метеоданные — после события приложение берёт почасовые значения из Open-Meteo, а если прогнозных данных нет, обращается к историческому архиву. Погодные коды WMO сопоставляются с 7 состояниями игры, а редкие явления определяются по данным, например ветер 50 км/ч и сильнее.
- Движок подсчёта очков — 10 правил начисления и 2 допуска: от 5 очков за точное состояние до бонуса в 10 очков за редкое явление. Каждый результат сохраняется с расшифровкой, так что игрок видит, откуда взялось каждое очко.
- Автоматизация — одна задача по расписанию каждую минуту закрывает просроченные события; другая каждые 15 минут получает фактическую погоду и подсчитывает очки максимум для 25 событий за цикл.
- Таблицы и администрирование — таблицы лиги, общая и историческая, а также админ-панель для туров, событий, загрузки метеоданных, подсчёта очков, правил, пользователей и лиг, с журналом действий администраторов.
Технологии
Node.js и Express с серверным рендерингом страниц на EJS. MySQL или MariaDB через ORM Prisma, 10 моделей данных. Сессии на express-session, пароли хешируются bcrypt. Задачи по расписанию на node-cron, процессами управляет PM2 за Nginx. Метеоданные поступают из Open-Meteo, которому не нужен API-ключ.
Почему именно так
Правила подсчёта очков хранятся в базе данных, а не в коде. Значения по умолчанию из спецификации игры загружаются один раз при установке, а дальше администратор может менять очки и допуски из панели без нового релиза. Поскольку у каждого результата сохраняется расшифровка, любое изменение правил остаётся прозрачным для игроков.


