Commit Graph
107 Commits
Author SHA1 Message Date
NotBigGhostandClaude Fable 5 002c657855 UI: даты игр в едином формате ДД.ММ.ГГГГ вместо сырых ISO-строк
Новый formatDate в domain/format.ts для date-only строк (played_at,
last_match_at). Применён: список партий, заголовок страницы партии
(раньше там было «2026-07-13»), записи в админке, «последняя партия»
на странице группы.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:42:05 +03:00
NotBigGhostandClaude Fable 5 7b61443fb9 UI: единое подтверждение удаления через ConfirmDialog
- админка, записи: удаление партии раньше срабатывало сразу по клику на
  иконку и показывало «Удалено» даже при ошибке — теперь модалка
  подтверждения и честная обработка ошибок;
- ачивки и dev-удаление аккаунта: window.confirm заменён на ConfirmDialog
  (в приложении принят именно он);
- настройки группы: удаление участника — с подтверждением.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:40:53 +03:00
NotBigGhostandClaude Fable 5 d2c0feafcc UI: единый Switch для булевых опций вместо смеси чекбоксов и свитчей
Новый компонент Switch (разметка .switch из global.css). Применён:
- создание группы: дополнения теперь свитчи, как в настройках группы;
- настройки группы: базовые дополнения показываются, как при создании
  (включены, заблокированы, подпись «всегда включено»), а не скрываются;
- админка: «Группировать по группам» и флаг «выбыл» в правке партии.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:38:46 +03:00
NotBigGhostandClaude Fable 5 cbf3cfc6e6 UI: единый PlayerLink — ники игроков кликабельны во всех местах просмотра
Новый компонент PlayerLink (ссылка на /u/:id, кликабельно всё поле строки,
stopPropagation для вложенности в кликабельные карточки). Применён:
- Leaderboard и общая статистика (рефакторинг ручных Link);
- страница партии: результаты и состав;
- настройки группы: список участников;
- список партий и незавершённые на главной (карточки button -> div,
  т.к. ссылки внутри button — невалидная разметка).
«пригласил: X» в приглашениях остаётся текстом — в API нет id пригласившего.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 17:37:19 +03:00
NotBigGhostandClaude Opus 4.8 d81f5d8964 Доки Pi: полная инструкция с нуля под деплой из 2 файлов; ключ туннеля генерируется на Pi
- deploy/pi/README: пошагово от чистого Pi (Docker → SSH-ключ туннеля на самом Pi → 2 файла → up),
  с объяснением назначения ключа и кодирования в base64 (TUNNEL_KEY_B64).
- .env.example/README: PowerShell-команда base64 через Resolve-Path (абсолютный путь — иначе
  [IO.File]::ReadAllBytes искал относительно домашнего каталога .NET и падал).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 22:00:10 +03:00
NotBigGhostandClaude Opus 4.8 029a043bfc Прод на Pi: деплой из 2 файлов (compose + .env), ключ туннеля из .env
Теперь на Pi нужны только docker-compose.yml и .env — без репозитория, сборки и файла ключа.

- docker-compose.yml: pull_policy: always (образы тянутся из реестра, сборка не запускается);
  ключ туннеля больше не монтируется томом — берётся из .env (TUNNEL_KEY_B64, base64);
  у VPS_TUNNEL_HOST убран :? (ломал бы buildx bake на ПК, где переменная не задана) — проверка
  обязательности перенесена в tunnel.sh (рантайм).
- deploy/tunnel/tunnel.sh: приватный ключ из TUNNEL_KEY_B64 (base64) с фолбэком на смонтированный
  /key/id_tunnel (для dev/test, где репозиторий на хосте).
- .env.example: TUNNEL_KEY_B64 + как сгенерировать base64 (Git Bash / PowerShell).
- deploy/pi/README: полный поток «голый Pi → 2 файла»: Docker, curl compose+.env из Gitea, up;
  обновление, автозапуск, бэкап как опция.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 21:48:40 +03:00
NotBigGhostandClaude Opus 4.8 c544f72063 Временный прод на ПК: docker-compose.temp.yml (forbiddenstars.ru/9000, поведение production)
Заглушка вместо Pi, пока он не готов: поднимает forbiddenstars.ru с ПК через слот VPS 9000,
APP_ENV=production, локальная x86-сборка (без реестра), отдельный проект forbidden-stars-temp
со своими постоянными томами под прод-данные. Позже данные мигрируют на Pi (backup → restore).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 11:47:28 +03:00
NotBigGhostandClaude Opus 4.8 886ff5d4e2 Деплой: PowerShell-версия build-push (на Windows bash уходит в WSL и падает)
- scripts/build-push.ps1: arm64 buildx bake + push, аналог build-push.sh для Windows-дева (ASCII).
- deploy/pi/README: указать .ps1 для Windows и почему `bash ...` в PowerShell не работает.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 00:23:49 +03:00
NotBigGhostandClaude Opus 4.8 1a61b05923 Прод-деплой через Gitea-реестр: arm64-образы собираются на ПК, Pi делает pull
- docker-compose.yml: image у app и tunnel → путь реестра ${IMAGE_REGISTRY}/...:${IMAGE_TAG}
  (build: оставлен фолбэком для сборки на Pi). Тома/настройки прежние.
- scripts/build-push.sh: buildx bake под linux/arm64 + push обоих образов в реестр (запуск на ПК).
- .env.example: блок ОБРАЗЫ ПРОДА (IMAGE_REGISTRY=gitea.arseniev.info/notbigghost, IMAGE_TAG=latest).
- deploy/pi/README: запуск/обновление через docker compose pull; альтернатива — сборка на Pi;
  заметка про HTTPS-реестр / insecure-registries.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 00:16:04 +03:00
NotBigGhostandClaude Opus 4.8 b3db5a4047 Прод на Pi: качественный единый compose, все настройки в .env
- docker-compose.yml: слот туннеля параметризован (${VPS_TUNNEL_PORT:-9000}), VPS_TUNNEL_HOST
  стал обязательным (${...:?}), лимиты ресурсов из .env (APP_MEM_LIMIT/APP_CPUS),
  stop_grace_period 30s (чек-пойнт WAL SQLite), security_opt no-new-privileges на обоих сервисах;
  healthcheck/логирование/тома сохранены (имена томов не менялись — данные не осиротеют).
- .env.example: VPS_TUNNEL_PORT по умолчанию НЕ задаётся (каждый контур берёт свой слот:
  dev→9001, prod→9000, test→9001); добавлены ADMIN_NICKNAME, DEV/PROD_ACHIEVEMENTS_DIR,
  APP_MEM_LIMIT/APP_CPUS.
- deploy/pi/README: чек-лист .env для Pi; запуск одним `docker compose up -d --build`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 23:46:33 +03:00
NotBigGhostandClaude Opus 4.8 32c74abc43 Бэкап: полный оффсайт-бэкап прода на VPS (БД + uploads + achievements) + восстановление
- scripts/backup.sh: консистентный снимок SQLite (.backup) + архив fs_<TS>.tar.gz с uploads и
  achievements в backups/, локальная ротация; при заданном BACKUP_VPS_HOST — push на VPS (scp
  отдельным ключом/юзером) с удалённой ротацией. Настройки читаются из .env (BACKUP_*).
- scripts/restore.sh: восстановление архива в прод (stop app → очистка тома → docker cp → start).
- .env.example: блок BACKUP_* (host/user/dir/key/keep). .gitignore: id_backup* (ключ бэкапа).
- deploy/pi/README, deploy/vps/README: настройка ключа и юзера backup, /srv/fs-backups, cron, restore.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 23:36:58 +03:00
NotBigGhostandClaude Opus 4.8 1e19038b7c Справка: страница /help с описанием подсчёта очков игроков + пункт «Справка» в боковом меню
Новая страница /help: формула League Points, нормировка по числу игроков, ничьи,
выбывшие = последнее место, порог 3 партии для топа, прочие показатели. Текст
соответствует services/scoring.py. Задел под будущие правила и подсказки.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 23:14:12 +03:00
NotBigGhost f56f9eb47b Правка кеширования данных сайта 2026-06-26 23:06:04 +03:00
NotBigGhost 6d75b4c130 Оформление оффлайн-страницы сайта 2026-06-26 18:14:54 +03:00
NotBigGhostandClaude Opus 4.8 75feb9d15a UI: рандом фракции — «Рандом всем» тоже анимируется; плавное замедление барабана и пауза 0.5с перед выбором
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 17:50:31 +03:00
NotBigGhostandClaude Opus 4.8 0745d07887 UI: кнопка «Меню» надёжно открывается на мобильных (onClick вместо pointerup + touch-action)
Открытие бокового меню переведено на нативный onClick: на тач-устройствах
pointerup часто не приходит из-за pointercancel, из-за чего меню не открывалось.
Долгое удержание (10с → админка) оставлено на таймере и подавляет этот клик.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 17:48:08 +03:00
NotBigGhost cec3aa25a6 Мелкие правки вёрстки 2026-06-26 17:44:28 +03:00
NotBigGhostandClaude Opus 4.8 712dc529c3 UI: список партий группы — дата серой, ники и номера мест белым текстом (контраст)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:59:28 +03:00
NotBigGhostandClaude Opus 4.8 395b134c9b UI: поле «О себе» больше нельзя растягивать (resize: none)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:58:32 +03:00
NotBigGhostandClaude Opus 4.8 7269afcd4e UI: подтверждение перед отменой незавершённой и удалением сыгранной партии (модалка)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:57:35 +03:00
NotBigGhostandClaude Opus 4.8 4d365a373b UI: рандом фракции — убрана подпись «случайная», добавлена анимация-барабан названий в строке
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:56:12 +03:00
NotBigGhostandClaude Opus 4.8 1438a17441 Партии: «выбывшие» игроки (красный крестик) = последнее место
Выбор места при завершении партии получает опцию «✕ выбыл»; выбывшему
авто-проставляется общее последнее место (ничья последнего ранга), плюс флаг
eliminated для отрисовки красным крестиком. В результатах и списке партий
выбывшие показываются крестиком и идут в конец. Подсчёт очков не меняется
(используются обычные числовые места).

Бэкенд: модель MatchParticipant.eliminated + миграция 0009 (идемпотентная);
схемы (place стал необязательным, +eliminated); match_service (хелпер
_resolve_finish_places, finish/update); проброс eliminated в роутерах и stats.
Фронт: выбор места с крестиком в MatchDetailPage и AdminMatchEdit, отрисовка в
результатах и MatchList, стиль .place-badge.eliminated; регенерация schema.d.ts.
Тесты: завершение с выбывшим (последнее место, засчитан), все-выбывшие → 422.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:54:37 +03:00
NotBigGhostandClaude Opus 4.8 cd7e5d16b4 UI: дополнения группы — горизонтальные тумблеры вместо галочек; строка базовой игры скрыта
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:43:10 +03:00
NotBigGhostandClaude Opus 4.8 c39c96d5dc UI: убран выбор группы из вкладки аккаунта (остаётся на странице группы)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:42:05 +03:00
NotBigGhostandClaude Opus 4.8 28c0358b45 UI: вместо кнопки «Назад» — кликабельное название игры, ведущее на главную
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:41:34 +03:00
NotBigGhostandClaude Opus 4.8 d32237975d UI: секретный вход в админку — удержание кнопки меню 10с; убраны видимые кнопки входа админа
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:40:49 +03:00
NotBigGhostandClaude Opus 4.8 460b57e792 UI: кнопка «Меню» (гамбургер) в нижней панели → боковое меню справа (плашка аккаунта + Выйти)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:39:20 +03:00
NotBigGhostandClaude Opus 4.8 6196c39d25 UI: круг создания партии — крупнее, полукруг, по центру разделяет слоты, смещён вниз и на передний план
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 16:36:54 +03:00
NotBigGhost 8f4a58d33d фикс бага с дублем аккаунтов при логине по нику 2026-06-26 15:33:27 +03:00
NotBigGhostandClaude Opus 4.8 f4286ffa6c Уведомления: persistent + live (push-to-invalidate → pull)
Новая система уведомлений поверх готовой SSE-шины: события пишутся в БД,
живут 72 часа и чистятся (при чтении списка + фоновой задачей), всплывают
сверху экрана в момент прихода, доступны через колокольчик в правом верхнем
углу (бейдж непрочитанных + панель).

Типы: приглашение в группу (→ /group), старт/финиш партии участникам кроме
инициатора (→ /match/{id}). Титулы — готовый хелпер-задел (не подключён, т.к.
выдача титулов игрокам ещё не реализована).

Бэкенд: модель Notification + миграция 0008 (идемпотентная), notification_service,
notify.notifications_changed, роутер /api/notifications (GET + /read), триггеры
в groups/matches, фоновая чистка в lifespan, защита hub.publish от закрытого loop.
Фронт: useNotifications/useMarkNotificationsRead, NotificationBell/Panel/Toaster,
перекомпоновка top-bar, стили; useServerEvents знает тип notifications.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 15:16:40 +03:00
NotBigGhostandClaude Opus 4.8 ef5c242e16 SSE: CSRF-middleware на чистом ASGI (BaseHTTPMiddleware буферизует поток и ломает SSE) + тест CSRF
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 23:08:10 +03:00
NotBigGhostandClaude Opus 4.8 2500ca575b Реал-тайм через SSE (push-to-invalidate): живые приглашения/партии, авто-обновление без перезагрузки
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 22:52:41 +03:00
NotBigGhostandClaude Opus 4.8 16452f7bbe Партии: оптимистичная блокировка (version) — устаревшие правки/отмена отклоняются (фикс гонки завершить-vs-отменить)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 22:39:20 +03:00
NotBigGhost eb34714868 v0.5 - Закрепление медиа в комментарии к партии 2026-06-17 22:09:15 +03:00
NotBigGhost 9c4535e8c1 отладка прикрепления файлов 2026-06-17 22:07:52 +03:00
NotBigGhostandClaude Opus 4.8 043595beff Админ: управление медиа партии (добавление/удаление в любой момент)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 21:38:06 +03:00
NotBigGhostandClaude Opus 4.8 8ac1b5acef Партии: фото в общем комментарии (до 10), загрузка при завершении
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 21:34:39 +03:00
NotBigGhost a466ae9868 v0.4 - Расширено управление группой. Добавление игроков в группу в формате приглашения. Добавлено несколько способов пригласить игрока в группу. Улучшена вёрстка интерфейса админа. 2026-06-17 21:10:30 +03:00
NotBigGhost 020c694a44 Убрана подсветка нажатия 2026-06-17 20:51:11 +03:00
NotBigGhost 1cb2fb2bea Правка вёсртки окна админа, форма редактирования партии на весь экран 2026-06-17 20:47:42 +03:00
NotBigGhostandClaude Opus 4.8 87c7f48a3e Группы: статистика игроков — все участники (несыгравшие отдельным блоком), строка кликабельна целиком
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:11:32 +03:00
NotBigGhostandClaude Opus 4.8 366742d6da Группы: добавление (приглашение) со страницы чужого профиля
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:09:19 +03:00
NotBigGhostandClaude Opus 4.8 a5c54512a5 Группы: приглашения вместо авто-добавления (согласиться/отказаться)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:07:20 +03:00
NotBigGhostandClaude Opus 4.8 66370c7df4 Группы: плашка + для создания группы в списке Мои группы
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 19:56:54 +03:00
NotBigGhost f337ff27b2 v0.3 - кастомизация аккаунта, просмотр чужих аккаунтов, создание кастомных титулов 2026-06-17 19:30:50 +03:00
NotBigGhost e3a78301c2 Исправлен баг, из-за которого не отображалась кнопка входа через telegram 2026-06-17 19:24:46 +03:00
NotBigGhostandClaude Opus 4.8 c4065962e2 Редактор ачивок в админке + файловое хранилище ачивок (задел под титулы)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 17:41:20 +03:00
NotBigGhostandClaude Opus 4.8 96daddae05 Кастомизация профиля (о себе, аватар) и просмотр профилей других игроков + общая статистика
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 17:27:24 +03:00
NotBigGhost b302ec769a переименовывание аккаунтов админом 2026-06-17 16:43:43 +03:00
NotBigGhost 3291c67b2c Добавлена функция удаления аккаунтов с каскадным удалением из всех записей для дева 2026-06-17 16:34:29 +03:00