Don't use MTP* for ChannelData flags.

This commit is contained in:
John Preston 2021-07-08 16:11:09 +03:00
parent 5040c2e766
commit a74228acea
18 changed files with 209 additions and 178 deletions

View File

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

View File

@ -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([=] {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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