diff --git a/doc/member_files.txt b/doc/member_files.txt index 91817d91..07e661c6 100644 --- a/doc/member_files.txt +++ b/doc/member_files.txt @@ -273,7 +273,7 @@ Stop сервиса/группы завершает все принадлежа Новое членство обнаруживается через снимки участников и повторяет публикацию. Между серверами автоматического копирования нет. -userinfo содержит строковые avatar_server (16 hex цифр) и avatar_file (64 hex SHA256 + .png). +userinfo содержит строковые avatar_server (16 hex цифр) и avatar_file (64 hex SHA256 + .json). Оба поля отсутствуют при удалённой аватарке. Профиль подписан ключом участника; смена имени/адресов сохраняет остальные плоские JSON-атрибуты. userinfo ограничен 1024 байтами UTF-8. Merkle, JOIN_INFO_RESP, CHANNEL_INVITE и JOIN_REQUEST используют @@ -281,19 +281,36 @@ userinfo содержит строковые avatar_server (16 hex цифр) и профиль инвайтера, не создавая более свежую запись только с именем. Обе стороны нужно обновить: обратной совместимости нет. -Снимок участника CHAT_MEMBER_DISPLAY_SIZE теперь 157 байт: прежние 79 байт, -avatar_server:8LE, avatar_file:69 (с NUL), storage_role:1. storage_role обозначает +Снимок участника CHAT_MEMBER_DISPLAY_SIZE теперь 158 байт: прежние 79 байт, +avatar_server:8LE, avatar_file:70 (с NUL), storage_role:1. storage_role обозначает подписанную роль сервера, независимо от существующей колонки storage — сетевого приоритета, который может быть 0 у сервера за NAT. Потребители используют общий chat_member.h; локальное изменение профиля также вызывает MEMBER_UPDATED. В Settings → Profile доступны Upload avatar, выбор storage-сервера, предпросмотр и Remove avatar. Изменения применяются сразу, независимо от Save других настроек. -Worker проверяет размер входного изображения (до 16 мегапикселей), обрезает центральный -квадрат и сохраняет статический PNG 256×256. Файл ограничен 1 МиБ. Сервер проверяет -каноническое имя/SHA256, размер и запрещает замену под прежним именем и rename -в/из avatars. Файлы и каталог входят в обычные инкрементальные квоты/счётчики. -Прежние версии сохраняются на сервере; владелец может удалить их через файловый браузер. +Перед загрузкой desktop/Android показывают редактор: неподвижная квадратная рамка, +перемещение фото и масштабирование (мышь/колесо или жесты). Отмена не публикует новую ссылку. +Worker принимает JPEG/PNG/WebP до 32 МиБ и 16 мегапикселей. Исходные байты, включая EXIF, +сохраняются без изменений. Выбранная область после EXIF-ориентации становится WebP lossy +256×256, quality=85, максимум 1 МиБ. Описание JSON (максимум 4096 байт): version=1, +original/preview — имена объектов; original_bytes/preview_bytes, width/height — размеры +ориентированного оригинала; x/y/w/h — нормализованный квадрат в его координатах. +Все объекты лежат в avatars/.. +Порядок COMMIT: оригинал, превью, описание; затем подписанная ссылка на описание. +Повтор использует уже сохранённые неизменяемые объекты. Сервер проверяет имя/SHA256, +лимит объекта и запрещает замену под прежним именем и rename в/из avatars. +Файлы и каталог входят в обычные квоты. Прежние версии сохраняются на сервере; +владелец может удалить их через файловый браузер. Старые PNG-ссылки не поддерживаются. + +Клик по аватарке сообщения/участника открывает галерею пользователя: LIST каталога +выбирает только описания, проходит все страницы cursor/version, сортирует mtime DESC, +при равенстве — по имени. Изначально выбрана текущая подписанная ссылка. Большое фото — +полный оригинал, до его загрузки показывается превью. Внизу пять квадратных позиций: +две предыдущие, выбранная по центру, две следующие; за границами списка позиции пустые. +Desktop: кнопки/клавиши ←/→; Android: кнопки/свайпы при исходном масштабе. Превью кликабельны. +Загружаются выбранный оригинал и видимые превью; закрытие отменяет запросы без других владельцев. +Для DM источник — общий канал, из которого берётся отображаемая аватарка. AvatarManager общий для списка участников и сообщений, максимум две операции одновременно, одинаковые хеши не скачиваются параллельно. Изменение своего профиля @@ -302,8 +319,8 @@ AvatarManager общий для списка участников и сообщ отображается отдельной точкой поверх фотографии. Поздний результат старой ссылки пополняет кеш, но не заменяет картинку новой ссылки. -Кеш аккаунта: /avatar_cache//.png; без db_path -используется Qt AppLocalDataLocation. Проверяются SHA256 и квадратный PNG до 512×512; +Кеш аккаунта: /avatar_cache//.<расширение>; без db_path +используется Qt AppLocalDataLocation. Проверяются SHA256 объектов, описание и WebP 256×256; превышение/битая картинка не публикуются. Публикация кеша атомарна через QSaveFile, незавершённые download/part очищаются при старте. Готовые файлы не требуют TTL/STAT: смена содержимого меняет имя. Дисковый LRU — 100 МиБ, кеш QImage — 32 МиБ;