mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 06:07:06 +02:00
Don't use MTP* for ChannelData flags.
This commit is contained in:
parent
5040c2e766
commit
a74228acea
18 changed files with 209 additions and 178 deletions
|
@ -1000,7 +1000,7 @@ void Updates::handleSendActionUpdate(
|
|||
const auto channel = peer->asChannel();
|
||||
const auto active = chat
|
||||
? (chat->flags() & ChatDataFlag::CallActive)
|
||||
: (channel->flags() & MTPDchannel::Flag::f_call_active);
|
||||
: (channel->flags() & ChannelDataFlag::CallActive);
|
||||
if (active) {
|
||||
_pendingSpeakingCallParticipants.emplace(
|
||||
peer).first->second[fromId] = now;
|
||||
|
|
|
@ -1963,7 +1963,7 @@ void ParticipantsBoxController::subscribeToCreatorChange(
|
|||
const auto isCreator = channel->amCreator();
|
||||
channel->flagsValue(
|
||||
) | rpl::filter([](const ChannelData::Flags::Change &change) {
|
||||
return (change.diff & MTPDchannel::Flag::f_creator);
|
||||
return (change.diff & ChannelDataFlag::Creator);
|
||||
}) | rpl::filter([=] {
|
||||
return (isCreator != channel->amCreator());
|
||||
}) | rpl::start_with_next([=] {
|
||||
|
|
|
@ -1471,9 +1471,9 @@ void Controller::togglePreHistoryHidden(
|
|||
// Update in the result doesn't contain the
|
||||
// channelFull:flags field which holds this value.
|
||||
// So after saving we need to update it manually.
|
||||
const auto flags = channel->fullFlags();
|
||||
const auto flag = MTPDchannelFull::Flag::f_hidden_prehistory;
|
||||
channel->setFullFlags(hidden ? (flags | flag) : (flags & ~flag));
|
||||
const auto flags = channel->flags();
|
||||
const auto flag = ChannelDataFlag::PreHistoryHidden;
|
||||
channel->setFlags(hidden ? (flags | flag) : (flags & ~flag));
|
||||
|
||||
done();
|
||||
};
|
||||
|
|
|
@ -1656,7 +1656,7 @@ void Members::setupAddMember(not_null<GroupCall*> call) {
|
|||
) | rpl::map([=] {
|
||||
return Data::PeerFlagValue(
|
||||
channel,
|
||||
MTPDchannel::Flag::f_username);
|
||||
ChannelDataFlag::Username);
|
||||
}) | rpl::flatten_latest());
|
||||
} else {
|
||||
_canAddMembers = Data::CanWriteValue(peer.get());
|
||||
|
|
|
@ -58,14 +58,14 @@ ChannelData::ChannelData(not_null<Data::Session*> owner, PeerId id)
|
|||
_flags.changes(
|
||||
) | rpl::start_with_next([=](const Flags::Change &change) {
|
||||
if (change.diff
|
||||
& (MTPDchannel::Flag::f_left | MTPDchannel_ClientFlag::f_forbidden)) {
|
||||
& (Flag::Left | Flag::Forbidden)) {
|
||||
if (const auto chat = getMigrateFromChat()) {
|
||||
session().changes().peerUpdated(chat, UpdateFlag::Migration);
|
||||
session().changes().peerUpdated(this, UpdateFlag::Migration);
|
||||
}
|
||||
}
|
||||
if (change.diff & MTPDchannel::Flag::f_megagroup) {
|
||||
if (change.value & MTPDchannel::Flag::f_megagroup) {
|
||||
if (change.diff & Flag::Megagroup) {
|
||||
if (change.value & Flag::Megagroup) {
|
||||
if (!mgInfo) {
|
||||
mgInfo = std::make_unique<MegagroupInfo>();
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ ChannelData::ChannelData(not_null<Data::Session*> owner, PeerId id)
|
|||
mgInfo = nullptr;
|
||||
}
|
||||
}
|
||||
if (change.diff & MTPDchannel::Flag::f_call_not_empty) {
|
||||
if (change.diff & Flag::CallNotEmpty) {
|
||||
if (const auto history = this->owner().historyLoaded(this)) {
|
||||
history->updateChatListEntry();
|
||||
}
|
||||
|
@ -412,7 +412,7 @@ bool ChannelData::anyoneCanAddMembers() const {
|
|||
}
|
||||
|
||||
bool ChannelData::hiddenPreHistory() const {
|
||||
return (fullFlags() & MTPDchannelFull::Flag::f_hidden_prehistory);
|
||||
return (flags() & Flag::PreHistoryHidden);
|
||||
}
|
||||
|
||||
bool ChannelData::canAddMembers() const {
|
||||
|
@ -437,15 +437,14 @@ bool ChannelData::canPublish() const {
|
|||
|
||||
bool ChannelData::canWrite() const {
|
||||
// Duplicated in Data::CanWriteValue().
|
||||
const auto allowed = amIn() || (flags() & MTPDchannel::Flag::f_has_link);
|
||||
const auto allowed = amIn() || (flags() & Flag::HasLink);
|
||||
return allowed && (canPublish()
|
||||
|| (!isBroadcast()
|
||||
&& !amRestricted(Restriction::SendMessages)));
|
||||
}
|
||||
|
||||
bool ChannelData::canViewMembers() const {
|
||||
return fullFlags()
|
||||
& MTPDchannelFull::Flag::f_can_view_participants;
|
||||
return flags() & Flag::CanViewParticipants;
|
||||
}
|
||||
|
||||
bool ChannelData::canViewAdmins() const {
|
||||
|
@ -480,11 +479,11 @@ bool ChannelData::canEditPreHistoryHidden() const {
|
|||
|
||||
bool ChannelData::canEditUsername() const {
|
||||
return amCreator()
|
||||
&& (fullFlags() & MTPDchannelFull::Flag::f_can_set_username);
|
||||
&& (flags() & Flag::CanSetUsername);
|
||||
}
|
||||
|
||||
bool ChannelData::canEditStickers() const {
|
||||
return (fullFlags() & MTPDchannelFull::Flag::f_can_set_stickers);
|
||||
return (flags() & Flag::CanSetStickers);
|
||||
}
|
||||
|
||||
bool ChannelData::canDelete() const {
|
||||
|
@ -688,7 +687,7 @@ void ChannelData::migrateCall(std::unique_ptr<Data::GroupCall> call) {
|
|||
_call = std::move(call);
|
||||
_call->setPeer(this);
|
||||
session().changes().peerUpdated(this, UpdateFlag::GroupCall);
|
||||
addFlags(MTPDchannel::Flag::f_call_active);
|
||||
addFlags(Flag::CallActive);
|
||||
}
|
||||
|
||||
void ChannelData::setGroupCall(
|
||||
|
@ -714,7 +713,7 @@ void ChannelData::setGroupCall(
|
|||
scheduleDate);
|
||||
owner().registerGroupCall(_call.get());
|
||||
session().changes().peerUpdated(this, UpdateFlag::GroupCall);
|
||||
addFlags(MTPDchannel::Flag::f_call_active);
|
||||
addFlags(Flag::CallActive);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -725,8 +724,7 @@ void ChannelData::clearGroupCall() {
|
|||
owner().unregisterGroupCall(_call.get());
|
||||
_call = nullptr;
|
||||
session().changes().peerUpdated(this, UpdateFlag::GroupCall);
|
||||
removeFlags(MTPDchannel::Flag::f_call_active
|
||||
| MTPDchannel::Flag::f_call_not_empty);
|
||||
removeFlags(Flag::CallActive | Flag::CallNotEmpty);
|
||||
}
|
||||
|
||||
void ChannelData::setGroupCallDefaultJoinAs(PeerId peerId) {
|
||||
|
@ -791,10 +789,21 @@ void ApplyChannelUpdate(
|
|||
}
|
||||
|
||||
channel->setMessagesTTL(update.vttl_period().value_or_empty());
|
||||
channel->setFullFlags(update.vflags().v);
|
||||
using Flag = ChannelDataFlag;
|
||||
const auto mask = Flag::CanSetUsername
|
||||
| Flag::CanViewParticipants
|
||||
| Flag::CanSetStickers
|
||||
| Flag::PreHistoryHidden
|
||||
| Flag::Location;
|
||||
channel->setFlags((channel->flags() & ~mask)
|
||||
| (update.is_can_set_username() ? Flag::CanSetUsername : Flag())
|
||||
| (update.is_can_view_participants() ? Flag::CanViewParticipants : Flag())
|
||||
| (update.is_can_set_stickers() ? Flag::CanSetStickers : Flag())
|
||||
| (update.is_hidden_prehistory() ? Flag::PreHistoryHidden : Flag())
|
||||
| (update.vlocation() ? Flag::Location : Flag()));
|
||||
channel->setUserpicPhoto(update.vchat_photo());
|
||||
if (const auto migratedFrom = update.vmigrated_from_chat_id()) {
|
||||
channel->addFlags(MTPDchannel::Flag::f_megagroup);
|
||||
channel->addFlags(Flag::Megagroup);
|
||||
const auto chat = channel->owner().chat(migratedFrom->v);
|
||||
Data::ApplyMigration(chat, channel);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,31 @@ struct ChannelLocation {
|
|||
}
|
||||
};
|
||||
|
||||
enum class ChannelDataFlag {
|
||||
Left = (1 << 0),
|
||||
Creator = (1 << 1),
|
||||
Forbidden = (1 << 2),
|
||||
CallActive = (1 << 3),
|
||||
CallNotEmpty = (1 << 4),
|
||||
Signatures = (1 << 5),
|
||||
Verified = (1 << 6),
|
||||
Scam = (1 << 7),
|
||||
Fake = (1 << 8),
|
||||
Megagroup = (1 << 9),
|
||||
Broadcast = (1 << 10),
|
||||
Gigagroup = (1 << 11),
|
||||
Username = (1 << 12),
|
||||
Location = (1 << 13),
|
||||
CanSetUsername = (1 << 14),
|
||||
CanSetStickers = (1 << 15),
|
||||
PreHistoryHidden = (1 << 16),
|
||||
CanViewParticipants = (1 << 17),
|
||||
HasLink = (1 << 18),
|
||||
SlowmodeEnabled = (1 << 19),
|
||||
};
|
||||
inline constexpr bool is_flag_type(ChannelDataFlag) { return true; };
|
||||
using ChannelDataFlags = base::flags<ChannelDataFlag>;
|
||||
|
||||
class MegagroupInfo {
|
||||
public:
|
||||
struct Admin {
|
||||
|
@ -94,35 +119,8 @@ private:
|
|||
|
||||
class ChannelData : public PeerData {
|
||||
public:
|
||||
static constexpr auto kEssentialFlags = 0
|
||||
| MTPDchannel::Flag::f_creator
|
||||
| MTPDchannel::Flag::f_left
|
||||
| MTPDchannel_ClientFlag::f_forbidden
|
||||
| MTPDchannel::Flag::f_broadcast
|
||||
| MTPDchannel::Flag::f_verified
|
||||
| MTPDchannel::Flag::f_scam
|
||||
| MTPDchannel::Flag::f_fake
|
||||
| MTPDchannel::Flag::f_megagroup
|
||||
| MTPDchannel::Flag::f_gigagroup
|
||||
| MTPDchannel::Flag::f_restricted
|
||||
| MTPDchannel::Flag::f_signatures
|
||||
| MTPDchannel::Flag::f_username
|
||||
| MTPDchannel::Flag::f_call_not_empty
|
||||
| MTPDchannel::Flag::f_slowmode_enabled;
|
||||
using Flags = Data::Flags<
|
||||
MTPDchannel::Flags,
|
||||
kEssentialFlags>;
|
||||
|
||||
static constexpr auto kEssentialFullFlags = 0
|
||||
| MTPDchannelFull::Flag::f_can_view_participants
|
||||
| MTPDchannelFull::Flag::f_can_set_username
|
||||
| MTPDchannelFull::Flag::f_can_set_stickers
|
||||
| MTPDchannelFull::Flag::f_location
|
||||
| MTPDchannelFull::Flag::f_slowmode_seconds
|
||||
| MTPDchannelFull::Flag::f_slowmode_next_send_date;
|
||||
using FullFlags = Data::Flags<
|
||||
MTPDchannelFull::Flags,
|
||||
kEssentialFullFlags>;
|
||||
using Flag = ChannelDataFlag;
|
||||
using Flags = Data::Flags<ChannelDataFlags>;
|
||||
|
||||
using AdminRight = ChatAdminRight;
|
||||
using Restriction = ChatRestriction;
|
||||
|
@ -137,13 +135,13 @@ public:
|
|||
void setPhoto(const MTPChatPhoto &photo);
|
||||
void setAccessHash(uint64 accessHash);
|
||||
|
||||
void setFlags(MTPDchannel::Flags which) {
|
||||
void setFlags(ChannelDataFlags which) {
|
||||
_flags.set(which);
|
||||
}
|
||||
void addFlags(MTPDchannel::Flags which) {
|
||||
void addFlags(ChannelDataFlags which) {
|
||||
_flags.add(which);
|
||||
}
|
||||
void removeFlags(MTPDchannel::Flags which) {
|
||||
void removeFlags(ChannelDataFlags which) {
|
||||
_flags.remove(which);
|
||||
}
|
||||
[[nodiscard]] auto flags() const {
|
||||
|
@ -153,22 +151,6 @@ public:
|
|||
return _flags.value();
|
||||
}
|
||||
|
||||
void setFullFlags(MTPDchannelFull::Flags which) {
|
||||
_fullFlags.set(which);
|
||||
}
|
||||
void addFullFlags(MTPDchannelFull::Flags which) {
|
||||
_fullFlags.add(which);
|
||||
}
|
||||
void removeFullFlags(MTPDchannelFull::Flags which) {
|
||||
_fullFlags.remove(which);
|
||||
}
|
||||
[[nodiscard]] auto fullFlags() const {
|
||||
return _fullFlags.current();
|
||||
}
|
||||
[[nodiscard]] auto fullFlagsValue() const {
|
||||
return _fullFlags.value();
|
||||
}
|
||||
|
||||
[[nodiscard]] int membersCount() const {
|
||||
return std::max(_membersCount, 1);
|
||||
}
|
||||
|
@ -193,25 +175,25 @@ public:
|
|||
void setKickedCount(int newKickedCount);
|
||||
|
||||
[[nodiscard]] bool haveLeft() const {
|
||||
return flags() & MTPDchannel::Flag::f_left;
|
||||
return flags() & Flag::Left;
|
||||
}
|
||||
[[nodiscard]] bool amIn() const {
|
||||
return !isForbidden() && !haveLeft();
|
||||
}
|
||||
[[nodiscard]] bool addsSignature() const {
|
||||
return flags() & MTPDchannel::Flag::f_signatures;
|
||||
return flags() & Flag::Signatures;
|
||||
}
|
||||
[[nodiscard]] bool isForbidden() const {
|
||||
return flags() & MTPDchannel_ClientFlag::f_forbidden;
|
||||
return flags() & Flag::Forbidden;
|
||||
}
|
||||
[[nodiscard]] bool isVerified() const {
|
||||
return flags() & MTPDchannel::Flag::f_verified;
|
||||
return flags() & Flag::Verified;
|
||||
}
|
||||
[[nodiscard]] bool isScam() const {
|
||||
return flags() & MTPDchannel::Flag::f_scam;
|
||||
return flags() & Flag::Scam;
|
||||
}
|
||||
[[nodiscard]] bool isFake() const {
|
||||
return flags() & MTPDchannel::Flag::f_fake;
|
||||
return flags() & Flag::Fake;
|
||||
}
|
||||
|
||||
[[nodiscard]] static ChatRestrictionsInfo KickedRestrictedRights(
|
||||
|
@ -235,25 +217,25 @@ public:
|
|||
[[nodiscard]] bool isGroupAdmin(not_null<UserData*> user) const;
|
||||
[[nodiscard]] bool lastParticipantsRequestNeeded() const;
|
||||
[[nodiscard]] bool isMegagroup() const {
|
||||
return flags() & MTPDchannel::Flag::f_megagroup;
|
||||
return flags() & Flag::Megagroup;
|
||||
}
|
||||
[[nodiscard]] bool isBroadcast() const {
|
||||
return flags() & MTPDchannel::Flag::f_broadcast;
|
||||
return flags() & Flag::Broadcast;
|
||||
}
|
||||
[[nodiscard]] bool isGigagroup() const {
|
||||
return flags() & MTPDchannel::Flag::f_gigagroup;
|
||||
return flags() & Flag::Gigagroup;
|
||||
}
|
||||
[[nodiscard]] bool hasUsername() const {
|
||||
return flags() & MTPDchannel::Flag::f_username;
|
||||
return flags() & Flag::Username;
|
||||
}
|
||||
[[nodiscard]] bool hasLocation() const {
|
||||
return fullFlags() & MTPDchannelFull::Flag::f_location;
|
||||
return flags() & Flag::Location;
|
||||
}
|
||||
[[nodiscard]] bool isPublic() const {
|
||||
return hasUsername() || hasLocation();
|
||||
}
|
||||
[[nodiscard]] bool amCreator() const {
|
||||
return flags() & MTPDchannel::Flag::f_creator;
|
||||
return flags() & Flag::Creator;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto adminRights() const {
|
||||
|
@ -446,8 +428,7 @@ private:
|
|||
-> const std::vector<Data::UnavailableReason> & override;
|
||||
bool canEditLastAdmin(not_null<UserData*> user) const;
|
||||
|
||||
Flags _flags = Flags(MTPDchannel_ClientFlag::f_forbidden | 0);
|
||||
FullFlags _fullFlags;
|
||||
Flags _flags = ChannelDataFlags(Flag::Forbidden);
|
||||
|
||||
PtsWaiter _ptsWaiter;
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ void GroupCall::changePeerEmptyCallFlag() {
|
|||
const auto chat = _peer->asChat();
|
||||
const auto channel = _peer->asChannel();
|
||||
constexpr auto chatFlag = ChatDataFlag::CallNotEmpty;
|
||||
constexpr auto channelFlag = MTPDchannel::Flag::f_call_not_empty;
|
||||
constexpr auto channelFlag = ChannelDataFlag::CallNotEmpty;
|
||||
if (_peer->groupCall() != this) {
|
||||
return;
|
||||
} else if (_serverParticipantsCount > 0) {
|
||||
|
|
|
@ -250,10 +250,9 @@ void PeerData::updateNameDelayed(
|
|||
if (asChannel()->username != newUsername) {
|
||||
asChannel()->username = newUsername;
|
||||
if (newUsername.isEmpty()) {
|
||||
asChannel()->removeFlags(
|
||||
MTPDchannel::Flag::f_username);
|
||||
asChannel()->removeFlags(ChannelDataFlag::Username);
|
||||
} else {
|
||||
asChannel()->addFlags(MTPDchannel::Flag::f_username);
|
||||
asChannel()->addFlags(ChannelDataFlag::Username);
|
||||
}
|
||||
flags |= UpdateFlag::Username;
|
||||
}
|
||||
|
@ -909,7 +908,7 @@ bool PeerData::slowmodeApplied() const {
|
|||
if (const auto channel = asChannel()) {
|
||||
return !channel->amCreator()
|
||||
&& !channel->hasAdminRights()
|
||||
&& (channel->flags() & MTPDchannel::Flag::f_slowmode_enabled);
|
||||
&& (channel->flags() & ChannelDataFlag::SlowmodeEnabled);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -928,9 +927,9 @@ rpl::producer<bool> PeerData::slowmodeAppliedValue() const {
|
|||
|
||||
auto slowmodeEnabled = channel->flagsValue(
|
||||
) | rpl::filter([=](const ChannelData::Flags::Change &change) {
|
||||
return (change.diff & MTPDchannel::Flag::f_slowmode_enabled) != 0;
|
||||
return (change.diff & ChannelDataFlag::SlowmodeEnabled) != 0;
|
||||
}) | rpl::map([=](const ChannelData::Flags::Change &change) {
|
||||
return (change.value & MTPDchannel::Flag::f_slowmode_enabled) != 0;
|
||||
return (change.value & ChannelDataFlag::SlowmodeEnabled) != 0;
|
||||
}) | rpl::distinct_until_changed();
|
||||
|
||||
return rpl::combine(
|
||||
|
|
|
@ -157,12 +157,6 @@ inline auto DefaultRestrictionValue(
|
|||
return SingleFlagValue(DefaultRestrictionsValue(chat), flag);
|
||||
}
|
||||
|
||||
rpl::producer<bool> PeerFlagValue(
|
||||
ChannelData *channel,
|
||||
MTPDchannel_ClientFlag flag) {
|
||||
return PeerFlagValue(channel, static_cast<MTPDchannel::Flag>(flag));
|
||||
}
|
||||
|
||||
rpl::producer<bool> CanWriteValue(UserData *user) {
|
||||
using namespace rpl::mappers;
|
||||
|
||||
|
@ -204,12 +198,13 @@ rpl::producer<bool> CanWriteValue(ChatData *chat) {
|
|||
}
|
||||
|
||||
rpl::producer<bool> CanWriteValue(ChannelData *channel) {
|
||||
using Flag = ChannelDataFlag;
|
||||
const auto mask = 0
|
||||
| MTPDchannel::Flag::f_left
|
||||
| MTPDchannel::Flag::f_has_link
|
||||
| MTPDchannel_ClientFlag::f_forbidden
|
||||
| MTPDchannel::Flag::f_creator
|
||||
| MTPDchannel::Flag::f_broadcast;
|
||||
| Flag::Left
|
||||
| Flag::HasLink
|
||||
| Flag::Forbidden
|
||||
| Flag::Creator
|
||||
| Flag::Broadcast;
|
||||
return rpl::combine(
|
||||
PeerFlagsValue(channel, mask),
|
||||
AdminRightValue(
|
||||
|
@ -222,18 +217,16 @@ rpl::producer<bool> CanWriteValue(ChannelData *channel) {
|
|||
channel,
|
||||
ChatRestriction::SendMessages),
|
||||
[](
|
||||
MTPDchannel::Flags flags,
|
||||
ChannelDataFlags flags,
|
||||
bool postMessagesRight,
|
||||
bool sendMessagesRestriction,
|
||||
bool defaultSendMessagesRestriction) {
|
||||
const auto notAmInFlags = 0
|
||||
| MTPDchannel::Flag::f_left
|
||||
| MTPDchannel_ClientFlag::f_forbidden;
|
||||
const auto notAmInFlags = Flag::Left | Flag::Forbidden;
|
||||
const auto allowed = !(flags & notAmInFlags)
|
||||
|| (flags & MTPDchannel::Flag::f_has_link);
|
||||
|| (flags & Flag::HasLink);
|
||||
return allowed && (postMessagesRight
|
||||
|| (flags & MTPDchannel::Flag::f_creator)
|
||||
|| (!(flags & MTPDchannel::Flag::f_broadcast)
|
||||
|| (flags & Flag::Creator)
|
||||
|| (!(flags & Flag::Broadcast)
|
||||
&& !sendMessagesRestriction
|
||||
&& !defaultSendMessagesRestriction));
|
||||
});
|
||||
|
@ -290,18 +283,17 @@ rpl::producer<bool> CanPinMessagesValue(not_null<PeerData*> peer) {
|
|||
return rpl::combine(
|
||||
AdminRightValue(megagroup, ChatAdminRight::PinMessages),
|
||||
DefaultRestrictionValue(megagroup, ChatRestriction::PinMessages),
|
||||
PeerFlagValue(megagroup, MTPDchannel::Flag::f_username),
|
||||
PeerFullFlagValue(megagroup, MTPDchannelFull::Flag::f_location),
|
||||
PeerFlagsValue(
|
||||
megagroup,
|
||||
ChannelDataFlag::Username | ChannelDataFlag::Location),
|
||||
megagroup->restrictionsValue()
|
||||
) | rpl::map([=](
|
||||
bool adminRightAllows,
|
||||
bool defaultRestriction,
|
||||
bool hasUsername,
|
||||
bool hasLocation,
|
||||
ChannelDataFlags usernameOrLocation,
|
||||
Data::Flags<ChatRestrictions>::Change restrictions) {
|
||||
return adminRightAllows
|
||||
|| (!hasUsername
|
||||
&& !hasLocation
|
||||
|| (!usernameOrLocation
|
||||
&& !defaultRestriction
|
||||
&& !(restrictions.value & ChatRestriction::PinMessages));
|
||||
});
|
||||
|
@ -451,7 +443,7 @@ bool IsUserOnline(not_null<UserData*> user) {
|
|||
}
|
||||
|
||||
bool ChannelHasActiveCall(not_null<ChannelData*> channel) {
|
||||
return (channel->flags() & MTPDchannel::Flag::f_call_not_empty);
|
||||
return (channel->flags() & ChannelDataFlag::CallNotEmpty);
|
||||
}
|
||||
|
||||
} // namespace Data
|
||||
|
|
|
@ -65,10 +65,6 @@ inline auto PeerFlagValue(
|
|||
return SingleFlagValue(PeerFlagsValue(peer), flag);
|
||||
}
|
||||
|
||||
rpl::producer<bool> PeerFlagValue(
|
||||
ChannelData *channel,
|
||||
MTPDchannel_ClientFlag flag);
|
||||
|
||||
template <
|
||||
typename PeerType,
|
||||
typename = typename PeerType::FullFlags::Change>
|
||||
|
|
|
@ -620,7 +620,7 @@ not_null<PeerData*> Session::processChat(const MTPChat &data) {
|
|||
if (const auto migratedTo = data.vmigrated_to()) {
|
||||
migratedTo->match([&](const MTPDinputChannel &input) {
|
||||
const auto channel = this->channel(input.vchannel_id().v);
|
||||
channel->addFlags(MTPDchannel::Flag::f_megagroup);
|
||||
channel->addFlags(ChannelDataFlag::Megagroup);
|
||||
if (!channel->access) {
|
||||
channel->setAccessHash(input.vaccess_hash().v);
|
||||
}
|
||||
|
@ -695,21 +695,8 @@ not_null<PeerData*> Session::processChat(const MTPChat &data) {
|
|||
} else {
|
||||
channel->setDefaultRestrictions(ChatRestrictions());
|
||||
}
|
||||
const auto callFlag = MTPDchannel::Flag::f_call_not_empty;
|
||||
const auto callNotEmpty = (data.vflags().v & callFlag)
|
||||
|| (channel->groupCall()
|
||||
&& channel->groupCall()->fullCount() > 0);
|
||||
|
||||
if (minimal) {
|
||||
auto mask = 0
|
||||
| MTPDchannel::Flag::f_broadcast
|
||||
| MTPDchannel::Flag::f_verified
|
||||
| MTPDchannel::Flag::f_megagroup
|
||||
| MTPDchannel::Flag::f_call_active
|
||||
| MTPDchannel::Flag::f_call_not_empty
|
||||
| MTPDchannel_ClientFlag::f_forbidden;
|
||||
channel->setFlags((channel->flags() & ~mask)
|
||||
| (data.vflags().v & mask)
|
||||
| (callNotEmpty ? callFlag : MTPDchannel::Flag(0)));
|
||||
if (channel->input.type() == mtpc_inputPeerEmpty
|
||||
|| channel->inputChannel.type() == mtpc_inputChannelEmpty) {
|
||||
channel->setAccessHash(data.vaccess_hash().value_or_empty());
|
||||
|
@ -737,10 +724,48 @@ not_null<PeerData*> Session::processChat(const MTPChat &data) {
|
|||
} else {
|
||||
channel->setUnavailableReasons({});
|
||||
}
|
||||
channel->setFlags(data.vflags().v
|
||||
| (callNotEmpty ? callFlag : MTPDchannel::Flag(0)));
|
||||
}
|
||||
|
||||
using Flag = ChannelDataFlag;
|
||||
const auto flagsMask = Flag::Broadcast
|
||||
| Flag::Verified
|
||||
| Flag::Scam
|
||||
| Flag::Fake
|
||||
| Flag::Megagroup
|
||||
| Flag::Gigagroup
|
||||
| Flag::Username
|
||||
| Flag::Signatures
|
||||
| Flag::HasLink
|
||||
| Flag::SlowmodeEnabled
|
||||
| Flag::CallActive
|
||||
| Flag::CallNotEmpty
|
||||
| Flag::Forbidden
|
||||
| (!minimal
|
||||
? Flag::Left
|
||||
| Flag::Creator
|
||||
: Flag());
|
||||
const auto flagsSet = (data.is_broadcast() ? Flag::Broadcast : Flag())
|
||||
| (data.is_verified() ? Flag::Verified : Flag())
|
||||
| (data.is_scam() ? Flag::Scam : Flag())
|
||||
| (data.is_fake() ? Flag::Fake : Flag())
|
||||
| (data.is_megagroup() ? Flag::Megagroup : Flag())
|
||||
| (data.is_gigagroup() ? Flag::Gigagroup : Flag())
|
||||
| (data.vusername() ? Flag::Username : Flag())
|
||||
| (data.is_signatures() ? Flag::Signatures : Flag())
|
||||
| (data.is_has_link() ? Flag::HasLink : Flag())
|
||||
| (data.is_slowmode_enabled() ? Flag::SlowmodeEnabled : Flag())
|
||||
| (data.is_call_active() ? Flag::CallActive : Flag())
|
||||
| ((data.is_call_not_empty()
|
||||
|| (channel->groupCall()
|
||||
&& channel->groupCall()->fullCount() > 0))
|
||||
? Flag::CallNotEmpty
|
||||
: Flag())
|
||||
| (!minimal
|
||||
? (data.is_left() ? Flag::Left : Flag())
|
||||
| (data.is_creator() ? Flag::Creator : Flag())
|
||||
: Flag());
|
||||
channel->setFlags((channel->flags() & ~flagsMask) | flagsSet);
|
||||
|
||||
channel->setName(
|
||||
qs(data.vtitle()),
|
||||
TextUtilities::SingleLine(qs(data.vusername().value_or_empty())));
|
||||
|
@ -763,8 +788,14 @@ not_null<PeerData*> Session::processChat(const MTPChat &data) {
|
|||
auto canViewMembers = channel->canViewMembers();
|
||||
auto canAddMembers = channel->canAddMembers();
|
||||
|
||||
auto mask = mtpCastFlags(MTPDchannelForbidden::Flag::f_broadcast | MTPDchannelForbidden::Flag::f_megagroup);
|
||||
channel->setFlags((channel->flags() & ~mask) | (mtpCastFlags(data.vflags()) & mask) | MTPDchannel_ClientFlag::f_forbidden);
|
||||
using Flag = ChannelDataFlag;
|
||||
const auto flagsMask = Flag::Broadcast
|
||||
| Flag::Megagroup
|
||||
| Flag::Forbidden;
|
||||
const auto flagsSet = (data.is_broadcast() ? Flag::Broadcast : Flag())
|
||||
| (data.is_megagroup() ? Flag::Megagroup : Flag())
|
||||
| Flag::Forbidden;
|
||||
channel->setFlags((channel->flags() & ~flagsMask) | flagsSet);
|
||||
|
||||
if (channel->hasAdminRights()) {
|
||||
channel->setAdminRights(ChatAdminRights());
|
||||
|
@ -954,7 +985,7 @@ void Session::deleteConversationLocally(not_null<PeerData*> peer) {
|
|||
: History::ClearType::DeleteChat);
|
||||
}
|
||||
if (const auto channel = peer->asMegagroup()) {
|
||||
channel->addFlags(MTPDchannel::Flag::f_left);
|
||||
channel->addFlags(ChannelDataFlag::Left);
|
||||
if (const auto from = channel->getMigrateFromChat()) {
|
||||
if (const auto migrated = historyLoaded(from)) {
|
||||
migrated->updateChatListExistence();
|
||||
|
|
|
@ -988,7 +988,7 @@ void History::applyServiceChanges(
|
|||
}
|
||||
}, [&](const MTPDmessageActionChannelMigrateFrom &data) {
|
||||
if (const auto channel = peer->asChannel()) {
|
||||
channel->addFlags(MTPDchannel::Flag::f_megagroup);
|
||||
channel->addFlags(ChannelDataFlag::Megagroup);
|
||||
if (const auto chat = owner().chatLoaded(data.vchat_id().v)) {
|
||||
Data::ApplyMigration(chat, channel);
|
||||
}
|
||||
|
|
|
@ -789,7 +789,7 @@ bool HistoryMessage::checkCommentsLinkedChat(ChannelId id) const {
|
|||
return true;
|
||||
} else if (const auto channel = history()->peer->asChannel()) {
|
||||
if (channel->linkedChatKnown()
|
||||
|| !(channel->flags() & MTPDchannel::Flag::f_has_link)) {
|
||||
|| !(channel->flags() & ChannelDataFlag::HasLink)) {
|
||||
const auto linked = channel->linkedChat();
|
||||
if (!linked || peerToChannel(linked->id) != id) {
|
||||
return false;
|
||||
|
|
|
@ -50,7 +50,7 @@ constexpr auto kPinnedMessageTextLimit = 16;
|
|||
} else if (const auto chat = peer->asChat()) {
|
||||
return !(chat->flags() & ChatDataFlag::CallActive);
|
||||
} else if (const auto channel = peer->asChannel()) {
|
||||
return !(channel->flags() & MTPDchannel::Flag::f_call_active);
|
||||
return !(channel->flags() & ChannelDataFlag::CallActive);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -767,9 +767,9 @@ object_ptr<Ui::RpWidget> SetupChannelMembers(
|
|||
|
||||
auto membersShown = rpl::combine(
|
||||
MembersCountValue(channel),
|
||||
Data::PeerFullFlagValue(
|
||||
Data::PeerFlagValue(
|
||||
channel,
|
||||
MTPDchannelFull::Flag::f_can_view_participants),
|
||||
ChannelDataFlag::CanViewParticipants),
|
||||
(_1 > 0) && _2);
|
||||
auto membersText = tr::lng_chat_status_subscribers(
|
||||
lt_count_decimal,
|
||||
|
|
|
@ -380,13 +380,13 @@ template <typename Flag, typename Peer>
|
|||
rpl::producer<Badge> BadgeValueFromFlags(Peer peer) {
|
||||
return Data::PeerFlagsValue(
|
||||
peer,
|
||||
Flag::f_verified | Flag::f_scam | Flag::f_fake
|
||||
Flag::Verified | Flag::Scam | Flag::Fake
|
||||
) | rpl::map([=](base::flags<Flag> value) {
|
||||
return (value & Flag::f_verified)
|
||||
return (value & Flag::Verified)
|
||||
? Badge::Verified
|
||||
: (value & Flag::f_scam)
|
||||
: (value & Flag::Scam)
|
||||
? Badge::Scam
|
||||
: (value & Flag::f_fake)
|
||||
: (value & Flag::Fake)
|
||||
? Badge::Fake
|
||||
: Badge::None;
|
||||
});
|
||||
|
@ -394,21 +394,9 @@ rpl::producer<Badge> BadgeValueFromFlags(Peer peer) {
|
|||
|
||||
rpl::producer<Badge> BadgeValue(not_null<PeerData*> peer) {
|
||||
if (const auto user = peer->asUser()) {
|
||||
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;
|
||||
});
|
||||
return BadgeValueFromFlags<UserDataFlag>(user);
|
||||
} else if (const auto channel = peer->asChannel()) {
|
||||
return BadgeValueFromFlags<MTPDchannel::Flag>(channel);
|
||||
return BadgeValueFromFlags<ChannelDataFlag>(channel);
|
||||
}
|
||||
return rpl::single(Badge::None);
|
||||
}
|
||||
|
|
|
@ -112,12 +112,3 @@ enum class MTPDstickerSet_ClientFlag : uint32 {
|
|||
MIN_FIELD = (1U << 27),
|
||||
};
|
||||
DEFINE_MTP_CLIENT_FLAGS(MTPDstickerSet)
|
||||
|
||||
enum class MTPDchannel_ClientFlag : uint32 {
|
||||
// forbidden constructor received
|
||||
f_forbidden = (1U << 31),
|
||||
|
||||
// update this when adding new client side flags
|
||||
MIN_FIELD = (1U << 31),
|
||||
};
|
||||
DEFINE_MTP_CLIENT_FLAGS(MTPDchannel)
|
||||
|
|
|
@ -326,7 +326,6 @@ PeerData *readPeer(
|
|||
Conversion{ Saved::f_call_active, Flag::CallActive },
|
||||
Conversion{ Saved::f_call_not_empty, Flag::CallNotEmpty },
|
||||
};
|
||||
|
||||
auto flagsMask = Flag() | Flag();
|
||||
auto flagsSet = Flag() | Flag();
|
||||
if (streamAppVersion >= 9012) {
|
||||
|
@ -359,13 +358,17 @@ PeerData *readPeer(
|
|||
quint64 access;
|
||||
qint32 date, version, oldForbidden;
|
||||
quint32 flags;
|
||||
stream >> name >> access >> date >> version >> oldForbidden >> flags >> inviteLink;
|
||||
stream
|
||||
>> name
|
||||
>> access
|
||||
>> date
|
||||
>> version
|
||||
>> oldForbidden
|
||||
>> flags
|
||||
>> inviteLink;
|
||||
|
||||
userpicAccessHash = access;
|
||||
|
||||
if (oldForbidden) {
|
||||
flags |= quint32(MTPDchannel_ClientFlag::f_forbidden);
|
||||
}
|
||||
if (apply) {
|
||||
channel->setName(name, QString());
|
||||
channel->access = access;
|
||||
|
@ -375,7 +378,48 @@ PeerData *readPeer(
|
|||
// So we don't restore the version field, info is still unknown.
|
||||
channel->setVersion(0);
|
||||
|
||||
channel->setFlags(MTPDchannel::Flags::from_raw(flags));
|
||||
if (streamAppVersion >= 2008007) {
|
||||
channel->setFlags(ChannelDataFlags::from_raw(flags));
|
||||
} else {
|
||||
using Saved = MTPDchannel::Flag;
|
||||
using Flag = ChannelDataFlag;
|
||||
struct Conversion {
|
||||
Saved saved;
|
||||
Flag flag;
|
||||
};
|
||||
const auto conversions = {
|
||||
Conversion{ Saved::f_broadcast, Flag::Broadcast },
|
||||
Conversion{ Saved::f_verified, Flag::Verified},
|
||||
Conversion{ Saved::f_scam, Flag::Scam},
|
||||
Conversion{ Saved::f_fake, Flag::Fake},
|
||||
Conversion{ Saved::f_megagroup, Flag::Megagroup},
|
||||
Conversion{ Saved::f_gigagroup, Flag::Gigagroup},
|
||||
Conversion{ Saved::f_username, Flag::Username},
|
||||
Conversion{ Saved::f_signatures, Flag::Signatures},
|
||||
Conversion{ Saved::f_has_link, Flag::HasLink},
|
||||
Conversion{
|
||||
Saved::f_slowmode_enabled,
|
||||
Flag::SlowmodeEnabled },
|
||||
Conversion{ Saved::f_call_active, Flag::CallActive },
|
||||
Conversion{ Saved::f_call_not_empty, Flag::CallNotEmpty },
|
||||
Conversion{ Saved(1U << 31), Flag::Forbidden },
|
||||
Conversion{ Saved::f_left, Flag::Left },
|
||||
Conversion{ Saved::f_creator, Flag::Creator },
|
||||
};
|
||||
auto flagsMask = Flag() | Flag();
|
||||
auto flagsSet = Flag() | Flag();
|
||||
for (const auto &conversion : conversions) {
|
||||
flagsMask |= conversion.flag;
|
||||
if (flags & int(conversion.saved)) {
|
||||
flagsSet |= conversion.flag;
|
||||
}
|
||||
}
|
||||
if (oldForbidden) {
|
||||
flagsSet |= Flag::Forbidden;
|
||||
}
|
||||
channel->setFlags((channel->flags() & ~flagsMask) | flagsSet);
|
||||
}
|
||||
|
||||
channel->setInviteLink(inviteLink);
|
||||
|
||||
// #TODO ids
|
||||
|
|
Loading…
Add table
Reference in a new issue