mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-15 21:57:10 +02:00
Don't use MTP* for UserData flags.
This commit is contained in:
parent
2ffda9f240
commit
e34375405e
11 changed files with 116 additions and 94 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue