From b91a040a32a2c4305f78d9005749eb6ae40a9aad Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 16 May 2025 12:58:49 +0400 Subject: [PATCH] Update API scheme on layer 204. --- Telegram/SourceFiles/data/data_channel.cpp | 39 +++++++++------ Telegram/SourceFiles/data/data_channel.h | 1 + Telegram/SourceFiles/data/data_peer.cpp | 7 +-- .../SourceFiles/data/data_saved_messages.cpp | 48 ++++++++++++------- Telegram/SourceFiles/data/data_session.cpp | 21 ++++++-- Telegram/SourceFiles/history/history_item.cpp | 29 +++++++---- .../history/history_item_components.h | 6 ++- Telegram/SourceFiles/mtproto/scheme/api.tl | 8 +++- .../window/window_session_controller.cpp | 2 +- 9 files changed, 108 insertions(+), 53 deletions(-) diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 179b77d38a..b207e62857 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -185,6 +185,9 @@ void ChannelData::setAccessHash(uint64 accessHash) { } void ChannelData::setFlags(ChannelDataFlags which) { + if (which & Flag::MonoforumAdmin) { + which |= Flag::Monoforum; + } if (which & (Flag::Forum | Flag::Monoforum)) { which |= Flag::Megagroup; } @@ -202,15 +205,15 @@ void ChannelData::setFlags(ChannelDataFlags which) { const auto takenForum = ((diff & Flag::Forum) && !(which & Flag::Forum)) ? mgInfo->takeForumData() : nullptr; - const auto takenMonoforum = ((diff & Flag::Monoforum) - && !(which & Flag::Monoforum)) + const auto takenMonoforum = ((diff & Flag::MonoforumAdmin) + && !(which & Flag::MonoforumAdmin)) ? mgInfo->takeMonoforumData() : nullptr; const auto wasIn = amIn(); - if ((diff & Flag::Forum) && (which & Flag::Forum)) { - mgInfo->ensureForum(this); - } else if ((diff & Flag::Monoforum) && (which & Flag::Monoforum)) { + if ((diff & Flag::MonoforumAdmin) && (which & Flag::MonoforumAdmin)) { mgInfo->ensureMonoforum(this); + } else if ((diff & Flag::Forum) && (which & Flag::Forum)) { + mgInfo->ensureForum(this); } _flags.set(which); if (diff & (Flag::Left | Flag::Forbidden)) { @@ -228,7 +231,7 @@ void ChannelData::setFlags(ChannelDataFlags which) { } } if (diff & (Flag::Forum - | Flag::Monoforum + | Flag::MonoforumAdmin | Flag::CallNotEmpty | Flag::SimilarExpanded | Flag::Signatures @@ -237,7 +240,7 @@ void ChannelData::setFlags(ChannelDataFlags which) { if (diff & Flag::CallNotEmpty) { history->updateChatListEntry(); } - if (diff & (Flag::Forum | Flag::Monoforum)) { + if (diff & (Flag::Forum | Flag::MonoforumAdmin)) { Core::App().notifications().clearFromHistory(history); history->updateChatListEntryHeight(); if (history->inChatList()) { @@ -334,9 +337,14 @@ bool ChannelData::discussionLinkKnown() const { } void ChannelData::setMonoforumLink(ChannelData *link) { - if (_monoforumLink != link) { - _monoforumLink = link; - session().changes().peerUpdated(this, UpdateFlag::MonoforumLink); + if (_monoforumLink || !link) { + return; + } + _monoforumLink = link; + link->setMonoforumLink(this); + session().changes().peerUpdated(this, UpdateFlag::MonoforumLink); + if (isMegagroup() && (link->amCreator() || link->hasAdminRights())) { + setFlags(flags() | Flag::MonoforumAdmin); } } @@ -826,6 +834,12 @@ void ChannelData::setAdminRights(ChatAdminRights rights) { session().changes().peerUpdated( this, UpdateFlag::Rights | UpdateFlag::Admins | UpdateFlag::BannedUsers); + if (isBroadcast() && _monoforumLink) { + const auto flags = _monoforumLink->flags(); + const auto admin = (amCreator() || hasAdminRights()); + _monoforumLink->setFlags((flags & ~Flag::MonoforumAdmin) + | (admin ? Flag::MonoforumAdmin : Flag())); + } } void ChannelData::setRestrictions(ChatRestrictionsInfo rights) { @@ -1291,11 +1305,6 @@ void ApplyChannelUpdate( } else { channel->setDiscussionLink(nullptr); } - if (const auto chat = update.vlinked_monoforum_id()) { - channel->setMonoforumLink(channel->owner().channelLoaded(chat->v)); - } else { - channel->setMonoforumLink(nullptr); - } if (const auto history = channel->owner().historyLoaded(channel)) { if (const auto available = update.vavailable_min_id()) { history->clearUpTill(available->v); diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index 6dc802dcfc..1a502f5290 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -80,6 +80,7 @@ enum class ChannelDataFlag : uint64 { PaidMessagesAvailable = (1ULL << 37), AutoTranslation = (1ULL << 38), Monoforum = (1ULL << 39), + MonoforumAdmin = (1ULL << 40), }; inline constexpr bool is_flag_type(ChannelDataFlag) { return true; }; using ChannelDataFlags = base::flags; diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index b6191a4dfe..2799c278c3 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1604,9 +1604,10 @@ bool PeerData::canManageGroupCall() const { } bool PeerData::amMonoforumAdmin() const { - const auto broadcast = monoforumBroadcast(); - return broadcast - && (broadcast->amCreator() || broadcast->hasAdminRights()); + if (const auto channel = asChannel()) { + return channel->flags() & ChannelDataFlag::MonoforumAdmin; + } + return false; } int PeerData::starsPerMessage() const { diff --git a/Telegram/SourceFiles/data/data_saved_messages.cpp b/Telegram/SourceFiles/data/data_saved_messages.cpp index a2c3f75daf..39b5821a08 100644 --- a/Telegram/SourceFiles/data/data_saved_messages.cpp +++ b/Telegram/SourceFiles/data/data_saved_messages.cpp @@ -264,21 +264,35 @@ void SavedMessages::apply( auto offsetPeer = (PeerData*)nullptr; const auto selfId = _owner->session().userPeerId(); for (const auto &dialog : *list) { - const auto &data = dialog.data(); - const auto peer = _owner->peer(peerFromMTP(data.vpeer())); - const auto topId = MsgId(data.vtop_message().v); - if (const auto item = _owner->message(selfId, topId)) { - offsetPeer = peer; - offsetDate = item->date(); - offsetId = topId; - lastValid = true; - const auto entry = sublist(peer); - const auto entryPinned = pinned || data.is_pinned(); - entry->applyMaybeLast(item); - _owner->setPinnedFromEntryList(entry, entryPinned); - } else { - lastValid = false; - } + dialog.match([&](const MTPDsavedDialog &data) { + const auto peer = _owner->peer(peerFromMTP(data.vpeer())); + const auto topId = MsgId(data.vtop_message().v); + if (const auto item = _owner->message(selfId, topId)) { + offsetPeer = peer; + offsetDate = item->date(); + offsetId = topId; + lastValid = true; + const auto entry = sublist(peer); + const auto entryPinned = pinned || data.is_pinned(); + entry->applyMaybeLast(item); + _owner->setPinnedFromEntryList(entry, entryPinned); + } else { + lastValid = false; + } + }, [&](const MTPDmonoForumDialog &data) { + const auto peer = _owner->peer(peerFromMTP(data.vpeer())); + const auto topId = MsgId(data.vtop_message().v); + if (const auto item = _owner->message(selfId, topId)) { + offsetPeer = peer; + offsetDate = item->date(); + offsetId = topId; + lastValid = true; + const auto entry = sublist(peer); + entry->applyMaybeLast(item); + } else { + lastValid = false; + } + }); } if (pinned) { } else if (!lastValid) { @@ -359,8 +373,8 @@ rpl::producer<> SavedMessages::destroyed() const { return _parentChat->flagsValue( ) | rpl::filter([=](const ChannelData::Flags::Change &update) { using Flag = ChannelData::Flag; - return (update.diff & Flag::Monoforum) - && !(update.value & Flag::Monoforum); + return (update.diff & Flag::MonoforumAdmin) + && !(update.value & Flag::MonoforumAdmin); }) | rpl::take(1) | rpl::to_empty; } diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index dd71002706..89074c285e 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -377,14 +377,14 @@ void Session::clear() { auto forums = base::flat_set>(); for (const auto &[peerId, peer] : _peers) { if (const auto channel = peer->asChannel()) { - if (channel->isForum() || channel->isMonoforum()) { + if (channel->isForum() || channel->amMonoforumAdmin()) { forums.emplace(channel); } } } for (const auto &channel : forums) { channel->setFlags(channel->flags() - & ~(ChannelDataFlag::Forum | ChannelDataFlag::Monoforum)); + & ~(ChannelDataFlag::Forum | ChannelDataFlag::MonoforumAdmin)); } _sendActionManager->clear(); @@ -1026,6 +1026,16 @@ not_null Session::processChat(const MTPChat &data) { channel->setStarsPerMessage( data.vsend_paid_messages_stars().value_or_empty()); + if (const auto monoforum = data.vlinked_monoforum_id()) { + if (const auto linked = channelLoaded(monoforum->v)) { + channel->setMonoforumLink(linked); + } else { + channel->updateFull(); + } + } else { + channel->setMonoforumLink(nullptr); + } + if (wasInChannel != channel->amIn()) { flags |= UpdateFlag::ChannelAmIn; } @@ -4659,9 +4669,10 @@ void Session::refreshChatListEntry(Dialogs::Key key) { } else if (const auto monoforum = history->peer->monoforum()) { monoforum->preloadSublists(); } - if (history->peer->isMonoforum() - && !history->peer->monoforumBroadcast()) { - history->peer->updateFull(); + if (const auto broadcast = history->peer->monoforumBroadcast()) { + if (!broadcast->isFullLoaded()) { + broadcast->updateFull(); + } } } } diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index f5e349a505..b7f9305f33 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -790,7 +790,14 @@ HistoryItem::~HistoryItem() { reply->clearData(this); } if (const auto saved = Get()) { - saved->sublist->removeOne(this); + if (saved->savedMessagesSublist) { + saved->savedMessagesSublist->removeOne(this); + } else if (const auto monoforum = _history->peer->monoforum()) { + const auto peer = _history->owner().peer(saved->sublistPeerId); + if (const auto sublist = monoforum->sublistLoaded(peer)) { + sublist->removeOne(this); + } + } } clearDependencyMessage(); applyTTL(0); @@ -3436,7 +3443,7 @@ FullStoryId HistoryItem::replyToStory() const { } FullReplyTo HistoryItem::replyTo() const { - const auto monoforumPeer = _history->peer->isMonoforum() + const auto monoforumPeer = _history->peer->amMonoforumAdmin() ? savedSublistPeer() : nullptr; auto result = FullReplyTo{ @@ -3560,19 +3567,26 @@ bool HistoryItem::isEmpty() const { Data::SavedSublist *HistoryItem::savedSublist() const { if (const auto saved = Get()) { - return saved->sublist; + if (saved->savedMessagesSublist) { + return saved->savedMessagesSublist; + } else if (const auto monoforum = _history->peer->monoforum()) { + const auto peer = _history->owner().peer(saved->sublistPeerId); + return monoforum->sublist(peer).get(); + } } else if (_history->peer->isSelf()) { const auto sublist = _history->owner().savedMessages().sublist( _history->peer); const auto that = const_cast(this); that->AddComponents(HistoryMessageSaved::Bit()); - that->Get()->sublist = sublist; + const auto saved = that->Get(); + saved->sublistPeerId = _history->peer->id; + saved->savedMessagesSublist = sublist; return sublist; } else if (const auto monoforum = _history->peer->monoforum()) { const auto sublist = monoforum->sublist(_from); const auto that = const_cast(this); that->AddComponents(HistoryMessageSaved::Bit()); - that->Get()->sublist = sublist; + that->Get()->sublistPeerId = _from->id; return sublist; } return nullptr; @@ -3802,10 +3816,7 @@ void HistoryItem::createComponents(CreateConfig &&config) { config.savedSublistPeer = _history->session().userPeerId(); } } - const auto peer = _history->owner().peer(config.savedSublistPeer); - saved->sublist = _history->peer->isSelf() - ? _history->owner().savedMessages().sublist(peer) - : _history->peer->monoforum()->sublist(peer); + saved->sublistPeerId = config.savedSublistPeer; } if (const auto reply = Get()) { diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 33fa873334..6ec434a967 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -174,7 +174,11 @@ struct HistoryMessageSavedMediaData struct HistoryMessageSaved : RuntimeComponent { - Data::SavedSublist *sublist = nullptr; + PeerId sublistPeerId = 0; + + // This can't change after the message is created, but is required + // frequently in reactions, so we cache the value here. + Data::SavedSublist *savedMessagesSublist = nullptr; }; class ReplyToMessagePointer final { diff --git a/Telegram/SourceFiles/mtproto/scheme/api.tl b/Telegram/SourceFiles/mtproto/scheme/api.tl index 4a76f7a93f..48cffcfef6 100644 --- a/Telegram/SourceFiles/mtproto/scheme/api.tl +++ b/Telegram/SourceFiles/mtproto/scheme/api.tl @@ -99,11 +99,11 @@ userStatusLastMonth#65899777 flags:# by_me:flags.0?true = UserStatus; chatEmpty#29562865 id:long = Chat; chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat; chatForbidden#6592a1a7 id:long title:string = Chat; -channel#7482147e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true broadcast_messages_allowed:flags2.16?true monoforum:flags2.17?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long = Chat; +channel#fe685355 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true broadcast_messages_allowed:flags2.16?true monoforum:flags2.17?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long linked_monoforum_id:flags2.18?long = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull; -channelFull#7fc3facc flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true paid_media_allowed:flags2.14?true can_view_stars_revenue:flags2.15?true paid_reactions_available:flags2.16?true stargifts_available:flags2.19?true paid_messages_available:flags2.20?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet bot_verification:flags2.17?BotVerification stargifts_count:flags2.18?int linked_monoforum_id:flags2.21?long = ChatFull; +channelFull#52d6806b flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true paid_media_allowed:flags2.14?true can_view_stars_revenue:flags2.15?true paid_reactions_available:flags2.16?true stargifts_available:flags2.19?true paid_messages_available:flags2.20?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet bot_verification:flags2.17?BotVerification stargifts_count:flags2.18?int = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; @@ -433,6 +433,8 @@ updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Updat updatePaidReactionPrivacy#8b725fce private:PaidReactionPrivacy = Update; updateSentPhoneCode#504aa18f sent_code:auth.SentCode = Update; updateGroupCallChainBlocks#a477288f call:InputGroupCall sub_chain_id:int blocks:Vector next_offset:int = Update; +updateReadMonoForumInbox#bcf34712 flags:# channel_id:long saved_peer_id:Peer read_max_id:int = Update; +updateReadMonoForumOutbox#a4a79376 channel_id:long saved_peer_id:Peer read_max_id:int = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -1713,6 +1715,7 @@ storyReactionPublicRepost#cfcd0f13 peer_id:Peer story:StoryItem = StoryReaction; stories.storyReactionsList#aa5f789c flags:# count:int reactions:Vector chats:Vector users:Vector next_offset:flags.0?string = stories.StoryReactionsList; savedDialog#bd87cb6c flags:# pinned:flags.2?true peer:Peer top_message:int = SavedDialog; +monoForumDialog#31ac5089 peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int = SavedDialog; messages.savedDialogs#f83ae221 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.SavedDialogs; messages.savedDialogsSlice#44ba9dd9 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.SavedDialogs; @@ -2392,6 +2395,7 @@ messages.savePreparedInlineMessage#f21f7f2f flags:# result:InputBotInlineResult messages.getPreparedInlineMessage#857ebdb8 bot:InputUser id:string = messages.PreparedInlineMessage; messages.searchStickers#29b1c66a flags:# emojis:flags.0?true q:string emoticon:string lang_code:Vector offset:int limit:int hash:long = messages.FoundStickers; messages.reportMessagesDelivery#5a6d7395 flags:# push:flags.0?true peer:InputPeer id:Vector = Bool; +messages.readSavedHistory#baab7bd6 parent_peer:InputPeer peer:InputPeer max_id:int = messages.Messages; updates.getState#edd4882a = updates.State; updates.getDifference#19c2f763 flags:# pts:int pts_limit:flags.1?int pts_total_limit:flags.0?int date:int qts:int qts_limit:flags.2?int = updates.Difference; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index f22dd049fe..9ea12353a1 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -603,7 +603,7 @@ void SessionNavigation::showPeerByLinkResolved( showPeerInfo(peer, params); } else if (resolveType == ResolveType::HashtagSearch) { searchMessages(info.text, peer->owner().history(peer)); - } else if ((peer->isForum() || peer->isMonoforum()) + } else if ((peer->isForum() || peer->amMonoforumAdmin()) && resolveType != ResolveType::Boost) { const auto itemId = info.messageId; if (!itemId) {