|
|
|
|
@ -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/<SHA256 собственных байтов>.<jpg|png|webp|json>. |
|
|
|
|
Порядок COMMIT: оригинал, превью, описание; затем подписанная ссылка на описание. |
|
|
|
|
Повтор использует уже сохранённые неизменяемые объекты. Сервер проверяет имя/SHA256, |
|
|
|
|
лимит объекта и запрещает замену под прежним именем и rename в/из avatars. |
|
|
|
|
Файлы и каталог входят в обычные квоты. Прежние версии сохраняются на сервере; |
|
|
|
|
владелец может удалить их через файловый браузер. Старые PNG-ссылки не поддерживаются. |
|
|
|
|
|
|
|
|
|
Клик по аватарке сообщения/участника открывает галерею пользователя: LIST каталога |
|
|
|
|
выбирает только описания, проходит все страницы cursor/version, сортирует mtime DESC, |
|
|
|
|
при равенстве — по имени. Изначально выбрана текущая подписанная ссылка. Большое фото — |
|
|
|
|
полный оригинал, до его загрузки показывается превью. Внизу пять квадратных позиций: |
|
|
|
|
две предыдущие, выбранная по центру, две следующие; за границами списка позиции пустые. |
|
|
|
|
Desktop: кнопки/клавиши ←/→; Android: кнопки/свайпы при исходном масштабе. Превью кликабельны. |
|
|
|
|
Загружаются выбранный оригинал и видимые превью; закрытие отменяет запросы без других владельцев. |
|
|
|
|
Для DM источник — общий канал, из которого берётся отображаемая аватарка. |
|
|
|
|
|
|
|
|
|
AvatarManager общий для списка участников и сообщений, максимум две операции |
|
|
|
|
одновременно, одинаковые хеши не скачиваются параллельно. Изменение своего профиля |
|
|
|
|
@ -302,8 +319,8 @@ AvatarManager общий для списка участников и сообщ
|
|
|
|
|
отображается отдельной точкой поверх фотографии. Поздний результат старой ссылки |
|
|
|
|
пополняет кеш, но не заменяет картинку новой ссылки. |
|
|
|
|
|
|
|
|
|
Кеш аккаунта: <db_path>/avatar_cache/<local_UID_hex>/<sha256>.png; без db_path |
|
|
|
|
используется Qt AppLocalDataLocation. Проверяются SHA256 и квадратный PNG до 512×512; |
|
|
|
|
Кеш аккаунта: <db_path>/avatar_cache/<local_UID_hex>/<sha256>.<расширение>; без db_path |
|
|
|
|
используется Qt AppLocalDataLocation. Проверяются SHA256 объектов, описание и WebP 256×256; |
|
|
|
|
превышение/битая картинка не публикуются. Публикация кеша атомарна через QSaveFile, |
|
|
|
|
незавершённые download/part очищаются при старте. Готовые файлы не требуют TTL/STAT: |
|
|
|
|
смена содержимого меняет имя. Дисковый LRU — 100 МиБ, кеш QImage — 32 МиБ; |
|
|
|
|
|