Na versão beta do Telegram para macOS 13.0.283318, lançada em 15 de outubro, surgiu o cliente para uma nova aba: um feed de posts de canais, que o Telegram seleciona com base nos interesses do usuário, chamado "For you", e um segundo feed — de canais aos quais o usuário já está inscrito. Na mesma versão, foi incluída uma tela onde é possível colar adesivos de presentes colecionáveis no cartão da carteira do Telegram. Por enquanto, nenhuma das duas funções pode ser utilizada: ambas são ativadas pelo servidor, e os métodos necessários não estão presentes no esquema da API aberta.
O que foi incluído na versão de 15 de outubro
A versão beta para macOS é distribuída através do feed de atualizações mac-updates.telegram.org, e cada build é um arquivo zip comum com o aplicativo. Na versão 13.0.283309, de 11 de outubro, não há feed nem adesivos no cartão. Na 13.0.283318, de 15 de outubro, ambos os conjuntos aparecem imediatamente: o módulo de interface NewsUI, três arquivos do núcleo na pasta TelegramEngine/Feed e as descrições de novos tipos de API.
O núcleo do cliente — TelegramCore — do Telegram para macOS é compartilhado com o iOS: ele é conectado a partir do código-fonte do aplicativo para iPhone. No repositório aberto Telegram-iOS, a pasta TelegramEngine/Feed ainda não existe, e no cliente aberto para macOS não há módulo NewsUI. O código do feed existe apenas na versão beta compilada.
Como o feed "For you" funciona
O módulo mantém dois feeds simultaneamente. O primeiro, forYouFeed, é uma seleção feita pelo servidor. O segundo, no código addedFeed, são posts de canais aos quais o usuário está inscrito, com um estado vazio que diz "Posts from your channels appear here". Cada um tem sua própria lista e rolagem, e eles são alternados por segmentos na parte superior da tela.
A seleção começa com a pergunta "What are you interested in?" e uma série de chips de interesse, cada um com um emoji. O cliente não armazena a lista de interesses: ele a solicita ao servidor usando o tipo interestCategories e a armazena em cache — o tipo tem uma variante interestCategoriesNotModified, com a qual o servidor responde "a lista não foi alterada". O cliente envia o interesse selecionado de volta e mostra a confirmação "Got it! More of this in For you".
O restante é familiar para qualquer feed. Os posts são carregados para baixo em páginas e atualizados com o gesto pull-to-refresh; uma pílula de novos posts aparece acima da lista; no feed vazio, está escrito "No posts for you yet", e em caso de erro, "Couldn't load posts". Há um botão "Mark All as Read": o feed marca o que foi lido no servidor, e o servidor envia ao cliente uma atualização updateReadFeed — assim, a marcação se espalha por todos os dispositivos da conta, assim como a leitura de chats se espalha atualmente.
A aba tem seu próprio ícone animado tab_news. Nos recursos da build, ele está ao lado dos ícones das quatro abas atuais — tab_contacts, tab_calls, tab_chats e tab_settings —, o que significa que o feed foi concebido como uma aba separada no menu principal, e não como uma seção dentro da lista de chats.
Por que a aba não pode ser ativada por você
O binário não possui uma chave de configuração do servidor que ativaria o feed — na maioria das funções, essa chave é uma string, e por ela é possível ver que a função está sendo lançada por uma flag. A visibilidade da aba é controlada por um atributo interno showNewsTab, que está desativado na inicialização. Ele é ativado, de acordo com a estrutura do código, somente quando o servidor retorna um feed não vazio.
O conteúdo de ambos os feeds chega por métodos do namespace feed — getForYou e adjacentes. O servidor decide se os entrega à conta, e para quem o feed não está ativado, ele responde com um vazio. Portanto, a modificação do próprio aplicativo, na melhor das hipóteses, mostra a aba com a mensagem "No posts for you yet": a tela é desenhada, mas não há conteúdo para preenchê-la.
O esquema da API aberto do Telegram Desktop, camada 230, não contém forYouFeed, feedMessages nem interestCategories. Geralmente, novos métodos aparecem nos esquemas abertos junto com o lançamento da função, então será pelo esquema que se saberá quando o feed sairá da fase beta.
Adesivos de presentes no cartão da carteira
A segunda descoberta refere-se à carteira, integrada ao Telegram. A carteira possui um cartão — um painel com saldo e endereço na parte superior da tela. Na build 13.0.283318, foram adicionados os tipos card e cardSticker no namespace wallet e o tipo de entrada inputWalletCardSticker: é possível colocar adesivos no cartão, e o cliente salva seu arranjo no servidor. No adesivo, há um item de menu "Remove from Card".
Os adesivos são obtidos de presentes colecionáveis — aqueles que no Telegram são formatados como NFT. A tela de coleção da carteira na versão beta desenha um bloco de presente com uma fita e o número da instância, e o bloco tem um estado "descolado": o presente é removido do bloco como um adesivo e transferido para o cartão. O próprio cartão recebeu uma camada de brilho sobre os adesivos e um estilo de presente, CardGiftStyle.
O que é permitido é verificado pelo servidor — isso é visível pelos erros que o cliente pode exibir. Não há decodificações para eles no cliente, o significado é lido pelos nomes:
| Erro | Significado pelo nome |
|---|---|
WALLET_NFT_NOT_OWNED | o presente não pertence ao proprietário da carteira |
WALLET_NFT_INVALID | o presente não foi encontrado ou não é adequado |
WALLET_STICKER_DUPLICATE | este presente já foi colado |
WALLET_STICKER_LIMIT_EXCEEDED | não há mais espaço no cartão |
WALLET_STICKER_INVALID | o adesivo não passou na verificação |
WALLET_STICKER_SAVED_PROFILE | relacionado a presentes salvos no perfil; o que exatamente proíbe não é possível entender pelo nome |
Quantos adesivos cabem no cartão não está registrado no cliente: o limite é mantido pelo servidor e só é comunicado por meio de um erro. Assim como o feed, os adesivos no cartão não são ativados por meio de modificações no aplicativo — a gravação do arranjo é verificada pelo servidor, e no esquema aberto da camada 230, o namespace wallet já existe, mas os tipos card e cardSticker não estão presentes nele.




