Don't use MTP* for UserData flags.

This commit is contained in:
John Preston 2021-07-08 14:19:12 +03:00
parent 2ffda9f240
commit e34375405e
11 changed files with 116 additions and 94 deletions

View file

@ -106,7 +106,7 @@ std::unique_ptr<PeerListRow> InviteController::createRow(
if (!user
|| user->isSelf()
|| user->isBot()
|| (user->flags() & MTPDuser::Flag::f_deleted)) {
|| user->isInaccessible()) {
return nullptr;
}
auto result = std::make_unique<PeerListRow>(user);

View file

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

View file

@ -175,7 +175,7 @@ rpl::producer<bool> 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<bool> CanWriteValue(not_null<PeerData*> peer) {
rpl::producer<bool> CanPinMessagesValue(not_null<PeerData*> 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

View file

@ -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<MTPDuser::Flag>(flag));
//}
rpl::producer<bool> PeerFlagValue(
ChatData *chat,

View file

@ -392,8 +392,7 @@ not_null<UserData*> 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<UserData*> 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<UserData*> 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();

View file

@ -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<UserData*> 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

View file

@ -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<UserDataFlag>;
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<UserDataFlags>;
UserData(not_null<Data::Session*> 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<Data::UnavailableReason> & override;
Flags _flags;
FullFlags _fullFlags;
std::vector<Data::UnavailableReason> _unavailableReasons;
QString _phone;

View file

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

View file

@ -234,28 +234,20 @@ auto ContactStatus::PeerState(not_null<PeerData*> 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) {

View file

@ -394,7 +394,19 @@ rpl::producer<Badge> BadgeValueFromFlags(Peer peer) {
rpl::producer<Badge> BadgeValue(not_null<PeerData*> peer) {
if (const auto user = peer->asUser()) {
return BadgeValueFromFlags<MTPDuser::Flag>(user);
using Flag = UserDataFlag;
return Data::PeerFlagsValue(
user,
Flag::Verified | Flag::Scam | Flag::Fake
) | rpl::map([=](base::flags<Flag> 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<MTPDchannel::Flag>(channel);
}

View file

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