در بیلد بتای تلگرام برای macOS نسخه 13.0.283318 مورخ 15 اکتبر، کلاینت تب جدیدی ظاهر شده است: یک فید پست از کانال‌ها که تلگرام بر اساس علایق کاربر انتخاب می‌کند و با نام «For you» شناخته می‌شود، و یک فید دوم که شامل پست‌های کانال‌هایی است که کاربر قبلاً در آن‌ها عضو شده است. در همین بیلد، صفحه‌ای نیز گنجانده شده که در آن می‌توان استیکرهای هدیه‌های کلکسیونی را روی کارت کیف پول تلگرام چسباند. در حال حاضر هیچ‌یک از این دو قابلیت قابل استفاده نیستند: هر دو ویژگی توسط سرور فعال می‌شوند و متدهای لازم در طرح‌واره API عمومی موجود نیستند.

The post on Telegram — @gramnews
فید «For you» و استیکرهای کیف پول در بتای تلگرام برای macOS

آنچه در بیلد 15 اکتبر ظاهر شد

بتای macOS از طریق فید به‌روزرسانی mac-updates.telegram.org توزیع می‌شود و هر بیلد یک فایل zip معمولی حاوی برنامه است. در نسخه 13.0.283309 مورخ 11 اکتبر، نه فید و نه استیکرهای روی کارت وجود ندارند. در نسخه 13.0.283318 مورخ 15 اکتبر، هر دو مجموعه به طور همزمان ظاهر می‌شوند: ماژول رابط کاربری NewsUI، سه فایل هسته در پوشه TelegramEngine/Feed و توضیحات انواع جدید API.

هسته کلاینت – TelegramCore – در تلگرام برای macOS با iOS مشترک است: این هسته از کدهای منبع برنامه آیفون متصل می‌شود. در مخزن عمومی Telegram-iOS هنوز پوشه TelegramEngine/Feed وجود ندارد و در کلاینت عمومی برای macOS نیز ماژول NewsUI دیده نمی‌شود. کد فید فقط در بیلد بتای کامپایل‌شده موجود است.

ساختار فید «For you» چگونه است؟

این ماژول دو فید را به طور همزمان مدیریت می‌کند. اولین فید، 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 – قرار دارد، به این معنی که فید به عنوان یک تب جداگانه در منوی اصلی طراحی شده است، نه به عنوان بخشی در لیست چت‌ها.

چرا نمی‌توانید این تب را برای خود فعال کنید؟

در باینری، کلید پیکربندی سرور برای فعال‌سازی فید وجود ندارد – در بیشتر قابلیت‌ها، چنین کلیدی به صورت یک رشته قرار دارد و از روی آن می‌توان فهمید که قابلیت با یک پرچم (flag) منتشر می‌شود. قابلیت مشاهده تب توسط یک نشانگر داخلی 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 قرار دارد.

استیکرهای هدیه‌های کلکسیونی روی کارت کیف پول

یافته دوم مربوط به کیف پول داخلی تلگرام است. کیف پول دارای یک کارت است – نواری با موجودی و آدرس در بالای صفحه. در بیلد 13.0.283318، انواع card و cardSticker در فضای نام wallet و نوع ورودی inputWalletCardSticker به آن اضافه شده‌اند: می‌توان استیکرها را روی کارت قرار داد و کلاینت چیدمان آن‌ها را در سرور ذخیره می‌کند. روی استیکر یک گزینه منو با عنوان «Remove from Card» وجود دارد.

استیکرها از هدیه‌های کلکسیونی گرفته می‌شوند – آن‌هایی که در تلگرام به صورت NFT طراحی شده‌اند. صفحه مجموعه کیف پول در بتا، کاشی هدیه را با یک نوار و شماره نمونه ترسیم می‌کند، و کاشی دارای حالت «جدا شده» است: هدیه مانند یک برچسب از کاشی جدا شده و به کارت منتقل می‌شود. خود کارت یک لایه درخشش روی استیکرها و یک استایل مخصوص هدیه، CardGiftStyle، دریافت کرده است.

The post on Telegram — @adele_toberg
استیکرهای هدیه‌های کلکسیونی روی کارت کیف پول

سرور بررسی می‌کند که چه چیزی مجاز است – این موضوع از طریق خطاهایی که کلاینت قادر به نمایش آن‌هاست، مشخص می‌شود. توضیحات این خطاها در کلاینت وجود ندارد و معنای آن‌ها از روی نامشان قابل درک است:

خطامعنای بر اساس نام
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 در آن نیستند.