# Фаза 19. Присутствие на экране ## Зависимости - [Фаза 18](18-presence-walking.md) - [Фаза 17](17-timetable-screen.md) ## Зачем Школа впервые видна живой: в дереве идут числа, на перемене коридор наполняется, к звонку кабинеты сходятся обратно. ## Задачи - [x] Новое сообщение присутствия, ~2 раза в секунду, только по открытой школе: узлы со счётчиками и люди с их узлом и состоянием - [x] Снимок карты становится **статическим**: люди и текущий урок уезжают в присутствие, структура уходит один раз при открытии. Пересылка на смене слота убирается - [x] `ProtocolCodec.cs`, `protocol.ts` и `docs/protocol.md` правятся тем же коммитом, версия бумпится до 7 - [x] Справочник «id → имя» по HTTP: клиент забирает один раз при открытии школы и перечитывает, увидев незнакомый id. Имена в кадр присутствия не кладутся - [x] Дерево: число людей рядом с узлом, живое. Пустой узел остаётся без числа - [x] Панель локации: кто здесь сейчас, списком с именами; урок в комнате берётся из присутствия, а не из снимка - [x] Карточка человека: где он сейчас — узел, «в пути» или «вне школы» - [x] Присутствие приходит по всей школе, выбранный узел фильтрует клиент - [x] Кадр часов несёт разрешение на пропуск; клиент это разрешение **не вычисляет** - [x] Намерение «пропустить» — своё сообщение, как пауза и скорость. Сервер проверяет условия заново: кадр из браузера не доверенный - [x] Кнопка рядом с паузой и скоростями: появляется только когда сервер разрешил, подписана датой, к которой перенесёт - [x] Строки через `t(...)`, обе локали ## Тесты, без которых фаза не закрыта - [x] Байтовая раскладка присутствия сходится с обеих сторон - [x] Круговой прогон сообщения: сервер → клиент → те же значения - [x] Снимок карты больше не содержит людей и урока - [x] Кадр часов с разрешением на пропуск читается обеими сторонами одинаково - [x] Пропуск, присланный в учебное время, сервер отбрасывает, а не исполняет ## Критерий готовности - Открыть школу в 8:25 и увидеть, как двор и вестибюль пустеют, а кабинеты наполняются - На перемене коридор — самый людный узел дерева - В каникулы дерево без чисел, а карточки говорят «вне школы» - В пятницу после уроков дождаться, пока школа опустеет, нажать «пропустить» и оказаться в понедельник в 6:00; вечером буднего дня та же кнопка ведёт в завтрашнее утро - `dotnet test`, `npm test` и `npm run build` проходят ## Стоп Не рисовать перемещение анимацией. Не заводить серверный `OpenLocation`. Не добавлять нужды и действия.