From 5a9dd44779a9aa30aec0623138ef5d1ac93463fd Mon Sep 17 00:00:00 2001 From: Grigory Date: Thu, 10 Apr 2025 03:22:01 +0500 Subject: [PATCH 1/2] feat: allow forwarding from chats/channels with restrictions --- Telegram/SourceFiles/apiwrap.cpp | 4 ++++ Telegram/SourceFiles/data/data_channel.cpp | 4 ++++ Telegram/SourceFiles/data/data_channel.h | 2 ++ Telegram/SourceFiles/data/data_chat.cpp | 4 ++++ Telegram/SourceFiles/data/data_chat.h | 2 ++ Telegram/SourceFiles/data/data_peer.cpp | 11 +++++++++++ Telegram/SourceFiles/data/data_peer.h | 1 + Telegram/SourceFiles/data/data_session.cpp | 4 +++- 8 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 7d2c1c31f..9b162a396 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -3420,6 +3420,10 @@ void ApiWrap::forwardMessages( } auto forwardFrom = draft.items.front()->history()->peer; + if (forwardFrom->allowsAyuForwarding()) { + // should copy content and send as a message + return; + } auto ids = QVector(); auto randomIds = QVector(); auto localIds = std::shared_ptr>(); diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index f21769328..385a895a8 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -621,6 +621,10 @@ bool ChannelData::allowsForwarding() const { return !(flags() & Flag::NoForwards); } +bool ChannelData::allowsAyuForwarding() const { + return !(flags() & Flag::AyuNoForwards); +} + bool ChannelData::canViewMembers() const { return (flags() & Flag::CanViewParticipants) && (!(flags() & Flag::ParticipantsHidden) diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index 115516073..7e67199b5 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -73,6 +73,7 @@ enum class ChannelDataFlag : uint64 { SignatureProfiles = (1ULL << 35), StargiftsAvailable = (1ULL << 36), PaidMessagesAvailable = (1ULL << 37), + AyuNoForwards = (1ULL << 38), }; inline constexpr bool is_flag_type(ChannelDataFlag) { return true; }; using ChannelDataFlags = base::flags; @@ -361,6 +362,7 @@ public: // Like in ChatData. [[nodiscard]] bool allowsForwarding() const; + [[nodiscard]] bool allowsAyuForwarding() const; [[nodiscard]] bool canEditInformation() const; [[nodiscard]] bool canEditPermissions() const; [[nodiscard]] bool canEditUsername() const; diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index 6f285e805..f5fc43fa2 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -68,6 +68,10 @@ bool ChatData::allowsForwarding() const { return !(flags() & Flag::NoForwards); } +bool ChatData::allowsAyuForwarding() const { + return !(flags() & Flag::AyuNoForwards); +} + bool ChatData::canEditInformation() const { return amIn() && !amRestricted(ChatRestriction::ChangeInfo); } diff --git a/Telegram/SourceFiles/data/data_chat.h b/Telegram/SourceFiles/data/data_chat.h index 5a285aeeb..7fd38f6b4 100644 --- a/Telegram/SourceFiles/data/data_chat.h +++ b/Telegram/SourceFiles/data/data_chat.h @@ -23,6 +23,7 @@ enum class ChatDataFlag { CallNotEmpty = (1 << 6), CanSetUsername = (1 << 7), NoForwards = (1 << 8), + AyuNoForwards = (1 << 9), }; inline constexpr bool is_flag_type(ChatDataFlag) { return true; }; using ChatDataFlags = base::flags; @@ -99,6 +100,7 @@ public: // Like in ChannelData. [[nodiscard]] bool allowsForwarding() const; + [[nodiscard]] bool allowsAyuForwarding() const; [[nodiscard]] bool canEditInformation() const; [[nodiscard]] bool canEditPermissions() const; [[nodiscard]] bool canEditUsername() const; diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 19140fbaa..ac9fa3a20 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1386,6 +1386,17 @@ bool PeerData::allowsForwarding() const { return false; } +bool PeerData::allowsAyuForwarding() const { + if (const auto user = asUser()) { + return true; + } else if (const auto channel = asChannel()) { + return channel->allowsAyuForwarding(); + } else if (const auto chat = asChat()) { + return chat->allowsAyuForwarding(); + } + return false; +} + Data::RestrictionCheckResult PeerData::amRestricted( ChatRestriction right) const { using Result = Data::RestrictionCheckResult; diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 21aad4cde..88c243f56 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -264,6 +264,7 @@ public: } [[nodiscard]] bool allowsForwarding() const; + [[nodiscard]] bool allowsAyuForwarding() const; [[nodiscard]] Data::RestrictionCheckResult amRestricted( ChatRestriction right) const; [[nodiscard]] bool amAnonymous() const; diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 68f9a092a..cefe29bf7 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -860,7 +860,8 @@ not_null Session::processChat(const MTPChat &data) { && chat->groupCall()->fullCount() > 0)) ? Flag::CallNotEmpty : Flag()) - | (data.is_noforwards() ? Flag::NoForwards : Flag()); + | (data.is_noforwards() ? Flag::NoForwards : Flag()) + | (data.is_ayuNoforwards() ? Flag::AyuNoForwards : Flag()); chat->setFlags((chat->flags() & ~flagsMask) | flagsSet); chat->count = data.vparticipants_count().v; @@ -1006,6 +1007,7 @@ not_null Session::processChat(const MTPChat &data) { | (data.is_creator() ? Flag::Creator : Flag()) : Flag()) | (data.is_noforwards() ? Flag::NoForwards : Flag()) + | (data.is_ayuNoforwards() ? Flag::AyuNoForwards : Flag()) | (data.is_join_to_send() ? Flag::JoinToWrite : Flag()) | (data.is_join_request() ? Flag::RequestToJoin : Flag()) | ((data.is_forum() && data.is_megagroup()) From a8dd11ff43edef1ca7880f397ddcf4eefa6d3a47 Mon Sep 17 00:00:00 2001 From: Grigory Date: Thu, 10 Apr 2025 03:25:05 +0500 Subject: [PATCH 2/2] Update apiwrap.cpp --- Telegram/SourceFiles/apiwrap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 9b162a396..92e6649b0 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -3420,7 +3420,7 @@ void ApiWrap::forwardMessages( } auto forwardFrom = draft.items.front()->history()->peer; - if (forwardFrom->allowsAyuForwarding()) { + if (!forwardFrom->allowsAyuForwarding()) { // should copy content and send as a message return; }