Don't use MTP* for PeerSettings flags.

This commit is contained in:
John Preston 2021-07-08 17:30:27 +03:00
parent 878c890bc2
commit f22e68fc32
8 changed files with 55 additions and 52 deletions

View File

@ -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;

View File

@ -1224,9 +1224,7 @@ void ApiWrap::requestPeerSettings(not_null<PeerData*> 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);

View File

@ -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(

View File

@ -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();

View File

@ -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<PeerSetting>;
class PeerData {
protected:
PeerData(not_null<Data::Session*> 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<PeerSettings>;
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;

View File

@ -192,11 +192,7 @@ void ApplyUserUpdate(not_null<UserData*> 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());

View File

@ -40,15 +40,14 @@ bool BarCurrentlyHidden(not_null<PeerData*> 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<Ui::RpWidget*> parent) {
auto ContactStatus::PeerState(not_null<PeerData*> peer)
-> rpl::producer<State> {
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<PeerData*> 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<PeerData*> 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<PeerData*> 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());

View File

@ -834,10 +834,9 @@ void PeerMenuBlockUserBox(
not_null<PeerData*> peer,
std::variant<v::null_t, bool> suggestReport,
std::variant<v::null_t, ClearChat, ClearReply> 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<bool>(suggestReport);
const auto user = peer->asUser();