From da1270af85e3db8e2189daa3369720b32fe2377b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sun, 12 Jul 2026 09:35:53 +0300 Subject: [PATCH] Added parsing of main profile tab from full peer info. --- Telegram/SourceFiles/data/data_changes.h | 4 +- Telegram/SourceFiles/data/data_channel.cpp | 1 + Telegram/SourceFiles/data/data_peer.cpp | 49 ++++++++++++++++++++++ Telegram/SourceFiles/data/data_peer.h | 19 +++++++++ Telegram/SourceFiles/data/data_user.cpp | 1 + 5 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/data/data_changes.h b/Telegram/SourceFiles/data/data_changes.h index e64f2f4929..17940ad042 100644 --- a/Telegram/SourceFiles/data/data_changes.h +++ b/Telegram/SourceFiles/data/data_changes.h @@ -124,8 +124,10 @@ struct PeerUpdate { GroupCall = (1ULL << 55), ManagedBot = (1ULL << 56), + MainProfileTab = (1ULL << 57), + // For iteration - LastUsedBit = (1ULL << 56), + LastUsedBit = (1ULL << 57), }; using Flags = base::flags; friend inline constexpr auto is_flag_type(Flag) { return true; } diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 47e3f34d3b..08ae3869be 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -1411,6 +1411,7 @@ void ApplyChannelUpdate( channel->setKickedCount(update.vkicked_count().value_or_empty()); channel->setSlowmodeSeconds(update.vslowmode_seconds().value_or_empty()); channel->setPeerGiftsCount(update.vstargifts_count().value_or_empty()); + channel->setMainProfileTab(Data::ParseProfileTab(update.vmain_tab())); if (const auto next = update.vslowmode_next_send_date()) { channel->growSlowmodeLastMessage( next->v - channel->slowmodeSeconds()); diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 027a47a1a1..3fb4d7781d 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -2048,6 +2048,17 @@ int PeerData::peerGiftsCount() const { return 0; } +void PeerData::setMainProfileTab(Data::ProfileTab tab) { + if (_mainProfileTab != tab) { + _mainProfileTab = tab; + session().changes().peerUpdated(this, UpdateFlag::MainProfileTab); + } +} + +Data::ProfileTab PeerData::mainProfileTab() const { + return _mainProfileTab; +} + MTPInputPeer PeerData::input() const { if (const auto user = asUser()) { const auto specific = user->inputUser(); @@ -2253,6 +2264,44 @@ std::optional ColorIndexFromColor(const MTPPeerColor *color) { }); } +ProfileTab ParseProfileTab(const MTPProfileTab *tab) { + if (!tab) { + return ProfileTab::None; + } + return tab->match([](const MTPDprofileTabPosts &) { + return ProfileTab::Posts; + }, [](const MTPDprofileTabGifts &) { + return ProfileTab::Gifts; + }, [](const MTPDprofileTabMedia &) { + return ProfileTab::Media; + }, [](const MTPDprofileTabFiles &) { + return ProfileTab::Files; + }, [](const MTPDprofileTabMusic &) { + return ProfileTab::Music; + }, [](const MTPDprofileTabVoice &) { + return ProfileTab::Voice; + }, [](const MTPDprofileTabLinks &) { + return ProfileTab::Links; + }, [](const MTPDprofileTabGifs &) { + return ProfileTab::Gifs; + }); +} + +MTPProfileTab ProfileTabToMTP(ProfileTab tab) { + switch (tab) { + case ProfileTab::Posts: return MTP_profileTabPosts(); + case ProfileTab::Gifts: return MTP_profileTabGifts(); + case ProfileTab::Media: return MTP_profileTabMedia(); + case ProfileTab::Files: return MTP_profileTabFiles(); + case ProfileTab::Music: return MTP_profileTabMusic(); + case ProfileTab::Voice: return MTP_profileTabVoice(); + case ProfileTab::Links: return MTP_profileTabLinks(); + case ProfileTab::Gifs: return MTP_profileTabGifs(); + case ProfileTab::None: break; + } + Unexpected("Tab in Data::ProfileTabToMTP."); +} + bool IsBotUserCreatesTopics(not_null peer) { if (const auto user = peer->asUser()) { return user->botInfo && user->botInfo->userCreatesTopics; diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 66e5f056ef..3fa98c0976 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -121,6 +121,18 @@ enum class AllowedReactionsType : uchar { Some, }; +enum class ProfileTab : uchar { + None, + Posts, + Gifts, + Media, + Files, + Music, + Voice, + Links, + Gifs, +}; + struct AllowedReactions { std::vector some; int maxCount = 0; @@ -587,6 +599,9 @@ public: [[nodiscard]] int peerGiftsCount() const; + void setMainProfileTab(Data::ProfileTab tab); + [[nodiscard]] Data::ProfileTab mainProfileTab() const; + [[nodiscard]] MTPInputPeer input() const; const PeerId id; @@ -650,6 +665,7 @@ private: BlockStatus _blockStatus = BlockStatus::Unknown; LoadedStatus _loadedStatus = LoadedStatus::Not; TranslationFlag _translationFlag = TranslationFlag::Unknown; + Data::ProfileTab _mainProfileTab = Data::ProfileTab::None; uint8 _colorIndex : 6 = 0; uint8 _colorIndexCloud : 1 = 0; std::optional _colorProfileIndex; @@ -680,6 +696,9 @@ void SetTopPinnedMessageId( [[nodiscard]] uint64 BackgroundEmojiIdFromColor(const MTPPeerColor *color); [[nodiscard]] std::optional ColorIndexFromColor(const MTPPeerColor *); +[[nodiscard]] ProfileTab ParseProfileTab(const MTPProfileTab *tab); +[[nodiscard]] MTPProfileTab ProfileTabToMTP(ProfileTab tab); + [[nodiscard]] bool IsBotUserCreatesTopics(not_null); [[nodiscard]] bool IsBotCreatesTopics(not_null); diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index f0def015c7..a013d9b222 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -938,6 +938,7 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { user->setAbout(qs(update.vabout().value_or_empty())); user->setCommonChatsCount(update.vcommon_chats_count().v); user->setPeerGiftsCount(update.vstargifts_count().value_or_empty()); + user->setMainProfileTab(Data::ParseProfileTab(update.vmain_tab())); user->checkFolder(update.vfolder_id().value_or_empty()); if (const auto theme = update.vtheme()) { theme->match([&](const MTPDchatTheme &data) {