diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index f66dd0f960..da5d254f36 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1817,11 +1817,7 @@ void Updates::feedUpdate(const MTPUpdate &update) { const auto &d = update.c_updatePeerSettings(); const auto peerId = peerFromMTP(d.vpeer()); if (const auto peer = session().data().peerLoaded(peerId)) { - const auto settings = d.vsettings().match([]( - const MTPDpeerSettings &data) { - return data.vflags().v; - }); - peer->setSettings(settings); + peer->setSettings(d.vsettings()); } } break; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 5bab9a03e6..cfa7589c00 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -1224,9 +1224,7 @@ void ApiWrap::requestPeerSettings(not_null peer) { request(MTPmessages_GetPeerSettings( peer->input )).done([=](const MTPPeerSettings &result) { - peer->setSettings(result.match([&](const MTPDpeerSettings &data) { - return data.vflags().v; - })); + peer->setSettings(result); _requestedPeerSettings.erase(peer); }).fail([=](const MTP::Error &error) { _requestedPeerSettings.erase(peer); diff --git a/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp index 32689d28b6..26feabcb13 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_contact_box.cpp @@ -60,10 +60,9 @@ void SendRequest( user->username); user->session().api().applyUpdates(result); if (const auto settings = user->settings()) { - using Flag = MTPDpeerSettings::Flag; - const auto flags = Flag::f_add_contact - | Flag::f_block_contact - | Flag::f_report_spam; + const auto flags = PeerSetting::AddContact + | PeerSetting::BlockContact + | PeerSetting::ReportSpam; user->setSettings(*settings & ~flags); } if (box) { @@ -241,9 +240,8 @@ void Controller::setupWarning() { void Controller::setupSharePhoneNumber() { const auto settings = _user->settings(); - using Setting = MTPDpeerSettings::Flag; if (!settings - || !((*settings) & Setting::f_need_contacts_exception)) { + || !((*settings) & PeerSetting::NeedContactsException)) { return; } _sharePhone = _box->addRow( diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index cf018f81c1..25f2eb0f76 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -574,6 +574,22 @@ void PeerData::checkFolder(FolderId folderId) { } } +void PeerData::setSettings(const MTPPeerSettings &data) { + data.match([&](const MTPDpeerSettings &data) { + using Flag = PeerSetting; + setSettings((data.is_add_contact() ? Flag::AddContact : Flag()) + | (data.is_autoarchived() ? Flag::AutoArchived : Flag()) + | (data.is_block_contact() ? Flag::BlockContact : Flag()) + //| (data.is_invite_members() ? Flag::InviteMembers : Flag()) + | (data.is_need_contacts_exception() + ? Flag::NeedContactsException + : Flag()) + //| (data.is_report_geo() ? Flag::ReportGeo : Flag()) + | (data.is_report_spam() ? Flag::ReportSpam : Flag()) + | (data.is_share_contact() ? Flag::ShareContact : Flag())); + }); +} + void PeerData::fillNames() { _nameWords.clear(); _nameFirstLetters.clear(); diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 30a2299cff..db621dadf0 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -188,25 +188,26 @@ private: }; -class PeerData { -private: - static constexpr auto kSettingsUnknown = MTPDpeerSettings::Flag(1U << 9); +enum class PeerSetting { + ReportSpam = (1 << 0), + AddContact = (1 << 1), + BlockContact = (1 << 2), + ShareContact = (1 << 3), + NeedContactsException = (1 << 4), + AutoArchived = (1 << 5), + Unknown = (1 << 6), +}; +inline constexpr bool is_flag_type(PeerSetting) { return true; }; +using PeerSettings = base::flags; +class PeerData { protected: PeerData(not_null owner, PeerId id); PeerData(const PeerData &other) = delete; PeerData &operator=(const PeerData &other) = delete; public: - static constexpr auto kEssentialSettings = 0 - | MTPDpeerSettings::Flag::f_report_spam - | MTPDpeerSettings::Flag::f_add_contact - | MTPDpeerSettings::Flag::f_block_contact - | MTPDpeerSettings::Flag::f_share_contact - | kSettingsUnknown; - using Settings = Data::Flags< - MTPDpeerSettings::Flags, - kEssentialSettings.value()>; + using Settings = Data::Flags; virtual ~PeerData(); @@ -414,20 +415,22 @@ public: void checkFolder(FolderId folderId); - void setSettings(MTPDpeerSettings::Flags which) { + void setSettings(PeerSettings which) { _settings.set(which); } auto settings() const { - return (_settings.current() & kSettingsUnknown) + return (_settings.current() & PeerSetting::Unknown) ? std::nullopt : std::make_optional(_settings.current()); } auto settingsValue() const { - return (_settings.current() & kSettingsUnknown) + return (_settings.current() & PeerSetting::Unknown) ? _settings.changes() : (_settings.value() | rpl::type_erased()); } + void setSettings(const MTPPeerSettings &data); + enum class BlockStatus : char { Unknown, Blocked, @@ -503,7 +506,7 @@ private: TimeId _ttlPeriod = 0; bool _hasPinnedMessages = false; - Settings _settings = { kSettingsUnknown }; + Settings _settings = PeerSettings(PeerSetting::Unknown); BlockStatus _blockStatus = BlockStatus::Unknown; LoadedStatus _loadedStatus = LoadedStatus::Not; diff --git a/Telegram/SourceFiles/data/data_user.cpp b/Telegram/SourceFiles/data/data_user.cpp index 113e99fae3..2fb9981c1b 100644 --- a/Telegram/SourceFiles/data/data_user.cpp +++ b/Telegram/SourceFiles/data/data_user.cpp @@ -192,11 +192,7 @@ void ApplyUserUpdate(not_null user, const MTPDuserFull &update) { if (const auto photo = update.vprofile_photo()) { user->owner().processPhoto(*photo); } - const auto settings = update.vsettings().match([&]( - const MTPDpeerSettings &data) { - return data.vflags().v; - }); - user->setSettings(settings); + user->setSettings(update.vsettings()); user->session().api().applyNotifySettings( MTP_inputNotifyPeer(user->input), update.vnotify_settings()); diff --git a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp index d789c3e358..a259a9a59a 100644 --- a/Telegram/SourceFiles/history/view/history_view_contact_status.cpp +++ b/Telegram/SourceFiles/history/view/history_view_contact_status.cpp @@ -40,15 +40,14 @@ bool BarCurrentlyHidden(not_null peer) { } else if (!(*settings)) { return true; } - using Setting = MTPDpeerSettings::Flag; if (const auto user = peer->asUser()) { if (user->isBlocked()) { return true; } else if (user->isContact() - && !((*settings) & Setting::f_share_contact)) { + && !((*settings) & PeerSetting::ShareContact)) { return true; } - } else if (!((*settings) & Setting::f_report_spam)) { + } else if (!((*settings) & PeerSetting::ReportSpam)) { return true; } return false; @@ -231,7 +230,6 @@ void ContactStatus::setupWidgets(not_null parent) { auto ContactStatus::PeerState(not_null peer) -> rpl::producer { using SettingsChange = PeerData::Settings::Change; - using Setting = MTPDpeerSettings::Flag; if (const auto user = peer->asUser()) { using FlagsChange = UserData::Flags::Change; using Flag = UserDataFlag; @@ -250,16 +248,16 @@ auto ContactStatus::PeerState(not_null peer) if (flags.value & Flag::Blocked) { return State::None; } else if (user->isContact()) { - if (settings.value & Setting::f_share_contact) { + if (settings.value & PeerSetting::ShareContact) { return State::SharePhoneNumber; } else { return State::None; } - } else if (settings.value & Setting::f_autoarchived) { + } else if (settings.value & PeerSetting::AutoArchived) { return State::UnarchiveOrBlock; - } else if (settings.value & Setting::f_block_contact) { + } else if (settings.value & PeerSetting::BlockContact) { return State::AddOrBlock; - } else if (settings.value & Setting::f_add_contact) { + } else if (settings.value & PeerSetting::AddContact) { return State::Add; } else { return State::None; @@ -269,9 +267,9 @@ auto ContactStatus::PeerState(not_null peer) return peer->settingsValue( ) | rpl::map([=](SettingsChange settings) { - return (settings.value & Setting::f_autoarchived) + return (settings.value & PeerSetting::AutoArchived) ? State::UnarchiveOrReport - : (settings.value & Setting::f_report_spam) + : (settings.value & PeerSetting::ReportSpam) ? State::ReportSpam : State::None; }); @@ -362,10 +360,9 @@ void ContactStatus::setupUnarchiveHandler(not_null peer) { Window::ToggleHistoryArchived(peer->owner().history(peer), false); peer->owner().resetNotifySettingsToDefault(peer); if (const auto settings = peer->settings()) { - using Flag = MTPDpeerSettings::Flag; - const auto flags = Flag::f_autoarchived - | Flag::f_block_contact - | Flag::f_report_spam; + const auto flags = PeerSetting::AutoArchived + | PeerSetting::BlockContact + | PeerSetting::ReportSpam; peer->setSettings(*settings & ~flags); } }, _bar.lifetime()); diff --git a/Telegram/SourceFiles/window/window_peer_menu.cpp b/Telegram/SourceFiles/window/window_peer_menu.cpp index 6bc4deae8a..78bfcd0233 100644 --- a/Telegram/SourceFiles/window/window_peer_menu.cpp +++ b/Telegram/SourceFiles/window/window_peer_menu.cpp @@ -834,10 +834,9 @@ void PeerMenuBlockUserBox( not_null peer, std::variant suggestReport, std::variant suggestClear) { - using Flag = MTPDpeerSettings::Flag; - const auto settings = peer->settings().value_or(Flag(0)); + const auto settings = peer->settings().value_or(PeerSettings(0)); const auto reportNeeded = v::is_null(suggestReport) - ? ((settings & Flag::f_report_spam) != 0) + ? ((settings & PeerSetting::ReportSpam) != 0) : v::get(suggestReport); const auto user = peer->asUser();