В бета-сборке Telegram для macOS 13.0.283318 от 15 октября появился клиент новой вкладки: ленты постов из каналов, которую Telegram подбирает по интересам пользователя, под названием «For you», и второй ленты — из каналов, на которые человек уже подписан. В той же сборке собран экран, где на карточку кошелька Telegram можно клеить стикеры из коллекционных подарков. Пользоваться пока нельзя ни тем, ни другим: обе функции включает сервер, а в открытой схеме API нужных методов нет.
Что появилось в сборке от 15 октября
Бета macOS раздаётся через фид обновлений mac-updates.telegram.org, каждая сборка — обычный zip с приложением. В 13.0.283309 от 11 октября нет ни ленты, ни стикеров на карточке. В 13.0.283318 от 15 октября появляются сразу оба набора: модуль интерфейса NewsUI, три файла ядра в папке TelegramEngine/Feed и описания новых типов API.
Ядро клиента — TelegramCore — у Telegram для macOS общее с iOS: его подключают из исходников приложения для iPhone. В открытом репозитории Telegram-iOS папки TelegramEngine/Feed пока нет, в открытом клиенте для macOS нет модуля NewsUI. Код ленты существует только в скомпилированной бете.
Как устроена лента «Для вас»
Модуль держит две ленты сразу. Первая, forYouFeed, — подборка, которую составляет сервер. Вторая, в коде addedFeed, — посты из каналов, на которые человек подписан, с пустым состоянием «Posts from your channels appear here». У каждой свой список и своя прокрутка, переключаются они сегментами вверху экрана.
Подборка начинается с вопроса «What are you interested in?» и ряда чипов-интересов, у каждого — эмодзи. Список интересов клиент не хранит: он запрашивает его у сервера типом interestCategories и кеширует — у типа есть вариант interestCategoriesNotModified, которым сервер отвечает «список не менялся». Выбранный интерес клиент отправляет обратно и показывает подтверждение «Got it! More of this in For you».
Остальное знакомо по любой ленте. Посты подгружаются вниз страницами и обновляются жестом pull-to-refresh; над списком всплывает плашка новых постов; на пустой подборке написано «No posts for you yet», на ошибке — «Couldn't load posts». Есть кнопка «Mark All as Read»: прочитанное лента отмечает на сервере, а сервер присылает клиенту обновление updateReadFeed — так отметка расходится по всем устройствам аккаунта, как сейчас расходится прочитанность чатов.
У вкладки своя анимированная иконка tab_news. В ресурсах сборки она лежит рядом с иконками четырёх нынешних вкладок — tab_contacts, tab_calls, tab_chats и tab_settings, — то есть лента задумана отдельной вкладкой в главном меню, а не разделом внутри списка чатов.
Почему вкладку нельзя включить у себя
В бинарнике нет ключа серверной конфигурации, которым включалась бы лента, — у большинства функций такой ключ лежит строкой, и по нему видно, что функцию раскатывают флагом. Видимость вкладки держит внутренний признак showNewsTab, который при запуске выключен. Включается он, по устройству кода, только тогда, когда сервер вернул непустую ленту.
Содержимое обеих лент приходит методами из пространства имён feed — getForYou и соседними. Сервер решает, отдавать ли их аккаунту, и тому, кому лента не включена, отвечает пусто. Поэтому правка самого приложения в лучшем случае показывает вкладку с надписью «No posts for you yet»: экран нарисован, но наполнять его нечем.
Открытая схема API Telegram Desktop, слой 230, не содержит ни forYouFeed, ни feedMessages, ни interestCategories. Обычно новые методы появляются в открытых схемах вместе с выходом функции, поэтому именно по схеме будет видно, когда лента выйдет за пределы беты.
Что ещё известно о типах ленты
Пространство имён feed в сборке несёт типы forYouFeed (подборка), feedMessages и feedMessagesNotModified (страница постов и ответ «ничего нового»), feedItemMessage и feedPosition (элемент ленты и позиция, с которой продолжать подгрузку), interestCategory и interestCategories (интересы). Обновление updateReadFeed приходит в общем потоке обновлений аккаунта. Код подборки лежит в файле ForYouFeedContext, ленты подписок — в AddedFeedContext, интересов — в FeedInterests.
Стикеры из подарков на карточке кошелька
Вторая находка относится к кошельку, встроенному в Telegram. У кошелька есть карточка — плашка с балансом и адресом наверху экрана. В сборке 13.0.283318 к ней добавлены типы card и cardSticker в пространстве имён wallet и входной тип inputWalletCardSticker: на карточку можно положить стикеры, а клиент сохраняет их раскладку на сервере. На стикере есть пункт меню «Remove from Card».
Стикеры берутся из коллекционных подарков — тех, что в Telegram оформлены как NFT. Экран коллекции кошелька в бете рисует плитку подарка с лентой и номером экземпляра, а у плитки есть «отклеенное» состояние: подарок снимается с плитки как наклейка и переносится на карточку. Сама карточка получила слой бликов поверх стикеров и стиль под подарок, CardGiftStyle.
Что разрешено, проверяет сервер — это видно по ошибкам, которые клиент умеет показывать. Расшифровок к ним в клиенте нет, смысл читается по названиям:
| Ошибка | Смысл по названию |
|---|---|
WALLET_NFT_NOT_OWNED | подарок не принадлежит владельцу кошелька |
WALLET_NFT_INVALID | подарок не найден или не подходит |
WALLET_STICKER_DUPLICATE | этот подарок уже наклеен |
WALLET_STICKER_LIMIT_EXCEEDED | на карточке больше нет места |
WALLET_STICKER_INVALID | стикер не прошёл проверку |
WALLET_STICKER_SAVED_PROFILE | связана с подарками, сохранёнными в профиле; что именно она запрещает, по названию не понять |
Сколько стикеров помещается на карточку, в клиенте не записано: лимит держит сервер и сообщает о нём только ошибкой. Как и лента, стикеры на карточке не включаются правкой приложения — сохранение раскладки проверяет сервер, а в открытой схеме слоя 230 пространство имён wallet уже есть, но типов card и cardSticker в нём нет.




