diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 0d29eb60d..f66dd0f96 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1000,7 +1000,7 @@ void Updates::handleSendActionUpdate( const auto channel = peer->asChannel(); const auto active = chat ? (chat->flags() & ChatDataFlag::CallActive) - : (channel->flags() & MTPDchannel::Flag::f_call_active); + : (channel->flags() & ChannelDataFlag::CallActive); if (active) { _pendingSpeakingCallParticipants.emplace( peer).first->second[fromId] = now; diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 883dda163..840512e28 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -1963,7 +1963,7 @@ void ParticipantsBoxController::subscribeToCreatorChange( const auto isCreator = channel->amCreator(); channel->flagsValue( ) | rpl::filter([](const ChannelData::Flags::Change &change) { - return (change.diff & MTPDchannel::Flag::f_creator); + return (change.diff & ChannelDataFlag::Creator); }) | rpl::filter([=] { return (isCreator != channel->amCreator()); }) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index c46bacfb2..ee0e28f1e 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -1471,9 +1471,9 @@ void Controller::togglePreHistoryHidden( // Update in the result doesn't contain the // channelFull:flags field which holds this value. // So after saving we need to update it manually. - const auto flags = channel->fullFlags(); - const auto flag = MTPDchannelFull::Flag::f_hidden_prehistory; - channel->setFullFlags(hidden ? (flags | flag) : (flags & ~flag)); + const auto flags = channel->flags(); + const auto flag = ChannelDataFlag::PreHistoryHidden; + channel->setFlags(hidden ? (flags | flag) : (flags & ~flag)); done(); }; diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.cpp b/Telegram/SourceFiles/calls/group/calls_group_members.cpp index bae760f09..c4e430ca4 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_members.cpp @@ -1656,7 +1656,7 @@ void Members::setupAddMember(not_null call) { ) | rpl::map([=] { return Data::PeerFlagValue( channel, - MTPDchannel::Flag::f_username); + ChannelDataFlag::Username); }) | rpl::flatten_latest()); } else { _canAddMembers = Data::CanWriteValue(peer.get()); diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 500889129..7acad65d5 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -58,14 +58,14 @@ ChannelData::ChannelData(not_null owner, PeerId id) _flags.changes( ) | rpl::start_with_next([=](const Flags::Change &change) { if (change.diff - & (MTPDchannel::Flag::f_left | MTPDchannel_ClientFlag::f_forbidden)) { + & (Flag::Left | Flag::Forbidden)) { if (const auto chat = getMigrateFromChat()) { session().changes().peerUpdated(chat, UpdateFlag::Migration); session().changes().peerUpdated(this, UpdateFlag::Migration); } } - if (change.diff & MTPDchannel::Flag::f_megagroup) { - if (change.value & MTPDchannel::Flag::f_megagroup) { + if (change.diff & Flag::Megagroup) { + if (change.value & Flag::Megagroup) { if (!mgInfo) { mgInfo = std::make_unique(); } @@ -73,7 +73,7 @@ ChannelData::ChannelData(not_null owner, PeerId id) mgInfo = nullptr; } } - if (change.diff & MTPDchannel::Flag::f_call_not_empty) { + if (change.diff & Flag::CallNotEmpty) { if (const auto history = this->owner().historyLoaded(this)) { history->updateChatListEntry(); } @@ -412,7 +412,7 @@ bool ChannelData::anyoneCanAddMembers() const { } bool ChannelData::hiddenPreHistory() const { - return (fullFlags() & MTPDchannelFull::Flag::f_hidden_prehistory); + return (flags() & Flag::PreHistoryHidden); } bool ChannelData::canAddMembers() const { @@ -437,15 +437,14 @@ bool ChannelData::canPublish() const { bool ChannelData::canWrite() const { // Duplicated in Data::CanWriteValue(). - const auto allowed = amIn() || (flags() & MTPDchannel::Flag::f_has_link); + const auto allowed = amIn() || (flags() & Flag::HasLink); return allowed && (canPublish() || (!isBroadcast() && !amRestricted(Restriction::SendMessages))); } bool ChannelData::canViewMembers() const { - return fullFlags() - & MTPDchannelFull::Flag::f_can_view_participants; + return flags() & Flag::CanViewParticipants; } bool ChannelData::canViewAdmins() const { @@ -480,11 +479,11 @@ bool ChannelData::canEditPreHistoryHidden() const { bool ChannelData::canEditUsername() const { return amCreator() - && (fullFlags() & MTPDchannelFull::Flag::f_can_set_username); + && (flags() & Flag::CanSetUsername); } bool ChannelData::canEditStickers() const { - return (fullFlags() & MTPDchannelFull::Flag::f_can_set_stickers); + return (flags() & Flag::CanSetStickers); } bool ChannelData::canDelete() const { @@ -688,7 +687,7 @@ void ChannelData::migrateCall(std::unique_ptr call) { _call = std::move(call); _call->setPeer(this); session().changes().peerUpdated(this, UpdateFlag::GroupCall); - addFlags(MTPDchannel::Flag::f_call_active); + addFlags(Flag::CallActive); } void ChannelData::setGroupCall( @@ -714,7 +713,7 @@ void ChannelData::setGroupCall( scheduleDate); owner().registerGroupCall(_call.get()); session().changes().peerUpdated(this, UpdateFlag::GroupCall); - addFlags(MTPDchannel::Flag::f_call_active); + addFlags(Flag::CallActive); }); } @@ -725,8 +724,7 @@ void ChannelData::clearGroupCall() { owner().unregisterGroupCall(_call.get()); _call = nullptr; session().changes().peerUpdated(this, UpdateFlag::GroupCall); - removeFlags(MTPDchannel::Flag::f_call_active - | MTPDchannel::Flag::f_call_not_empty); + removeFlags(Flag::CallActive | Flag::CallNotEmpty); } void ChannelData::setGroupCallDefaultJoinAs(PeerId peerId) { @@ -791,10 +789,21 @@ void ApplyChannelUpdate( } channel->setMessagesTTL(update.vttl_period().value_or_empty()); - channel->setFullFlags(update.vflags().v); + using Flag = ChannelDataFlag; + const auto mask = Flag::CanSetUsername + | Flag::CanViewParticipants + | Flag::CanSetStickers + | Flag::PreHistoryHidden + | Flag::Location; + channel->setFlags((channel->flags() & ~mask) + | (update.is_can_set_username() ? Flag::CanSetUsername : Flag()) + | (update.is_can_view_participants() ? Flag::CanViewParticipants : Flag()) + | (update.is_can_set_stickers() ? Flag::CanSetStickers : Flag()) + | (update.is_hidden_prehistory() ? Flag::PreHistoryHidden : Flag()) + | (update.vlocation() ? Flag::Location : Flag())); channel->setUserpicPhoto(update.vchat_photo()); if (const auto migratedFrom = update.vmigrated_from_chat_id()) { - channel->addFlags(MTPDchannel::Flag::f_megagroup); + channel->addFlags(Flag::Megagroup); const auto chat = channel->owner().chat(migratedFrom->v); Data::ApplyMigration(chat, channel); } diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index a5fdf4407..a08e34b09 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -29,6 +29,31 @@ struct ChannelLocation { } }; +enum class ChannelDataFlag { + Left = (1 << 0), + Creator = (1 << 1), + Forbidden = (1 << 2), + CallActive = (1 << 3), + CallNotEmpty = (1 << 4), + Signatures = (1 << 5), + Verified = (1 << 6), + Scam = (1 << 7), + Fake = (1 << 8), + Megagroup = (1 << 9), + Broadcast = (1 << 10), + Gigagroup = (1 << 11), + Username = (1 << 12), + Location = (1 << 13), + CanSetUsername = (1 << 14), + CanSetStickers = (1 << 15), + PreHistoryHidden = (1 << 16), + CanViewParticipants = (1 << 17), + HasLink = (1 << 18), + SlowmodeEnabled = (1 << 19), +}; +inline constexpr bool is_flag_type(ChannelDataFlag) { return true; }; +using ChannelDataFlags = base::flags; + class MegagroupInfo { public: struct Admin { @@ -94,35 +119,8 @@ private: class ChannelData : public PeerData { public: - static constexpr auto kEssentialFlags = 0 - | MTPDchannel::Flag::f_creator - | MTPDchannel::Flag::f_left - | MTPDchannel_ClientFlag::f_forbidden - | MTPDchannel::Flag::f_broadcast - | MTPDchannel::Flag::f_verified - | MTPDchannel::Flag::f_scam - | MTPDchannel::Flag::f_fake - | MTPDchannel::Flag::f_megagroup - | MTPDchannel::Flag::f_gigagroup - | MTPDchannel::Flag::f_restricted - | MTPDchannel::Flag::f_signatures - | MTPDchannel::Flag::f_username - | MTPDchannel::Flag::f_call_not_empty - | MTPDchannel::Flag::f_slowmode_enabled; - using Flags = Data::Flags< - MTPDchannel::Flags, - kEssentialFlags>; - - static constexpr auto kEssentialFullFlags = 0 - | MTPDchannelFull::Flag::f_can_view_participants - | MTPDchannelFull::Flag::f_can_set_username - | MTPDchannelFull::Flag::f_can_set_stickers - | MTPDchannelFull::Flag::f_location - | MTPDchannelFull::Flag::f_slowmode_seconds - | MTPDchannelFull::Flag::f_slowmode_next_send_date; - using FullFlags = Data::Flags< - MTPDchannelFull::Flags, - kEssentialFullFlags>; + using Flag = ChannelDataFlag; + using Flags = Data::Flags; using AdminRight = ChatAdminRight; using Restriction = ChatRestriction; @@ -137,13 +135,13 @@ public: void setPhoto(const MTPChatPhoto &photo); void setAccessHash(uint64 accessHash); - void setFlags(MTPDchannel::Flags which) { + void setFlags(ChannelDataFlags which) { _flags.set(which); } - void addFlags(MTPDchannel::Flags which) { + void addFlags(ChannelDataFlags which) { _flags.add(which); } - void removeFlags(MTPDchannel::Flags which) { + void removeFlags(ChannelDataFlags which) { _flags.remove(which); } [[nodiscard]] auto flags() const { @@ -153,22 +151,6 @@ public: return _flags.value(); } - void setFullFlags(MTPDchannelFull::Flags which) { - _fullFlags.set(which); - } - void addFullFlags(MTPDchannelFull::Flags which) { - _fullFlags.add(which); - } - void removeFullFlags(MTPDchannelFull::Flags which) { - _fullFlags.remove(which); - } - [[nodiscard]] auto fullFlags() const { - return _fullFlags.current(); - } - [[nodiscard]] auto fullFlagsValue() const { - return _fullFlags.value(); - } - [[nodiscard]] int membersCount() const { return std::max(_membersCount, 1); } @@ -193,25 +175,25 @@ public: void setKickedCount(int newKickedCount); [[nodiscard]] bool haveLeft() const { - return flags() & MTPDchannel::Flag::f_left; + return flags() & Flag::Left; } [[nodiscard]] bool amIn() const { return !isForbidden() && !haveLeft(); } [[nodiscard]] bool addsSignature() const { - return flags() & MTPDchannel::Flag::f_signatures; + return flags() & Flag::Signatures; } [[nodiscard]] bool isForbidden() const { - return flags() & MTPDchannel_ClientFlag::f_forbidden; + return flags() & Flag::Forbidden; } [[nodiscard]] bool isVerified() const { - return flags() & MTPDchannel::Flag::f_verified; + return flags() & Flag::Verified; } [[nodiscard]] bool isScam() const { - return flags() & MTPDchannel::Flag::f_scam; + return flags() & Flag::Scam; } [[nodiscard]] bool isFake() const { - return flags() & MTPDchannel::Flag::f_fake; + return flags() & Flag::Fake; } [[nodiscard]] static ChatRestrictionsInfo KickedRestrictedRights( @@ -235,25 +217,25 @@ public: [[nodiscard]] bool isGroupAdmin(not_null user) const; [[nodiscard]] bool lastParticipantsRequestNeeded() const; [[nodiscard]] bool isMegagroup() const { - return flags() & MTPDchannel::Flag::f_megagroup; + return flags() & Flag::Megagroup; } [[nodiscard]] bool isBroadcast() const { - return flags() & MTPDchannel::Flag::f_broadcast; + return flags() & Flag::Broadcast; } [[nodiscard]] bool isGigagroup() const { - return flags() & MTPDchannel::Flag::f_gigagroup; + return flags() & Flag::Gigagroup; } [[nodiscard]] bool hasUsername() const { - return flags() & MTPDchannel::Flag::f_username; + return flags() & Flag::Username; } [[nodiscard]] bool hasLocation() const { - return fullFlags() & MTPDchannelFull::Flag::f_location; + return flags() & Flag::Location; } [[nodiscard]] bool isPublic() const { return hasUsername() || hasLocation(); } [[nodiscard]] bool amCreator() const { - return flags() & MTPDchannel::Flag::f_creator; + return flags() & Flag::Creator; } [[nodiscard]] auto adminRights() const { @@ -446,8 +428,7 @@ private: -> const std::vector & override; bool canEditLastAdmin(not_null user) const; - Flags _flags = Flags(MTPDchannel_ClientFlag::f_forbidden | 0); - FullFlags _fullFlags; + Flags _flags = ChannelDataFlags(Flag::Forbidden); PtsWaiter _ptsWaiter; diff --git a/Telegram/SourceFiles/data/data_group_call.cpp b/Telegram/SourceFiles/data/data_group_call.cpp index e337fd679..07db42880 100644 --- a/Telegram/SourceFiles/data/data_group_call.cpp +++ b/Telegram/SourceFiles/data/data_group_call.cpp @@ -175,7 +175,7 @@ void GroupCall::changePeerEmptyCallFlag() { const auto chat = _peer->asChat(); const auto channel = _peer->asChannel(); constexpr auto chatFlag = ChatDataFlag::CallNotEmpty; - constexpr auto channelFlag = MTPDchannel::Flag::f_call_not_empty; + constexpr auto channelFlag = ChannelDataFlag::CallNotEmpty; if (_peer->groupCall() != this) { return; } else if (_serverParticipantsCount > 0) { diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 54d42a149..cf018f81c 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -250,10 +250,9 @@ void PeerData::updateNameDelayed( if (asChannel()->username != newUsername) { asChannel()->username = newUsername; if (newUsername.isEmpty()) { - asChannel()->removeFlags( - MTPDchannel::Flag::f_username); + asChannel()->removeFlags(ChannelDataFlag::Username); } else { - asChannel()->addFlags(MTPDchannel::Flag::f_username); + asChannel()->addFlags(ChannelDataFlag::Username); } flags |= UpdateFlag::Username; } @@ -909,7 +908,7 @@ bool PeerData::slowmodeApplied() const { if (const auto channel = asChannel()) { return !channel->amCreator() && !channel->hasAdminRights() - && (channel->flags() & MTPDchannel::Flag::f_slowmode_enabled); + && (channel->flags() & ChannelDataFlag::SlowmodeEnabled); } return false; } @@ -928,9 +927,9 @@ rpl::producer PeerData::slowmodeAppliedValue() const { auto slowmodeEnabled = channel->flagsValue( ) | rpl::filter([=](const ChannelData::Flags::Change &change) { - return (change.diff & MTPDchannel::Flag::f_slowmode_enabled) != 0; + return (change.diff & ChannelDataFlag::SlowmodeEnabled) != 0; }) | rpl::map([=](const ChannelData::Flags::Change &change) { - return (change.value & MTPDchannel::Flag::f_slowmode_enabled) != 0; + return (change.value & ChannelDataFlag::SlowmodeEnabled) != 0; }) | rpl::distinct_until_changed(); return rpl::combine( diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index 8577e6371..019564358 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -157,12 +157,6 @@ inline auto DefaultRestrictionValue( return SingleFlagValue(DefaultRestrictionsValue(chat), flag); } -rpl::producer PeerFlagValue( - ChannelData *channel, - MTPDchannel_ClientFlag flag) { - return PeerFlagValue(channel, static_cast(flag)); -} - rpl::producer CanWriteValue(UserData *user) { using namespace rpl::mappers; @@ -204,12 +198,13 @@ rpl::producer CanWriteValue(ChatData *chat) { } rpl::producer CanWriteValue(ChannelData *channel) { + using Flag = ChannelDataFlag; const auto mask = 0 - | MTPDchannel::Flag::f_left - | MTPDchannel::Flag::f_has_link - | MTPDchannel_ClientFlag::f_forbidden - | MTPDchannel::Flag::f_creator - | MTPDchannel::Flag::f_broadcast; + | Flag::Left + | Flag::HasLink + | Flag::Forbidden + | Flag::Creator + | Flag::Broadcast; return rpl::combine( PeerFlagsValue(channel, mask), AdminRightValue( @@ -222,18 +217,16 @@ rpl::producer CanWriteValue(ChannelData *channel) { channel, ChatRestriction::SendMessages), []( - MTPDchannel::Flags flags, + ChannelDataFlags flags, bool postMessagesRight, bool sendMessagesRestriction, bool defaultSendMessagesRestriction) { - const auto notAmInFlags = 0 - | MTPDchannel::Flag::f_left - | MTPDchannel_ClientFlag::f_forbidden; + const auto notAmInFlags = Flag::Left | Flag::Forbidden; const auto allowed = !(flags & notAmInFlags) - || (flags & MTPDchannel::Flag::f_has_link); + || (flags & Flag::HasLink); return allowed && (postMessagesRight - || (flags & MTPDchannel::Flag::f_creator) - || (!(flags & MTPDchannel::Flag::f_broadcast) + || (flags & Flag::Creator) + || (!(flags & Flag::Broadcast) && !sendMessagesRestriction && !defaultSendMessagesRestriction)); }); @@ -290,18 +283,17 @@ rpl::producer CanPinMessagesValue(not_null peer) { return rpl::combine( AdminRightValue(megagroup, ChatAdminRight::PinMessages), DefaultRestrictionValue(megagroup, ChatRestriction::PinMessages), - PeerFlagValue(megagroup, MTPDchannel::Flag::f_username), - PeerFullFlagValue(megagroup, MTPDchannelFull::Flag::f_location), + PeerFlagsValue( + megagroup, + ChannelDataFlag::Username | ChannelDataFlag::Location), megagroup->restrictionsValue() ) | rpl::map([=]( bool adminRightAllows, bool defaultRestriction, - bool hasUsername, - bool hasLocation, + ChannelDataFlags usernameOrLocation, Data::Flags::Change restrictions) { return adminRightAllows - || (!hasUsername - && !hasLocation + || (!usernameOrLocation && !defaultRestriction && !(restrictions.value & ChatRestriction::PinMessages)); }); @@ -451,7 +443,7 @@ bool IsUserOnline(not_null user) { } bool ChannelHasActiveCall(not_null channel) { - return (channel->flags() & MTPDchannel::Flag::f_call_not_empty); + return (channel->flags() & ChannelDataFlag::CallNotEmpty); } } // namespace Data diff --git a/Telegram/SourceFiles/data/data_peer_values.h b/Telegram/SourceFiles/data/data_peer_values.h index 3d71af8eb..b371d242c 100644 --- a/Telegram/SourceFiles/data/data_peer_values.h +++ b/Telegram/SourceFiles/data/data_peer_values.h @@ -65,10 +65,6 @@ inline auto PeerFlagValue( return SingleFlagValue(PeerFlagsValue(peer), flag); } -rpl::producer PeerFlagValue( - ChannelData *channel, - MTPDchannel_ClientFlag flag); - template < typename PeerType, typename = typename PeerType::FullFlags::Change> diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index c222d8709..749c821a6 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -620,7 +620,7 @@ not_null Session::processChat(const MTPChat &data) { if (const auto migratedTo = data.vmigrated_to()) { migratedTo->match([&](const MTPDinputChannel &input) { const auto channel = this->channel(input.vchannel_id().v); - channel->addFlags(MTPDchannel::Flag::f_megagroup); + channel->addFlags(ChannelDataFlag::Megagroup); if (!channel->access) { channel->setAccessHash(input.vaccess_hash().v); } @@ -695,21 +695,8 @@ not_null Session::processChat(const MTPChat &data) { } else { channel->setDefaultRestrictions(ChatRestrictions()); } - const auto callFlag = MTPDchannel::Flag::f_call_not_empty; - const auto callNotEmpty = (data.vflags().v & callFlag) - || (channel->groupCall() - && channel->groupCall()->fullCount() > 0); + if (minimal) { - auto mask = 0 - | MTPDchannel::Flag::f_broadcast - | MTPDchannel::Flag::f_verified - | MTPDchannel::Flag::f_megagroup - | MTPDchannel::Flag::f_call_active - | MTPDchannel::Flag::f_call_not_empty - | MTPDchannel_ClientFlag::f_forbidden; - channel->setFlags((channel->flags() & ~mask) - | (data.vflags().v & mask) - | (callNotEmpty ? callFlag : MTPDchannel::Flag(0))); if (channel->input.type() == mtpc_inputPeerEmpty || channel->inputChannel.type() == mtpc_inputChannelEmpty) { channel->setAccessHash(data.vaccess_hash().value_or_empty()); @@ -737,10 +724,48 @@ not_null Session::processChat(const MTPChat &data) { } else { channel->setUnavailableReasons({}); } - channel->setFlags(data.vflags().v - | (callNotEmpty ? callFlag : MTPDchannel::Flag(0))); } + using Flag = ChannelDataFlag; + const auto flagsMask = Flag::Broadcast + | Flag::Verified + | Flag::Scam + | Flag::Fake + | Flag::Megagroup + | Flag::Gigagroup + | Flag::Username + | Flag::Signatures + | Flag::HasLink + | Flag::SlowmodeEnabled + | Flag::CallActive + | Flag::CallNotEmpty + | Flag::Forbidden + | (!minimal + ? Flag::Left + | Flag::Creator + : Flag()); + const auto flagsSet = (data.is_broadcast() ? Flag::Broadcast : Flag()) + | (data.is_verified() ? Flag::Verified : Flag()) + | (data.is_scam() ? Flag::Scam : Flag()) + | (data.is_fake() ? Flag::Fake : Flag()) + | (data.is_megagroup() ? Flag::Megagroup : Flag()) + | (data.is_gigagroup() ? Flag::Gigagroup : Flag()) + | (data.vusername() ? Flag::Username : Flag()) + | (data.is_signatures() ? Flag::Signatures : Flag()) + | (data.is_has_link() ? Flag::HasLink : Flag()) + | (data.is_slowmode_enabled() ? Flag::SlowmodeEnabled : Flag()) + | (data.is_call_active() ? Flag::CallActive : Flag()) + | ((data.is_call_not_empty() + || (channel->groupCall() + && channel->groupCall()->fullCount() > 0)) + ? Flag::CallNotEmpty + : Flag()) + | (!minimal + ? (data.is_left() ? Flag::Left : Flag()) + | (data.is_creator() ? Flag::Creator : Flag()) + : Flag()); + channel->setFlags((channel->flags() & ~flagsMask) | flagsSet); + channel->setName( qs(data.vtitle()), TextUtilities::SingleLine(qs(data.vusername().value_or_empty()))); @@ -763,8 +788,14 @@ not_null Session::processChat(const MTPChat &data) { auto canViewMembers = channel->canViewMembers(); auto canAddMembers = channel->canAddMembers(); - auto mask = mtpCastFlags(MTPDchannelForbidden::Flag::f_broadcast | MTPDchannelForbidden::Flag::f_megagroup); - channel->setFlags((channel->flags() & ~mask) | (mtpCastFlags(data.vflags()) & mask) | MTPDchannel_ClientFlag::f_forbidden); + using Flag = ChannelDataFlag; + const auto flagsMask = Flag::Broadcast + | Flag::Megagroup + | Flag::Forbidden; + const auto flagsSet = (data.is_broadcast() ? Flag::Broadcast : Flag()) + | (data.is_megagroup() ? Flag::Megagroup : Flag()) + | Flag::Forbidden; + channel->setFlags((channel->flags() & ~flagsMask) | flagsSet); if (channel->hasAdminRights()) { channel->setAdminRights(ChatAdminRights()); @@ -954,7 +985,7 @@ void Session::deleteConversationLocally(not_null peer) { : History::ClearType::DeleteChat); } if (const auto channel = peer->asMegagroup()) { - channel->addFlags(MTPDchannel::Flag::f_left); + channel->addFlags(ChannelDataFlag::Left); if (const auto from = channel->getMigrateFromChat()) { if (const auto migrated = historyLoaded(from)) { migrated->updateChatListExistence(); diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index e1897cc6a..1564394e4 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -988,7 +988,7 @@ void History::applyServiceChanges( } }, [&](const MTPDmessageActionChannelMigrateFrom &data) { if (const auto channel = peer->asChannel()) { - channel->addFlags(MTPDchannel::Flag::f_megagroup); + channel->addFlags(ChannelDataFlag::Megagroup); if (const auto chat = owner().chatLoaded(data.vchat_id().v)) { Data::ApplyMigration(chat, channel); } diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 6ee57cfb4..5d73a4dc3 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -789,7 +789,7 @@ bool HistoryMessage::checkCommentsLinkedChat(ChannelId id) const { return true; } else if (const auto channel = history()->peer->asChannel()) { if (channel->linkedChatKnown() - || !(channel->flags() & MTPDchannel::Flag::f_has_link)) { + || !(channel->flags() & ChannelDataFlag::HasLink)) { const auto linked = channel->linkedChat(); if (!linked || peerToChannel(linked->id) != id) { return false; diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 05c203c74..d9f8190c6 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -50,7 +50,7 @@ constexpr auto kPinnedMessageTextLimit = 16; } else if (const auto chat = peer->asChat()) { return !(chat->flags() & ChatDataFlag::CallActive); } else if (const auto channel = peer->asChannel()) { - return !(channel->flags() & MTPDchannel::Flag::f_call_active); + return !(channel->flags() & ChannelDataFlag::CallActive); } return true; } diff --git a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp index 47721a2e8..20964ce55 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_actions.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_actions.cpp @@ -767,9 +767,9 @@ object_ptr SetupChannelMembers( auto membersShown = rpl::combine( MembersCountValue(channel), - Data::PeerFullFlagValue( + Data::PeerFlagValue( channel, - MTPDchannelFull::Flag::f_can_view_participants), + ChannelDataFlag::CanViewParticipants), (_1 > 0) && _2); auto membersText = tr::lng_chat_status_subscribers( lt_count_decimal, diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index 0b72e32df..2d076d957 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -380,13 +380,13 @@ template rpl::producer BadgeValueFromFlags(Peer peer) { return Data::PeerFlagsValue( peer, - Flag::f_verified | Flag::f_scam | Flag::f_fake + Flag::Verified | Flag::Scam | Flag::Fake ) | rpl::map([=](base::flags value) { - return (value & Flag::f_verified) + return (value & Flag::Verified) ? Badge::Verified - : (value & Flag::f_scam) + : (value & Flag::Scam) ? Badge::Scam - : (value & Flag::f_fake) + : (value & Flag::Fake) ? Badge::Fake : Badge::None; }); @@ -394,21 +394,9 @@ rpl::producer BadgeValueFromFlags(Peer peer) { rpl::producer BadgeValue(not_null peer) { if (const auto user = peer->asUser()) { - using Flag = UserDataFlag; - return Data::PeerFlagsValue( - user, - Flag::Verified | Flag::Scam | Flag::Fake - ) | rpl::map([=](base::flags value) { - return (value & Flag::Verified) - ? Badge::Verified - : (value & Flag::Scam) - ? Badge::Scam - : (value & Flag::Fake) - ? Badge::Fake - : Badge::None; - }); + return BadgeValueFromFlags(user); } else if (const auto channel = peer->asChannel()) { - return BadgeValueFromFlags(channel); + return BadgeValueFromFlags(channel); } return rpl::single(Badge::None); } diff --git a/Telegram/SourceFiles/mtproto/type_utils.h b/Telegram/SourceFiles/mtproto/type_utils.h index d2175e2eb..173872a96 100644 --- a/Telegram/SourceFiles/mtproto/type_utils.h +++ b/Telegram/SourceFiles/mtproto/type_utils.h @@ -112,12 +112,3 @@ enum class MTPDstickerSet_ClientFlag : uint32 { MIN_FIELD = (1U << 27), }; DEFINE_MTP_CLIENT_FLAGS(MTPDstickerSet) - -enum class MTPDchannel_ClientFlag : uint32 { - // forbidden constructor received - f_forbidden = (1U << 31), - - // update this when adding new client side flags - MIN_FIELD = (1U << 31), -}; -DEFINE_MTP_CLIENT_FLAGS(MTPDchannel) diff --git a/Telegram/SourceFiles/storage/serialize_peer.cpp b/Telegram/SourceFiles/storage/serialize_peer.cpp index cc30c74db..499ca252b 100644 --- a/Telegram/SourceFiles/storage/serialize_peer.cpp +++ b/Telegram/SourceFiles/storage/serialize_peer.cpp @@ -326,7 +326,6 @@ PeerData *readPeer( Conversion{ Saved::f_call_active, Flag::CallActive }, Conversion{ Saved::f_call_not_empty, Flag::CallNotEmpty }, }; - auto flagsMask = Flag() | Flag(); auto flagsSet = Flag() | Flag(); if (streamAppVersion >= 9012) { @@ -359,13 +358,17 @@ PeerData *readPeer( quint64 access; qint32 date, version, oldForbidden; quint32 flags; - stream >> name >> access >> date >> version >> oldForbidden >> flags >> inviteLink; + stream + >> name + >> access + >> date + >> version + >> oldForbidden + >> flags + >> inviteLink; userpicAccessHash = access; - if (oldForbidden) { - flags |= quint32(MTPDchannel_ClientFlag::f_forbidden); - } if (apply) { channel->setName(name, QString()); channel->access = access; @@ -375,7 +378,48 @@ PeerData *readPeer( // So we don't restore the version field, info is still unknown. channel->setVersion(0); - channel->setFlags(MTPDchannel::Flags::from_raw(flags)); + if (streamAppVersion >= 2008007) { + channel->setFlags(ChannelDataFlags::from_raw(flags)); + } else { + using Saved = MTPDchannel::Flag; + using Flag = ChannelDataFlag; + struct Conversion { + Saved saved; + Flag flag; + }; + const auto conversions = { + Conversion{ Saved::f_broadcast, Flag::Broadcast }, + Conversion{ Saved::f_verified, Flag::Verified}, + Conversion{ Saved::f_scam, Flag::Scam}, + Conversion{ Saved::f_fake, Flag::Fake}, + Conversion{ Saved::f_megagroup, Flag::Megagroup}, + Conversion{ Saved::f_gigagroup, Flag::Gigagroup}, + Conversion{ Saved::f_username, Flag::Username}, + Conversion{ Saved::f_signatures, Flag::Signatures}, + Conversion{ Saved::f_has_link, Flag::HasLink}, + Conversion{ + Saved::f_slowmode_enabled, + Flag::SlowmodeEnabled }, + Conversion{ Saved::f_call_active, Flag::CallActive }, + Conversion{ Saved::f_call_not_empty, Flag::CallNotEmpty }, + Conversion{ Saved(1U << 31), Flag::Forbidden }, + Conversion{ Saved::f_left, Flag::Left }, + Conversion{ Saved::f_creator, Flag::Creator }, + }; + auto flagsMask = Flag() | Flag(); + auto flagsSet = Flag() | Flag(); + for (const auto &conversion : conversions) { + flagsMask |= conversion.flag; + if (flags & int(conversion.saved)) { + flagsSet |= conversion.flag; + } + } + if (oldForbidden) { + flagsSet |= Flag::Forbidden; + } + channel->setFlags((channel->flags() & ~flagsMask) | flagsSet); + } + channel->setInviteLink(inviteLink); // #TODO ids