diff --git a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp index 6ad1c9efc..74aecd992 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp @@ -106,7 +106,7 @@ std::unique_ptr InviteController::createRow( if (!user || user->isSelf() || user->isBot() - || (user->flags() & MTPDuser::Flag::f_deleted)) { + || user->isInaccessible()) { return nullptr; } auto result = std::make_unique(user); diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 1f757e25b..54d42a149 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -498,7 +498,7 @@ QString PeerData::computeUnavailableReason() const { // This is duplicated in CanPinMessagesValue(). bool PeerData::canPinMessages() const { if (const auto user = asUser()) { - return user->fullFlags() & MTPDuserFull::Flag::f_can_pin_message; + return user->flags() & UserDataFlag::CanPinMessages; } else if (const auto chat = asChat()) { return chat->amIn() && !chat->amRestricted(ChatRestriction::PinMessages); @@ -1000,11 +1000,11 @@ void PeerData::setIsBlocked(bool is) { if (_blockStatus != status) { _blockStatus = status; if (const auto user = asUser()) { - const auto flags = user->fullFlags(); + const auto flags = user->flags(); if (is) { - user->setFullFlags(flags | MTPDuserFull::Flag::f_blocked); + user->setFlags(flags | UserDataFlag::Blocked); } else { - user->setFullFlags(flags & ~MTPDuserFull::Flag::f_blocked); + user->setFlags(flags & ~UserDataFlag::Blocked); } } session().changes().peerUpdated(this, UpdateFlag::IsBlocked); diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index 227a236c1..e541e66db 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -175,7 +175,7 @@ rpl::producer CanWriteValue(UserData *user) { if (user->isRepliesChat()) { return rpl::single(false); } - return PeerFlagValue(user, MTPDuser::Flag::f_deleted) + return PeerFlagValue(user, UserDataFlag::Deleted) | rpl::map(!_1); } @@ -260,10 +260,10 @@ rpl::producer CanWriteValue(not_null peer) { rpl::producer CanPinMessagesValue(not_null peer) { using namespace rpl::mappers; if (const auto user = peer->asUser()) { - return PeerFullFlagsValue( + return PeerFlagsValue( user, - MTPDuserFull::Flag::f_can_pin_message - ) | rpl::map(_1 != MTPDuserFull::Flag(0)); + UserDataFlag::CanPinMessages + ) | rpl::map(_1 != UserDataFlag(0)); } else if (const auto chat = peer->asChat()) { const auto mask = 0 | MTPDchat::Flag::f_deactivated diff --git a/Telegram/SourceFiles/data/data_peer_values.h b/Telegram/SourceFiles/data/data_peer_values.h index 24605bf07..2b6df7f15 100644 --- a/Telegram/SourceFiles/data/data_peer_values.h +++ b/Telegram/SourceFiles/data/data_peer_values.h @@ -64,12 +64,6 @@ inline auto PeerFlagValue( typename PeerType::Flags::Enum flag) { return SingleFlagValue(PeerFlagsValue(peer), flag); } -// -//inline auto PeerFlagValue( -// UserData *user, -// MTPDuser_ClientFlag flag) { -// return PeerFlagValue(user, static_cast(flag)); -//} rpl::producer PeerFlagValue( ChatData *chat, diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index c7ca2310a..d7ef3ae58 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -392,8 +392,7 @@ not_null Session::processUser(const MTPUser &data) { result->inputUser = MTP_inputUser(data.vid(), MTP_long(0)); result->setName(tr::lng_deleted(tr::now), QString(), QString(), QString()); result->setPhoto(MTP_userProfilePhotoEmpty()); - //result->setFlags(MTPDuser_ClientFlag::f_inaccessible | 0); - result->setFlags(MTPDuser::Flag::f_deleted); + result->setFlags(UserDataFlag::Deleted); if (!result->phone().isEmpty()) { result->setPhone(QString()); flags |= UpdateFlag::PhoneNumber; @@ -408,11 +407,30 @@ not_null Session::processUser(const MTPUser &data) { minimal = data.is_min(); const auto canShareThisContact = result->canShareThisContactFast(); + + using Flag = UserDataFlag; + const auto flagsMask = Flag::Deleted + | Flag::Verified + | Flag::Scam + | Flag::Fake + | Flag::BotInlineGeo + | Flag::Support + | (!minimal + ? Flag::Contact + | Flag::MutualContact + : Flag()); + const auto flagsSet = (data.is_deleted() ? Flag::Deleted : Flag()) + | (data.is_verified() ? Flag::Verified : Flag()) + | (data.is_scam() ? Flag::Scam : Flag()) + | (data.is_fake() ? Flag::Fake : Flag()) + | (data.is_bot_inline_geo() ? Flag::BotInlineGeo : Flag()) + | (data.is_support() ? Flag::Support : Flag()) + | (!minimal + ? (data.is_contact() ? Flag::Contact : Flag()) + | (data.is_mutual_contact() ? Flag::MutualContact : Flag()) + : Flag()); + result->setFlags((result->flags() & ~flagsMask) | flagsSet); if (minimal) { - const auto mask = 0 - //| MTPDuser_ClientFlag::f_inaccessible - | MTPDuser::Flag::f_deleted; - result->setFlags((result->flags() & ~mask) | (data.vflags().v & mask)); if (result->input.type() == mtpc_inputPeerEmpty) { result->input = MTP_inputPeerUser( data.vid(), @@ -424,7 +442,6 @@ not_null Session::processUser(const MTPUser &data) { MTP_long(data.vaccess_hash().value_or_empty())); } } else { - result->setFlags(data.vflags().v); if (data.is_self()) { result->input = MTP_inputPeerSelf(); result->inputUser = MTP_inputUserSelf(); diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index 9cc9a2c65..113e99fae 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -167,8 +167,7 @@ void UserData::madeAction(TimeId when) { void UserData::setAccessHash(uint64 accessHash) { if (accessHash == kInaccessibleAccessHashOld) { _accessHash = 0; -// _flags.add(MTPDuser_ClientFlag::f_inaccessible | 0); - _flags.add(MTPDuser::Flag::f_deleted); + _flags.add(Flag::Deleted); } else { _accessHash = accessHash; } @@ -211,7 +210,16 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { if (const auto pinned = update.vpinned_msg_id()) { SetTopPinnedMessageId(user, pinned->v); } - user->setFullFlags(update.vflags().v); + using Flag = UserDataFlag; + const auto mask = Flag::Blocked + | Flag::HasPhoneCalls + | Flag::PhoneCallsPrivate + | Flag::CanPinMessages; + user->setFlags((user->flags() & ~mask) + | (update.is_phone_calls_private() ? Flag::PhoneCallsPrivate : Flag()) + | (update.is_phone_calls_available() ? Flag::HasPhoneCalls : Flag()) + | (update.is_can_pin_message() ? Flag::CanPinMessages : Flag()) + | (update.is_blocked() ? Flag::Blocked : Flag())); user->setIsBlocked(update.is_blocked()); user->setCallsStatus(update.is_phone_calls_private() ? UserData::CallsStatus::Private diff --git a/Telegram/SourceFiles/data/data_user.h b/Telegram/SourceFiles/data/data_user.h index 0bff340b2..c313bdded 100644 --- a/Telegram/SourceFiles/data/data_user.h +++ b/Telegram/SourceFiles/data/data_user.h @@ -23,32 +23,27 @@ struct BotInfo { Dialogs::EntryState inlineReturnTo; }; +enum class UserDataFlag { + Contact = (1 << 0), + MutualContact = (1 << 1), + Deleted = (1 << 2), + Verified = (1 << 3), + Scam = (1 << 4), + Fake = (1 << 5), + BotInlineGeo = (1 << 6), + Blocked = (1 << 7), + HasPhoneCalls = (1 << 8), + PhoneCallsPrivate = (1 << 9), + Support = (1 << 10), + CanPinMessages = (1 << 11), +}; +inline constexpr bool is_flag_type(UserDataFlag) { return true; }; +using UserDataFlags = base::flags; + class UserData : public PeerData { public: - static constexpr auto kEssentialFlags = 0 - | MTPDuser::Flag::f_self - | MTPDuser::Flag::f_contact - | MTPDuser::Flag::f_mutual_contact - | MTPDuser::Flag::f_deleted - | MTPDuser::Flag::f_bot - | MTPDuser::Flag::f_bot_chat_history - | MTPDuser::Flag::f_bot_nochats - | MTPDuser::Flag::f_verified - | MTPDuser::Flag::f_scam - | MTPDuser::Flag::f_fake - | MTPDuser::Flag::f_restricted - | MTPDuser::Flag::f_bot_inline_geo; - using Flags = Data::Flags< - MTPDuser::Flags, - kEssentialFlags.value()>; - - static constexpr auto kEssentialFullFlags = 0 - | MTPDuserFull::Flag::f_blocked - | MTPDuserFull::Flag::f_phone_calls_available - | MTPDuserFull::Flag::f_phone_calls_private; - using FullFlags = Data::Flags< - MTPDuserFull::Flags, - kEssentialFullFlags.value()>; + using Flag = UserDataFlag; + using Flags = Data::Flags; UserData(not_null owner, PeerId id); void setPhoto(const MTPUserProfilePhoto &photo); @@ -72,13 +67,13 @@ public: } void setAccessHash(uint64 accessHash); - void setFlags(MTPDuser::Flags which) { + void setFlags(UserDataFlags which) { _flags.set(which); } - void addFlags(MTPDuser::Flags which) { + void addFlags(UserDataFlags which) { _flags.add(which); } - void removeFlags(MTPDuser::Flags which) { + void removeFlags(UserDataFlags which) { _flags.remove(which); } auto flags() const { @@ -88,45 +83,26 @@ public: return _flags.value(); } - void setFullFlags(MTPDuserFull::Flags which) { - _fullFlags.set(which); - } - void addFullFlags(MTPDuserFull::Flags which) { - _fullFlags.add(which); - } - void removeFullFlags(MTPDuserFull::Flags which) { - _fullFlags.remove(which); - } - [[nodiscard]] auto fullFlags() const { - return _fullFlags.current(); - } - [[nodiscard]] auto fullFlagsValue() const { - return _fullFlags.value(); - } - [[nodiscard]] bool isVerified() const { - return flags() & MTPDuser::Flag::f_verified; + return flags() & UserDataFlag::Verified; } [[nodiscard]] bool isScam() const { - return flags() & MTPDuser::Flag::f_scam; + return flags() & UserDataFlag::Scam; } [[nodiscard]] bool isFake() const { - return flags() & MTPDuser::Flag::f_fake; + return flags() & UserDataFlag::Fake; } [[nodiscard]] bool isBotInlineGeo() const { - return flags() & MTPDuser::Flag::f_bot_inline_geo; + return flags() & UserDataFlag::BotInlineGeo; } [[nodiscard]] bool isBot() const { return botInfo != nullptr; } [[nodiscard]] bool isSupport() const { - return flags() & MTPDuser::Flag::f_support; + return flags() & UserDataFlag::Support; } [[nodiscard]] bool isInaccessible() const { - constexpr auto inaccessible = 0 - | MTPDuser::Flag::f_deleted; -// | MTPDuser_ClientFlag::f_inaccessible; - return flags() & inaccessible; + return flags() & UserDataFlag::Deleted; } [[nodiscard]] bool canWrite() const { // Duplicated in Data::CanWriteValue(). @@ -197,7 +173,6 @@ private: -> const std::vector & override; Flags _flags; - FullFlags _fullFlags; std::vector _unavailableReasons; QString _phone; diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index ff82aab2d..58361965e 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -2568,7 +2568,7 @@ bool History::clearUnreadOnClientSide() const { return false; } if (const auto user = peer->asUser()) { - if (user->flags() & MTPDuser::Flag::f_deleted) { + if (user->isInaccessible()) { return true; } } diff --git a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp index d3457cee1..d789c3e35 100644 --- a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp +++ b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp @@ -234,28 +234,20 @@ auto ContactStatus::PeerState(not_null peer) using Setting = MTPDpeerSettings::Flag; if (const auto user = peer->asUser()) { using FlagsChange = UserData::Flags::Change; - using FullFlagsChange = UserData::FullFlags::Change; - using Flag = MTPDuser::Flag; - using FullFlag = MTPDuserFull::Flag; + using Flag = UserDataFlag; - auto isContactChanges = user->flagsValue( + auto changes = user->flagsValue( ) | rpl::filter([](FlagsChange flags) { return flags.diff - & (Flag::f_contact | Flag::f_mutual_contact); - }); - auto isBlockedChanges = user->fullFlagsValue( - ) | rpl::filter([](FullFlagsChange full) { - return full.diff & FullFlag::f_blocked; + & (Flag::Contact | Flag::MutualContact | Flag::Blocked); }); return rpl::combine( - std::move(isContactChanges), - std::move(isBlockedChanges), + std::move(changes), user->settingsValue() ) | rpl::map([=]( FlagsChange flags, - FullFlagsChange full, SettingsChange settings) { - if (full.value & FullFlag::f_blocked) { + if (flags.value & Flag::Blocked) { return State::None; } else if (user->isContact()) { if (settings.value & Setting::f_share_contact) { diff --git a/Telegram/SourceFiles/info/profile/info_profile_values.cpp b/Telegram/SourceFiles/info/profile/info_profile_values.cpp index 95869380a..0b72e32df 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_values.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_values.cpp @@ -394,7 +394,19 @@ rpl::producer BadgeValueFromFlags(Peer peer) { rpl::producer BadgeValue(not_null peer) { if (const auto user = peer->asUser()) { - return BadgeValueFromFlags(user); + 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; + }); } else if (const auto channel = peer->asChannel()) { return BadgeValueFromFlags(channel); } diff --git a/Telegram/SourceFiles/storage/serialize_peer.cpp b/Telegram/SourceFiles/storage/serialize_peer.cpp index 2e5064e26..e7c29db43 100644 --- a/Telegram/SourceFiles/storage/serialize_peer.cpp +++ b/Telegram/SourceFiles/storage/serialize_peer.cpp @@ -238,7 +238,31 @@ PeerData *readPeer( user->setPhone(phone); user->setName(first, last, pname, username); - user->setFlags(MTPDuser::Flags::from_raw(flags)); + using Saved = MTPDuser::Flag; + using Flag = UserDataFlag; + struct Conversion { + Saved saved; + Flag flag; + }; + const auto conversions = { + Conversion{ Saved::f_deleted, Flag::Deleted }, + Conversion{ Saved::f_verified, Flag::Verified }, + Conversion{ Saved::f_scam, Flag::Scam }, + Conversion{ Saved::f_fake, Flag::Fake }, + Conversion{ Saved::f_bot_inline_geo, Flag::BotInlineGeo }, + Conversion{ Saved::f_support, Flag::Support }, + Conversion{ Saved::f_contact, Flag::Contact }, + Conversion{ Saved::f_mutual_contact, Flag::MutualContact }, + }; + auto flagsMask = Flag() | Flag(); + auto flagsSet = Flag() | Flag(); + for (const auto &conversion : conversions) { + flagsMask |= conversion.flag; + if (flags & int(conversion.saved)) { + flagsSet |= conversion.flag; + } + } + user->setFlags((user->flags() & ~flagsMask) | flagsSet); user->setAccessHash(access); user->onlineTill = onlineTill; user->setIsContact(contact == 1);