diff --git a/Telegram/SourceFiles/api/api_hash.cpp b/Telegram/SourceFiles/api/api_hash.cpp index 8529f7c39..75ee587aa 100644 --- a/Telegram/SourceFiles/api/api_hash.cpp +++ b/Telegram/SourceFiles/api/api_hash.cpp @@ -40,6 +40,7 @@ namespace { int32 CountStickersHash( not_null session, bool checkOutdatedInfo) { + using Flag = Data::StickersSetFlag; auto result = HashInit(); bool foundOutdated = false; const auto &sets = session->data().stickers().sets(); @@ -50,8 +51,8 @@ int32 CountStickersHash( const auto set = it->second.get(); if (set->id == Data::Stickers::DefaultSetId) { foundOutdated = true; - } else if (!(set->flags & MTPDstickerSet_ClientFlag::f_special) - && !(set->flags & MTPDstickerSet::Flag::f_archived)) { + } else if (!(set->flags & Flag::Special) + && !(set->flags & Flag::Archived)) { HashUpdate(result, set->hash); } } @@ -84,7 +85,7 @@ int32 CountFeaturedStickersHash(not_null session) { const auto it = sets.find(setId); if (it != sets.cend() - && (it->second->flags & MTPDstickerSet_ClientFlag::f_unread)) { + && (it->second->flags & Data::StickersSetFlag::Unread)) { HashUpdate(result, 1); } } diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 9737bbd64..35622b30b 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -1946,9 +1946,7 @@ void ApiWrap::saveStickerSets( ? _session->data().stickers().maskSetsOrderRef() : _session->data().stickers().setsOrderRef(); - using Flag = MTPDstickerSet::Flag; - using ClientFlag = MTPDstickerSet_ClientFlag; - + using Flag = Data::StickersSetFlag; for (const auto removedSetId : localRemoved) { if ((removedSetId == Data::Stickers::CloudRecentSetId) || (removedSetId == Data::Stickers::CloudRecentAttachedSetId)) { @@ -2000,10 +1998,10 @@ void ApiWrap::saveStickerSets( ++i; } } - const auto archived = !!(set->flags & Flag::f_archived); + const auto archived = !!(set->flags & Flag::Archived); if (!archived) { - const auto featured = !!(set->flags & ClientFlag::f_featured); - const auto special = !!(set->flags & ClientFlag::f_special); + const auto featured = !!(set->flags & Flag::Featured); + const auto special = !!(set->flags & Flag::Special); const auto setId = set->mtpInput(); auto requestId = request(MTPmessages_UninstallStickerSet( @@ -2026,8 +2024,7 @@ void ApiWrap::saveStickerSets( if (archived) { writeArchived = true; } - set->flags &= ~(Flag::f_installed_date - | Flag::f_archived); + set->flags &= ~(Flag::Installed | Flag::Archived); set->installDate = TimeId(0); } } @@ -2036,10 +2033,10 @@ void ApiWrap::saveStickerSets( // Clear all installed flags, set only for sets from order. for (auto &[id, set] : sets) { - const auto archived = !!(set->flags & Flag::f_archived); - const auto masks = !!(set->flags & MTPDstickerSet::Flag::f_masks); + const auto archived = !!(set->flags & Flag::Archived); + const auto masks = !!(set->flags & Flag::Masks); if (!archived && (setsMasks == masks)) { - set->flags &= ~Flag::f_installed_date; + set->flags &= ~Flag::Installed; } } @@ -2050,7 +2047,7 @@ void ApiWrap::saveStickerSets( continue; } const auto set = it->second.get(); - const auto archived = !!(set->flags & Flag::f_archived); + const auto archived = !!(set->flags & Flag::Archived); if (archived && !localRemoved.contains(set->id)) { const auto mtpSetId = set->mtpInput(); @@ -2069,11 +2066,11 @@ void ApiWrap::saveStickerSets( setDisenableRequests.insert(requestId); - set->flags &= ~Flag::f_archived; + set->flags &= ~Flag::Archived; writeArchived = true; } orderRef.push_back(setId); - set->flags |= Flag::f_installed_date; + set->flags |= Flag::Installed; if (!set->installDate) { set->installDate = base::unixtime::now(); } @@ -2081,10 +2078,10 @@ void ApiWrap::saveStickerSets( for (auto it = sets.begin(); it != sets.cend();) { const auto set = it->second.get(); - if ((set->flags & ClientFlag::f_featured) - || (set->flags & Flag::f_installed_date) - || (set->flags & Flag::f_archived) - || (set->flags & ClientFlag::f_special)) { + if ((set->flags & Flag::Featured) + || (set->flags & Flag::Installed) + || (set->flags & Flag::Archived) + || (set->flags & Flag::Special)) { ++it; } else { it = sets.erase(it); @@ -3303,7 +3300,7 @@ void ApiWrap::readFeaturedSets() { for (const auto setId : _featuredSetsRead) { const auto it = sets.find(setId); if (it != sets.cend()) { - it->second->flags &= ~MTPDstickerSet_ClientFlag::f_unread; + it->second->flags &= ~Data::StickersSetFlag::Unread; wrappedIds.append(MTP_long(setId)); if (count) { --count; diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 9d88809c8..888c7a37e 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -51,6 +51,7 @@ constexpr auto kStickersPanelPerRow = 5; using Data::StickersSet; using Data::StickersPack; using Data::StickersByEmojiMap; +using SetFlag = Data::StickersSetFlag; } // namespace @@ -77,7 +78,7 @@ public: void archiveStickers(); bool isMasksSet() const { - return (_setFlags & MTPDstickerSet::Flag::f_masks); + return (_setFlags & SetFlag::Masks); } ~Inner(); @@ -128,7 +129,7 @@ private: QString _setTitle, _setShortName; int _setCount = 0; int32 _setHash = 0; - MTPDstickerSet::Flags _setFlags = 0; + Data::StickersSetFlags _setFlags; TimeId _setInstallDate = TimeId(0); ImageWithLocation _setThumbnail; @@ -421,7 +422,8 @@ void StickerSetBox::Inner::gotSet(const MTPmessages_StickerSet &set) { _setAccess = set.vaccess_hash().v; _setCount = set.vcount().v; _setHash = set.vhash().v; - _setFlags = set.vflags().v; + using Flag = Data::StickersSetFlag; + _setFlags = Data::ParseStickersSetFlags(set); _setInstallDate = set.vinstalled_date().value_or(0); _setThumbnail = [&] { if (const auto thumbs = set.vthumbs()) { @@ -441,12 +443,11 @@ void StickerSetBox::Inner::gotSet(const MTPmessages_StickerSet &set) { const auto it = sets.find(_setId); if (it != sets.cend()) { const auto set = it->second.get(); - using ClientFlag = MTPDstickerSet_ClientFlag; const auto clientFlags = set->flags - & (ClientFlag::f_featured - | ClientFlag::f_not_loaded - | ClientFlag::f_unread - | ClientFlag::f_special); + & (SetFlag::Featured + | SetFlag::NotLoaded + | SetFlag::Unread + | SetFlag::Special); _setFlags |= clientFlags; set->flags = _setFlags; set->installDate = _setInstallDate; @@ -492,7 +493,7 @@ void StickerSetBox::Inner::installDone( auto &sets = stickers.setsRef(); const auto isMasks = isMasksSet(); - const bool wasArchived = (_setFlags & MTPDstickerSet::Flag::f_archived); + const bool wasArchived = (_setFlags & SetFlag::Archived); if (wasArchived) { const auto index = (isMasks ? stickers.archivedMaskSetsOrderRef() @@ -504,8 +505,8 @@ void StickerSetBox::Inner::installDone( } } _setInstallDate = base::unixtime::now(); - _setFlags &= ~MTPDstickerSet::Flag::f_archived; - _setFlags |= MTPDstickerSet::Flag::f_installed_date; + _setFlags &= ~SetFlag::Archived; + _setFlags |= SetFlag::Installed; auto it = sets.find(_setId); if (it == sets.cend()) { it = sets.emplace( @@ -843,8 +844,8 @@ bool StickerSetBox::Inner::notInstalled() const { const auto &sets = _controller->session().data().stickers().sets(); const auto it = sets.find(_setId); if ((it == sets.cend()) - || !(it->second->flags & MTPDstickerSet::Flag::f_installed_date) - || (it->second->flags & MTPDstickerSet::Flag::f_archived)) { + || !(it->second->flags & SetFlag::Installed) + || (it->second->flags & SetFlag::Archived)) { return !_pack.empty(); } return false; diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp index 8255a8f86..1d1330381 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.cpp +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -45,6 +45,7 @@ namespace { using Data::StickersSet; using Data::StickersSetsOrder; using Data::StickersSetThumbnailView; +using SetFlag = Data::StickersSetFlag; constexpr auto kArchivedLimitFirstRequest = 10; constexpr auto kArchivedLimitPerPage = 30; @@ -429,8 +430,11 @@ void StickersBox::showAttachedStickers() { if (const auto set = session().data().stickers().feedSet(*setData)) { if (_attached.widget()->appendSet(set)) { addedSet = true; - if (set->stickers.isEmpty() || (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { - session().api().scheduleStickerSetRequest(set->id, set->access); + if (set->stickers.isEmpty() + || (set->flags & SetFlag::NotLoaded)) { + session().api().scheduleStickerSetRequest( + set->id, + set->access); } } } @@ -495,8 +499,11 @@ void StickersBox::getArchivedDone( } if (_archived.widget()->appendSet(set)) { addedSet = true; - if (set->stickers.isEmpty() || (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { - session().api().scheduleStickerSetRequest(set->id, set->access); + if (set->stickers.isEmpty() + || (set->flags & SetFlag::NotLoaded)) { + session().api().scheduleStickerSetRequest( + set->id, + set->access); } } } @@ -682,7 +689,7 @@ void StickersBox::loadMoreArchived() { --setIt; auto it = sets.find(*setIt); if (it != sets.cend()) { - if (it->second->flags & MTPDstickerSet::Flag::f_archived) { + if (it->second->flags & SetFlag::Archived) { lastId = it->second->id; break; } @@ -834,8 +841,8 @@ void StickersBox::installSet(uint64 setId) { } } } - if (!(set->flags & MTPDstickerSet::Flag::f_installed_date) - || (set->flags & MTPDstickerSet::Flag::f_archived)) { + if (!(set->flags & SetFlag::Installed) + || (set->flags & SetFlag::Archived)) { _api.request(MTPmessages_InstallStickerSet( set->mtpInput(), MTP_boolFalse() @@ -896,7 +903,8 @@ void StickersBox::requestArchivedSets() { auto it = sets.find(setId); if (it != sets.cend()) { const auto set = it->second.get(); - if (set->stickers.isEmpty() && (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + if (set->stickers.isEmpty() + && (set->flags & SetFlag::NotLoaded)) { session().api().scheduleStickerSetRequest(setId, set->access); } } @@ -1042,7 +1050,7 @@ bool StickersBox::Inner::Row::isRecentSet() const { } bool StickersBox::Inner::Row::isMasksSet() const { - return (set->flags & MTPDstickerSet::Flag::f_masks); + return (set->flags & SetFlag::Masks); } StickersBox::Inner::Inner( @@ -1909,7 +1917,7 @@ void StickersBox::Inner::rebuildMegagroupSet() { const auto &sets = session().data().stickers().sets(); auto it = sets.find(setId); if (it == sets.cend() - || (it->second->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + || (it->second->flags & SetFlag::NotLoaded)) { session().api().scheduleStickerSetRequest( _megagroupSetInput.id, _megagroupSetInput.accessHash); @@ -2011,7 +2019,7 @@ void StickersBox::Inner::rebuild(bool masks) { rebuildAppendSet(set, maxNameWidth); if (set->stickers.isEmpty() - || (set->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + || (set->flags & SetFlag::NotLoaded)) { session().api().scheduleStickerSetRequest(set->id, set->access); } } @@ -2226,11 +2234,11 @@ void StickersBox::Inner::fillSetFlags( bool *outOfficial, bool *outUnread, bool *outArchived) { - *outInstalled = (set->flags & MTPDstickerSet::Flag::f_installed_date); - *outOfficial = (set->flags & MTPDstickerSet::Flag::f_official); - *outArchived = (set->flags & MTPDstickerSet::Flag::f_archived); + *outInstalled = (set->flags & SetFlag::Installed); + *outOfficial = (set->flags & SetFlag::Official); + *outArchived = (set->flags & SetFlag::Archived); if (_section == Section::Featured) { - *outUnread = (set->flags & MTPDstickerSet_ClientFlag::f_unread); + *outUnread = (set->flags & SetFlag::Unread); } else { *outUnread = false; } diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 6c19b6dc0..d551cc37d 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -57,10 +57,10 @@ constexpr auto kOfficialLoadLimit = 40; using Data::StickersSet; using Data::StickersPack; using Data::StickersSetThumbnailView; +using SetFlag = Data::StickersSetFlag; -bool SetInMyList(MTPDstickerSet::Flags flags) { - return (flags & MTPDstickerSet::Flag::f_installed_date) - && !(flags & MTPDstickerSet::Flag::f_archived); +[[nodiscard]] bool SetInMyList(Data::StickersSetFlags flags) { + return (flags & SetFlag::Installed) && !(flags & SetFlag::Archived); } } // namespace @@ -218,7 +218,7 @@ auto StickersListWidget::PrepareStickers( StickersListWidget::Set::Set( uint64 id, StickersSet *set, - MTPDstickerSet::Flags flags, + Data::StickersSetFlags flags, const QString &title, const QString &shortName, int count, @@ -1110,7 +1110,7 @@ void StickersListWidget::readVisibleFeatured( const auto rowTo = ceilclamp(visibleBottom, rowHeight, 0, _featuredSetsCount); for (auto i = rowFrom; i < rowTo; ++i) { auto &set = _officialSets[i]; - if (!(set.flags & MTPDstickerSet_ClientFlag::f_unread)) { + if (!(set.flags & SetFlag::Unread)) { continue; } if (i * rowHeight < visibleTop || (i + 1) * rowHeight > visibleBottom) { @@ -1604,8 +1604,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) { auto &set = sets[info.section]; if (set.externalLayout) { const auto loadedCount = int(set.stickers.size()); - const auto count = (set.flags - & MTPDstickerSet_ClientFlag::f_not_loaded) + const auto count = (set.flags & SetFlag::NotLoaded) ? set.count : loadedCount; @@ -1633,7 +1632,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) { int checky = add.top() + (add.height() - st::stickersFeaturedInstalled.height()) / 2; st::stickersFeaturedInstalled.paint(p, QPoint(checkx, checky), width()); } - if (set.flags & MTPDstickerSet_ClientFlag::f_unread) { + if (set.flags & SetFlag::Unread) { widthForTitle -= st::stickersFeaturedUnreadSize + st::stickersFeaturedUnreadSkip; } @@ -1647,7 +1646,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) { p.setPen(st::stickersTrendingHeaderFg); p.drawTextLeft(st::emojiPanHeaderLeft - st::roundRadiusSmall, info.top + st::stickersTrendingHeaderTop, width(), titleText, titleWidth); - if (set.flags & MTPDstickerSet_ClientFlag::f_unread) { + if (set.flags & SetFlag::Unread) { p.setPen(Qt::NoPen); p.setBrush(st::stickersFeaturedUnreadBg); @@ -1709,7 +1708,7 @@ void StickersListWidget::paintStickers(Painter &p, QRect clip) { paintMegagroupEmptySet(p, info.rowsTop, buttonSelected); return true; } - auto special = (set.flags & MTPDstickerSet::Flag::f_official) != 0; + auto special = (set.flags & SetFlag::Official) != 0; auto fromRow = floorclamp(clip.y() - info.rowsTop, _singleSize.height(), 0, info.rowsCount); auto toRow = ceilclamp(clip.y() + clip.height() - info.rowsTop, _singleSize.height(), 0, info.rowsCount); for (int i = fromRow; i < toRow; ++i) { @@ -2024,7 +2023,7 @@ bool StickersListWidget::hasRemoveButton(int index) const { return false; } auto flags = set.flags; - if (!(flags & MTPDstickerSet_ClientFlag::f_special)) { + if (!(flags & SetFlag::Special)) { return true; } if (set.id == Data::Stickers::MegagroupSetId) { @@ -2458,8 +2457,8 @@ void StickersListWidget::refreshFeaturedSets() { auto &set = *i; auto it = sets.find(set.id); if (it == sets.cend() - || ((it->second->flags & MTPDstickerSet::Flag::f_installed_date) - && !(it->second->flags & MTPDstickerSet::Flag::f_archived) + || ((it->second->flags & SetFlag::Installed) + && !(it->second->flags & SetFlag::Archived) && !_installedLocallySets.contains(set.id))) { continue; } @@ -2492,7 +2491,7 @@ void StickersListWidget::refreshSearchSets() { void StickersListWidget::refreshSearchIndex() { _searchIndex.clear(); for (const auto &set : _mySets) { - if (set.flags & MTPDstickerSet_ClientFlag::f_special) { + if (set.flags & SetFlag::Special) { continue; } const auto string = set.title + ' ' + set.shortName; @@ -2544,12 +2543,12 @@ bool StickersListWidget::appendSet( } const auto set = it->second.get(); if ((skip == AppendSkip::Archived) - && (set->flags & MTPDstickerSet::Flag::f_archived)) { + && (set->flags & SetFlag::Archived)) { return false; } if ((skip == AppendSkip::Installed) - && (set->flags & MTPDstickerSet::Flag::f_installed_date) - && !(set->flags & MTPDstickerSet::Flag::f_archived)) { + && (set->flags & SetFlag::Installed) + && !(set->flags & SetFlag::Archived)) { if (!_installedLocallySets.contains(setId)) { return false; } @@ -2648,8 +2647,7 @@ void StickersListWidget::refreshRecentStickers(bool performResize) { auto set = Set( Data::Stickers::RecentSetId, nullptr, - (MTPDstickerSet::Flag::f_official - | MTPDstickerSet_ClientFlag::f_special), + (SetFlag::Official | SetFlag::Special), tr::lng_recent_stickers(tr::now), shortName, recentPack.size(), @@ -2691,8 +2689,7 @@ void StickersListWidget::refreshFavedStickers() { _mySets.insert(_mySets.begin(), Set{ Data::Stickers::FavedSetId, nullptr, - (MTPDstickerSet::Flag::f_official - | MTPDstickerSet_ClientFlag::f_special), + (SetFlag::Official | SetFlag::Special), Lang::Hard::FavedSetTitle(), shortName, set->count, @@ -2724,7 +2721,7 @@ void StickersListWidget::refreshMegagroupStickers(GroupStickersPlace place) { _mySets.emplace_back( Data::Stickers::MegagroupSetId, nullptr, - MTPDstickerSet_ClientFlag::f_special | 0, + SetFlag::Special, tr::lng_group_stickers(tr::now), shortName, count, @@ -2752,8 +2749,8 @@ void StickersListWidget::refreshMegagroupStickers(GroupStickersPlace place) { const auto it = sets.find(set.id); if (it != sets.cend()) { const auto set = it->second.get(); - auto isInstalled = (set->flags & MTPDstickerSet::Flag::f_installed_date) - && !(set->flags & MTPDstickerSet::Flag::f_archived); + auto isInstalled = (set->flags & SetFlag::Installed) + && !(set->flags & SetFlag::Archived); if (isInstalled && !canEdit) { removeHiddenForGroup(); } else if (isShownHere(hidden)) { @@ -2762,7 +2759,7 @@ void StickersListWidget::refreshMegagroupStickers(GroupStickersPlace place) { _mySets.emplace_back( Data::Stickers::MegagroupSetId, set, - MTPDstickerSet_ClientFlag::f_special | 0, + SetFlag::Special, tr::lng_group_stickers(tr::now), shortName, set->count, @@ -2868,7 +2865,7 @@ void StickersListWidget::updateSelected() { newSelected = OverButton { section }; } else if (featuredHasAddButton(section) && myrtlrect(featuredAddRect(section)).contains(p.x(), p.y())) { newSelected = OverButton{ section }; - } else if (!(sets[section].flags & MTPDstickerSet_ClientFlag::f_special)) { + } else if (!(sets[section].flags & SetFlag::Special)) { newSelected = OverSet { section }; } else if (sets[section].id == Data::Stickers::MegagroupSetId && (_megagroupSet->canEditStickers() || !sets[section].stickers.empty())) { @@ -2882,7 +2879,7 @@ void StickersListWidget::updateSelected() { newSelected = OverGroupAdd {}; } } else { - auto special = ((set.flags & MTPDstickerSet::Flag::f_official) != 0); + auto special = ((set.flags & SetFlag::Official) != 0); auto rowIndex = qFloor(yOffset / _singleSize.height()); auto columnIndex = qFloor(sx / _singleSize.width()); auto index = rowIndex * _columnCount + columnIndex; @@ -3113,8 +3110,7 @@ void StickersListWidget::installSet(uint64 setId) { if (it != sets.cend()) { const auto set = it->second.get(); const auto input = set->mtpInput(); - if ((set->flags & MTPDstickerSet_ClientFlag::f_not_loaded) - || set->stickers.empty()) { + if ((set->flags & SetFlag::NotLoaded) || set->stickers.empty()) { _api.request(MTPmessages_GetStickerSet( input )).done([=](const MTPmessages_StickerSet &result) { @@ -3212,13 +3208,13 @@ void StickersListWidget::removeSet(uint64 setId) { ++i; } } - set->flags &= ~MTPDstickerSet::Flag::f_installed_date; + set->flags &= ~SetFlag::Installed; set->installDate = TimeId(0); // // Set can be in search results. // - //if (!(set->flags & MTPDstickerSet_ClientFlag::f_featured) - // && !(set->flags & MTPDstickerSet_ClientFlag::f_special)) { + //if (!(set->flags & SetFlag::Featured) + // && !(set->flags & SetFlag::Special)) { // sets.erase(it); //} const auto removeIndex = defaultSetsOrder().indexOf( @@ -3227,7 +3223,7 @@ void StickersListWidget::removeSet(uint64 setId) { defaultSetsOrderRef().removeAt(removeIndex); } refreshStickers(); - if (set->flags & MTPDstickerSet::Flag::f_masks) { + if (set->flags & SetFlag::Masks) { session().local().writeInstalledMasks(); } else { session().local().writeInstalledStickers(); diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h index 58fa39802..cfc0d853d 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.h @@ -192,7 +192,7 @@ private: Set( uint64 id, Data::StickersSet *set, - MTPDstickerSet::Flags flags, + Data::StickersSetFlags flags, const QString &title, const QString &shortName, int count, @@ -204,7 +204,7 @@ private: uint64 id = 0; Data::StickersSet *set = nullptr; - MTPDstickerSet::Flags flags = MTPDstickerSet::Flags(); + Data::StickersSetFlags flags; QString title; QString shortName; std::vector stickers; @@ -218,7 +218,7 @@ private: }; struct FeaturedSet { uint64 id = 0; - MTPDstickerSet::Flags flags = MTPDstickerSet::Flags(); + Data::StickersSetFlags flags; std::vector stickers; }; diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index 8b5a91be1..75c8fb691 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -1051,18 +1051,20 @@ bool DocumentData::saveFromDataChecked() { bool DocumentData::isStickerSetInstalled() const { Expects(sticker() != nullptr); + using SetFlag = Data::StickersSetFlag; + const auto &sets = _owner->stickers().sets(); if (const auto id = sticker()->set.id) { const auto i = sets.find(id); return (i != sets.cend()) - && !(i->second->flags & MTPDstickerSet::Flag::f_archived) - && (i->second->flags & MTPDstickerSet::Flag::f_installed_date); + && !(i->second->flags & SetFlag::Archived) + && (i->second->flags & SetFlag::Installed); } else if (!sticker()->set.shortName.isEmpty()) { const auto name = sticker()->set.shortName.toLower(); for (const auto &[id, set] : sets) { if (set->shortName.toLower() == name) { - return !(set->flags & MTPDstickerSet::Flag::f_archived) - && (set->flags & MTPDstickerSet::Flag::f_installed_date); + return !(set->flags & SetFlag::Archived) + && (set->flags & SetFlag::Installed); } } return false; diff --git a/Telegram/SourceFiles/data/stickers/data_stickers.cpp b/Telegram/SourceFiles/data/stickers/data_stickers.cpp index f0e75e0bd..c71ff6f34 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers.cpp +++ b/Telegram/SourceFiles/data/stickers/data_stickers.cpp @@ -29,9 +29,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_chat_helpers.h" namespace Data { - namespace { +using SetFlag = StickersSetFlag; + void RemoveFromSet( StickersSets &sets, not_null document, @@ -130,7 +131,7 @@ void Stickers::incrementSticker(not_null document) { QString(), 0, // count 0, // hash - MTPDstickerSet_ClientFlag::f_special | 0, + SetFlag::Special, TimeId(0))).first; } else { it->second->title = tr::lng_recent_stickers(tr::now); @@ -288,7 +289,7 @@ void Stickers::applyArchivedResult( if (set->stickers.isEmpty()) { setsToRequest.insert(set->id, set->access); } - const auto masks = !!(set->flags & MTPDstickerSet::Flag::f_masks); + const auto masks = !!(set->flags & SetFlag::Masks); (masks ? masksCount : stickersCount)++; auto &order = masks ? maskSetsOrderRef() : setsOrderRef(); const auto index = order.indexOf(set->id); @@ -325,41 +326,6 @@ void Stickers::applyArchivedResult( notifyUpdated(); } -// For testing: Just apply random subset or your sticker sets as archived. -bool Stickers::applyArchivedResultFake() { - auto sets = QVector(); - for (const auto &[id, set] : this->sets()) { - const auto raw = set.get(); - if ((raw->flags & MTPDstickerSet::Flag::f_installed_date) - && !(raw->flags & MTPDstickerSet_ClientFlag::f_special)) { - if (openssl::RandomValue() % 128 < 64) { - const auto data = MTP_stickerSet( - MTP_flags(raw->flags | MTPDstickerSet::Flag::f_archived), - MTP_int(raw->installDate), - MTP_long(raw->id), - MTP_long(raw->access), - MTP_string(raw->title), - MTP_string(raw->shortName), - MTP_vector(), - MTP_int(0), - MTP_int(0), - MTP_int(raw->count), - MTP_int(raw->hash)); - sets.push_back(MTP_stickerSetCovered( - data, - MTP_documentEmpty(MTP_long(0)))); - } - } - } - if (sets.size() > 3) { - sets = sets.mid(0, 3); - } - auto result = MTP_messages_stickerSetInstallResultArchive( - MTP_vector(sets)); - applyArchivedResult(result.c_messages_stickerSetInstallResultArchive()); - return true; -} - void Stickers::installLocally(uint64 setId) { auto &sets = setsRef(); auto it = sets.find(setId); @@ -369,13 +335,12 @@ void Stickers::installLocally(uint64 setId) { const auto set = it->second.get(); auto flags = set->flags; - set->flags &= ~(MTPDstickerSet::Flag::f_archived - | MTPDstickerSet_ClientFlag::f_unread); - set->flags |= MTPDstickerSet::Flag::f_installed_date; + set->flags &= ~(SetFlag::Archived | SetFlag::Unread); + set->flags |= SetFlag::Installed; set->installDate = base::unixtime::now(); auto changedFlags = flags ^ set->flags; - const auto masks = !!(flags & MTPDstickerSet::Flag::f_masks); + const auto masks = !!(flags & SetFlag::Masks); auto &order = masks ? maskSetsOrderRef() : setsOrderRef(); int insertAtIndex = 0, currentIndex = order.indexOf(setId); if (currentIndex != insertAtIndex) { @@ -397,10 +362,10 @@ void Stickers::installLocally(uint64 setId) { } } session().local().writeInstalledStickers(); - if (changedFlags & MTPDstickerSet_ClientFlag::f_unread) { + if (changedFlags & SetFlag::Unread) { session().local().writeFeaturedStickers(); } - if (changedFlags & MTPDstickerSet::Flag::f_archived) { + if (changedFlags & SetFlag::Archived) { auto &archivedOrder = masks ? archivedMaskSetsOrderRef() : archivedSetsOrderRef(); @@ -425,7 +390,7 @@ void Stickers::undoInstallLocally(uint64 setId) { } const auto set = it->second.get(); - set->flags &= ~MTPDstickerSet::Flag::f_installed_date; + set->flags &= ~SetFlag::Installed; set->installDate = TimeId(0); auto &order = setsOrderRef(); @@ -519,7 +484,7 @@ void Stickers::setIsFaved( QString(), 0, // count 0, // hash - MTPDstickerSet_ClientFlag::f_special | 0, + SetFlag::Special, TimeId(0))).first; } const auto set = it->second.get(); @@ -610,17 +575,14 @@ void Stickers::setsReceived(const QVector &data, int32 hash) { : setsOrderRef(); setsOrder.clear(); - using Flag = MTPDstickerSet::Flag; - using ClientFlag = MTPDstickerSet_ClientFlag; - auto &sets = setsRef(); QMap setsToRequest; for (auto &[id, set] : sets) { - const auto archived = !!(set->flags & Flag::f_archived); - const auto masks = !!(set->flags & MTPDstickerSet::Flag::f_masks); + const auto archived = !!(set->flags & SetFlag::Archived); + const auto masks = !!(set->flags & SetFlag::Masks); if (!archived && (masksReceived == masks)) { // Mark for removing. - set->flags &= ~Flag::f_installed_date; + set->flags &= ~SetFlag::Installed; set->installDate = 0; } } @@ -629,11 +591,11 @@ void Stickers::setsReceived(const QVector &data, int32 hash) { continue; } const auto set = feedSet(setData.c_stickerSet()); - if (!(set->flags & Flag::f_archived) - || (set->flags & Flag::f_official)) { + if (!(set->flags & SetFlag::Archived) + || (set->flags & SetFlag::Official)) { setsOrder.push_back(set->id); if (set->stickers.isEmpty() - || (set->flags & ClientFlag::f_not_loaded)) { + || (set->flags & SetFlag::NotLoaded)) { setsToRequest.insert(set->id, set->access); } } @@ -642,10 +604,10 @@ void Stickers::setsReceived(const QVector &data, int32 hash) { auto &recent = getRecentPack(); for (auto it = sets.begin(); it != sets.end();) { const auto set = it->second.get(); - const auto installed = !!(set->flags & Flag::f_installed_date); - const auto featured = !!(set->flags & ClientFlag::f_featured); - const auto special = !!(set->flags & ClientFlag::f_special); - const auto archived = !!(set->flags & Flag::f_archived); + const auto installed = !!(set->flags & SetFlag::Installed); + const auto featured = !!(set->flags & SetFlag::Featured); + const auto special = !!(set->flags & SetFlag::Special); + const auto archived = !!(set->flags & SetFlag::Archived); if (!installed) { // remove not mine sets from recent stickers for (auto i = recent.begin(); i != recent.cend();) { if (set->stickers.indexOf(i->first) >= 0) { @@ -742,7 +704,7 @@ void Stickers::specialSetReceived( QString(), 0, // count 0, // hash - MTPDstickerSet_ClientFlag::f_special | 0, + SetFlag::Special, TimeId(0))).first; } else { it->second->title = setTitle; @@ -864,7 +826,7 @@ void Stickers::featuredSetsReceived( auto setsToRequest = base::flat_map(); for (auto &[id, set] : sets) { // Mark for removing. - set->flags &= ~MTPDstickerSet_ClientFlag::f_featured; + set->flags &= ~SetFlag::Featured; } for (const auto &entry : list) { const auto data = entry.match([&](const auto &data) { @@ -889,12 +851,12 @@ void Stickers::featuredSetsReceived( } return ImageWithLocation(); }(); + const auto flags = SetFlag::Featured + | (unreadMap.contains(data->vid().v) + ? SetFlag::Unread + : SetFlag()) + | ParseStickersSetFlags(*data); if (it == sets.cend()) { - auto setClientFlags = MTPDstickerSet_ClientFlag::f_featured - | MTPDstickerSet_ClientFlag::f_not_loaded; - if (unreadMap.contains(data->vid().v)) { - setClientFlags |= MTPDstickerSet_ClientFlag::f_unread; - } it = sets.emplace(data->vid().v, std::make_unique( &owner(), data->vid().v, @@ -903,7 +865,7 @@ void Stickers::featuredSetsReceived( qs(data->vshort_name()), data->vcount().v, data->vhash().v, - data->vflags().v | setClientFlags, + flags | SetFlag::NotLoaded, installDate)).first; it->second->setThumbnail(thumbnail); } else { @@ -911,25 +873,19 @@ void Stickers::featuredSetsReceived( set->access = data->vaccess_hash().v; set->title = title; set->shortName = qs(data->vshort_name()); - auto clientFlags = set->flags & (MTPDstickerSet_ClientFlag::f_featured | MTPDstickerSet_ClientFlag::f_unread | MTPDstickerSet_ClientFlag::f_not_loaded | MTPDstickerSet_ClientFlag::f_special); - set->flags = data->vflags().v | clientFlags; - set->flags |= MTPDstickerSet_ClientFlag::f_featured; + set->flags = flags + | (set->flags & (SetFlag::NotLoaded | SetFlag::Special)); set->installDate = installDate; set->setThumbnail(thumbnail); - if (unreadMap.contains(set->id)) { - set->flags |= MTPDstickerSet_ClientFlag::f_unread; - } else { - set->flags &= ~MTPDstickerSet_ClientFlag::f_unread; - } if (set->count != data->vcount().v || set->hash != data->vhash().v || set->emoji.isEmpty()) { set->count = data->vcount().v; set->hash = data->vhash().v; - set->flags |= MTPDstickerSet_ClientFlag::f_not_loaded; // need to request this set + set->flags |= SetFlag::NotLoaded; // need to request this set } } setsOrder.push_back(data->vid().v); if (it->second->stickers.isEmpty() - || (it->second->flags & MTPDstickerSet_ClientFlag::f_not_loaded)) { + || (it->second->flags & SetFlag::NotLoaded)) { setsToRequest.emplace(data->vid().v, data->vaccess_hash().v); } } @@ -937,12 +893,12 @@ void Stickers::featuredSetsReceived( auto unreadCount = 0; for (auto it = sets.begin(); it != sets.end();) { const auto set = it->second.get(); - bool installed = (set->flags & MTPDstickerSet::Flag::f_installed_date); - bool featured = (set->flags & MTPDstickerSet_ClientFlag::f_featured); - bool special = (set->flags & MTPDstickerSet_ClientFlag::f_special); - bool archived = (set->flags & MTPDstickerSet::Flag::f_archived); + bool installed = (set->flags & SetFlag::Installed); + bool featured = (set->flags & SetFlag::Featured); + bool special = (set->flags & SetFlag::Special); + bool archived = (set->flags & SetFlag::Archived); if (installed || featured || special || archived) { - if (featured && (set->flags & MTPDstickerSet_ClientFlag::f_unread)) { + if (featured && (set->flags & SetFlag::Unread)) { ++unreadCount; } ++it; @@ -1097,7 +1053,7 @@ std::vector> Stickers::getListByEmoji( } const auto addList = [&]( const StickersSetsOrder &order, - MTPDstickerSet::Flag skip) { + SetFlag skip) { for (const auto setId : order) { auto it = sets.find(setId); if (it == sets.cend() || (it->second->flags & skip)) { @@ -1106,14 +1062,14 @@ std::vector> Stickers::getListByEmoji( const auto set = it->second.get(); if (set->emoji.isEmpty()) { setsToRequest.emplace(set->id, set->access); - set->flags |= MTPDstickerSet_ClientFlag::f_not_loaded; + set->flags |= SetFlag::NotLoaded; continue; } auto i = set->emoji.constFind(original); if (i == set->emoji.cend()) { continue; } - const auto my = (set->flags & MTPDstickerSet::Flag::f_installed_date); + const auto my = (set->flags & SetFlag::Installed); result.reserve(result.size() + i->size()); for (const auto document : *i) { const auto installDate = my ? set->installDate : TimeId(0); @@ -1127,12 +1083,8 @@ std::vector> Stickers::getListByEmoji( } }; - addList( - setsOrder(), - MTPDstickerSet::Flag::f_archived); - //addList( - // featuredSetsOrder(), - // MTPDstickerSet::Flag::f_installed_date); + addList(setsOrder(), SetFlag::Archived); + //addList(featuredSetsOrder(), SetFlag::Installed); if (!setsToRequest.empty()) { for (const auto &[setId, accessHash] : setsToRequest) { @@ -1195,7 +1147,7 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { auto &sets = setsRef(); auto it = sets.find(data.vid().v); auto title = getSetTitle(data); - auto flags = MTPDstickerSet::Flags(0); + auto oldFlags = StickersSetFlags(0); const auto thumbnail = [&] { if (const auto thumbs = data.vthumbs()) { for (const auto &thumb : thumbs->v) { @@ -1210,6 +1162,7 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { } return ImageWithLocation(); }(); + const auto flags = ParseStickersSetFlags(data); if (it == sets.cend()) { it = sets.emplace(data.vid().v, std::make_unique( &owner(), @@ -1219,7 +1172,7 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { qs(data.vshort_name()), data.vcount().v, data.vhash().v, - data.vflags().v | MTPDstickerSet_ClientFlag::f_not_loaded, + flags | SetFlag::NotLoaded, data.vinstalled_date().value_or_empty())).first; it->second->setThumbnail(thumbnail); } else { @@ -1227,13 +1180,13 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { set->access = data.vaccess_hash().v; set->title = title; set->shortName = qs(data.vshort_name()); - flags = set->flags; - auto clientFlags = set->flags - & (MTPDstickerSet_ClientFlag::f_featured - | MTPDstickerSet_ClientFlag::f_unread - | MTPDstickerSet_ClientFlag::f_not_loaded - | MTPDstickerSet_ClientFlag::f_special); - set->flags = data.vflags().v | clientFlags; + oldFlags = set->flags; + const auto clientFlags = set->flags + & (SetFlag::Featured + | SetFlag::Unread + | SetFlag::NotLoaded + | SetFlag::Special); + set->flags = flags | clientFlags; const auto installDate = data.vinstalled_date(); set->installDate = installDate ? (installDate->v ? installDate->v : base::unixtime::now()) @@ -1245,18 +1198,18 @@ StickersSet *Stickers::feedSet(const MTPDstickerSet &data) { // Need to request this data. set->count = data.vcount().v; set->hash = data.vhash().v; - set->flags |= MTPDstickerSet_ClientFlag::f_not_loaded; + set->flags |= SetFlag::NotLoaded; } } const auto set = it->second.get(); - auto changedFlags = (flags ^ set->flags); - if (changedFlags & MTPDstickerSet::Flag::f_archived) { - const auto masks = !!(set->flags & MTPDstickerSet::Flag::f_masks); + auto changedFlags = (oldFlags ^ set->flags); + if (changedFlags & SetFlag::Archived) { + const auto masks = !!(set->flags & SetFlag::Masks); auto &archivedOrder = masks ? archivedMaskSetsOrderRef() : archivedSetsOrderRef(); const auto index = archivedOrder.indexOf(set->id); - if (set->flags & MTPDstickerSet::Flag::f_archived) { + if (set->flags & SetFlag::Archived) { if (index < 0) { archivedOrder.push_front(set->id); } @@ -1278,12 +1231,12 @@ StickersSet *Stickers::feedSetFull(const MTPmessages_StickerSet &data) { const auto wasArchived = [&] { auto it = sets.find(s.vid().v); return (it != sets.end()) - && (it->second->flags & MTPDstickerSet::Flag::f_archived); + && (it->second->flags & SetFlag::Archived); }(); auto set = feedSet(s); - set->flags &= ~MTPDstickerSet_ClientFlag::f_not_loaded; + set->flags &= ~SetFlag::NotLoaded; const auto &d_docs = d.vdocuments().v; auto customIt = sets.find(Stickers::CustomSetId); @@ -1323,7 +1276,7 @@ StickersSet *Stickers::feedSetFull(const MTPmessages_StickerSet &data) { } } - const auto isMasks = !!(set->flags & MTPDstickerSet::Flag::f_masks); + const auto isMasks = !!(set->flags & SetFlag::Masks); if (pack.isEmpty()) { const auto removeIndex = (isMasks ? maskSetsOrder() @@ -1365,15 +1318,15 @@ StickersSet *Stickers::feedSetFull(const MTPmessages_StickerSet &data) { } if (set) { - const auto isArchived = !!(set->flags & MTPDstickerSet::Flag::f_archived); + const auto isArchived = !!(set->flags & SetFlag::Archived); if (isMasks) { session().local().writeInstalledMasks(); - } else if (set->flags & MTPDstickerSet::Flag::f_installed_date) { + } else if (set->flags & SetFlag::Installed) { if (!isArchived) { session().local().writeInstalledStickers(); } } - if (set->flags & MTPDstickerSet_ClientFlag::f_featured) { + if (set->flags & SetFlag::Featured) { session().local().writeFeaturedStickers(); } if (wasArchived != isArchived) { diff --git a/Telegram/SourceFiles/data/stickers/data_stickers_set.cpp b/Telegram/SourceFiles/data/stickers/data_stickers_set.cpp index cc076720c..7198161f1 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers_set.cpp +++ b/Telegram/SourceFiles/data/stickers/data_stickers_set.cpp @@ -45,6 +45,14 @@ QByteArray StickersSetThumbnailView::content() const { return _content; } +StickersSetFlags ParseStickersSetFlags(const MTPDstickerSet &data) { + using Flag = StickersSetFlag; + return (data.is_archived() ? Flag::Archived : Flag()) + | (data.is_official() ? Flag::Official : Flag()) + | (data.is_masks() ? Flag::Masks : Flag()) + | (data.vinstalled_date() ? Flag::Installed : Flag()); +} + StickersSet::StickersSet( not_null owner, uint64 id, @@ -53,7 +61,7 @@ StickersSet::StickersSet( const QString &shortName, int count, int32 hash, - MTPDstickerSet::Flags flags, + StickersSetFlags flags, TimeId installDate) : id(id) , access(access) diff --git a/Telegram/SourceFiles/data/stickers/data_stickers_set.h b/Telegram/SourceFiles/data/stickers/data_stickers_set.h index 8a1dd1ad9..4adf29c57 100644 --- a/Telegram/SourceFiles/data/stickers/data_stickers_set.h +++ b/Telegram/SourceFiles/data/stickers/data_stickers_set.h @@ -45,6 +45,22 @@ private: }; +enum class StickersSetFlag { + Installed = (1 << 0), + Archived = (1 << 1), + Masks = (1 << 2), + Official = (1 << 3), + NotLoaded = (1 << 4), + Featured = (1 << 5), + Unread = (1 << 6), + Special = (1 << 7), +}; +inline constexpr bool is_flag_type(StickersSetFlag) { return true; }; +using StickersSetFlags = base::flags; + +[[nodiscard]] StickersSetFlags ParseStickersSetFlags( + const MTPDstickerSet &data); + class StickersSet final { public: StickersSet( @@ -55,7 +71,7 @@ public: const QString &shortName, int count, int32 hash, - MTPDstickerSet::Flags flags, + StickersSetFlags flags, TimeId installDate); [[nodiscard]] Data::Session &owner() const; @@ -81,7 +97,7 @@ public: QString title, shortName; int count = 0; int32 hash = 0; - MTPDstickerSet::Flags flags; + StickersSetFlags flags; TimeId installDate = 0; StickersPack covers; StickersPack stickers; diff --git a/Telegram/SourceFiles/mtproto/type_utils.h b/Telegram/SourceFiles/mtproto/type_utils.h index 173872a96..0b1b69fe8 100644 --- a/Telegram/SourceFiles/mtproto/type_utils.h +++ b/Telegram/SourceFiles/mtproto/type_utils.h @@ -94,21 +94,3 @@ enum class MTPDreplyKeyboardMarkup_ClientFlag : uint32 { MIN_FIELD = (1U << 27), }; DEFINE_MTP_CLIENT_FLAGS(MTPDreplyKeyboardMarkup) - -enum class MTPDstickerSet_ClientFlag : uint32 { - // sticker set is not yet loaded - f_not_loaded = (1U << 30), - - // sticker set is one of featured (should be saved locally) - f_featured = (1U << 29), - - // sticker set is an unread featured set - f_unread = (1U << 28), - - // special set like recent or custom stickers - f_special = (1U << 27), - - // update this when adding new client side flags - MIN_FIELD = (1U << 27), -}; -DEFINE_MTP_CLIENT_FLAGS(MTPDstickerSet) diff --git a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.mm b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.mm index adbf7e6ac..c7930a5f9 100644 --- a/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.mm +++ b/Telegram/SourceFiles/platform/mac/touchbar/items/mac_scrubber_item.mm @@ -206,10 +206,10 @@ void AppendStickerSet( return; } const auto set = it->second.get(); - if (set->flags & MTPDstickerSet::Flag::f_archived) { + if (set->flags & Data::StickersSetFlag::Archived) { return; } - if (!(set->flags & MTPDstickerSet::Flag::f_installed_date)) { + if (!(set->flags & Data::StickersSetFlag::Installed)) { return; } diff --git a/Telegram/SourceFiles/storage/storage_account.cpp b/Telegram/SourceFiles/storage/storage_account.cpp index a750cca59..a2a9784d1 100644 --- a/Telegram/SourceFiles/storage/storage_account.cpp +++ b/Telegram/SourceFiles/storage/storage_account.cpp @@ -1511,6 +1511,7 @@ Cache::Database::Settings Account::cacheBigFileSettings() const { void Account::writeStickerSet( QDataStream &stream, const Data::StickersSet &set) { + using SetFlag = Data::StickersSetFlag; const auto writeInfo = [&](int count) { stream << quint64(set.id) @@ -1523,7 +1524,7 @@ void Account::writeStickerSet( << qint32(set.installDate); Serialize::writeImageLocation(stream, set.thumbnailLocation()); }; - if (set.flags & MTPDstickerSet_ClientFlag::f_not_loaded) { + if (set.flags & SetFlag::NotLoaded) { writeInfo(-set.count); return; } else if (set.stickers.isEmpty()) { @@ -1564,6 +1565,8 @@ void Account::writeStickerSets( FileKey &stickersKey, CheckSet checkSet, const Data::StickersSetsOrder &order) { + using SetFlag = Data::StickersSetFlag; + const auto &sets = _owner->session().data().stickers().sets(); if (sets.empty()) { if (stickersKey) { @@ -1593,7 +1596,7 @@ void Account::writeStickerSets( + Serialize::stringSize(raw->shortName) + sizeof(qint32) * 4 + Serialize::imageLocationSize(raw->thumbnailLocation()); - if (raw->flags & MTPDstickerSet_ClientFlag::f_not_loaded) { + if (raw->flags & SetFlag::NotLoaded) { continue; } @@ -1651,7 +1654,9 @@ void Account::writeStickerSets( void Account::readStickerSets( FileKey &stickersKey, Data::StickersSetsOrder *outOrder, - MTPDstickerSet::Flags readingFlags) { + Data::StickersSetFlags readingFlags) { + using SetFlag = Data::StickersSetFlag; + FileReadDescriptor stickers; if (!ReadEncryptedFile(stickers, stickersKey, _basePath, _localKey)) { ClearKey(stickersKey, _basePath); @@ -1689,7 +1694,7 @@ void Account::readStickerSets( qint32 scnt = 0; qint32 setInstallDate = 0; qint32 setHash = 0; - MTPDstickerSet::Flags setFlags = 0; + Data::StickersSetFlags setFlags = 0; qint32 setFlagsValue = 0; ImageLocation setThumbnail; @@ -1714,20 +1719,47 @@ void Account::readStickerSets( setThumbnail = *thumbnail; } - setFlags = MTPDstickerSet::Flags::from_raw(setFlagsValue); + if (stickers.version >= 2008007) { + setFlags = Data::StickersSetFlags::from_raw(setFlagsValue); + } else { + using Saved = MTPDstickerSet::Flag; + using Flag = SetFlag; + struct Conversion { + Saved saved; + Flag flag; + }; + const auto conversions = { + Conversion{ Saved::f_archived, Flag::Archived }, + Conversion{ Saved::f_installed_date, Flag::Installed }, + Conversion{ Saved::f_masks, Flag::Masks }, + Conversion{ Saved::f_official, Flag::Official }, + Conversion{ Saved(1U << 30), Flag::NotLoaded }, + Conversion{ Saved(1U << 29), Flag::Featured }, + Conversion{ Saved(1U << 28), Flag::Unread }, + Conversion{ Saved(1U << 27), Flag::Special }, + }; + auto flagsSet = Flag() | 0; + for (const auto &conversion : conversions) { + if (setFlagsValue & int(conversion.saved)) { + flagsSet |= conversion.flag; + } + } + setFlags = flagsSet; + } + if (setId == Data::Stickers::DefaultSetId) { setTitle = tr::lng_stickers_default_set(tr::now); - setFlags |= MTPDstickerSet::Flag::f_official | MTPDstickerSet_ClientFlag::f_special; + setFlags |= SetFlag::Official | SetFlag::Special; } else if (setId == Data::Stickers::CustomSetId) { setTitle = qsl("Custom stickers"); - setFlags |= MTPDstickerSet_ClientFlag::f_special; + setFlags |= SetFlag::Special; } else if ((setId == Data::Stickers::CloudRecentSetId) || (setId == Data::Stickers::CloudRecentAttachedSetId)) { setTitle = tr::lng_recent_stickers(tr::now); - setFlags |= MTPDstickerSet_ClientFlag::f_special; + setFlags |= SetFlag::Special; } else if (setId == Data::Stickers::FavedSetId) { setTitle = Lang::Hard::FavedSetTitle(); - setFlags |= MTPDstickerSet_ClientFlag::f_special; + setFlags |= SetFlag::Special; } else if (!setId) { continue; } @@ -1735,7 +1767,7 @@ void Account::readStickerSets( auto it = sets.find(setId); if (it == sets.cend()) { // We will set this flags from order lists when reading those stickers. - setFlags &= ~(MTPDstickerSet::Flag::f_installed_date | MTPDstickerSet_ClientFlag::f_featured); + setFlags &= ~(SetFlag::Installed | SetFlag::Featured); it = sets.emplace(setId, std::make_unique( &_owner->session().data(), setId, @@ -1744,7 +1776,7 @@ void Account::readStickerSets( setShortName, 0, setHash, - MTPDstickerSet::Flags(setFlags), + setFlags, setInstallDate)).first; it->second->setThumbnail( ImageWithLocation{ .location = setThumbnail }); @@ -1782,7 +1814,7 @@ void Account::readStickerSets( read.emplace(document->id); if (fillStickers) { set->stickers.push_back(document); - if (!(set->flags & MTPDstickerSet_ClientFlag::f_special)) { + if (!(set->flags & SetFlag::Special)) { if (!document->sticker()->set.id) { document->sticker()->set = inputSet; } @@ -1871,7 +1903,7 @@ void Account::readStickerSets( if (it != sets.cend()) { const auto set = it->second.get(); set->flags |= readingFlags; - if ((readingFlags == MTPDstickerSet::Flag::f_installed_date) + if ((readingFlags == SetFlag::Installed) && !set->installDate) { set->installDate = kDefaultStickerInstallDate; } @@ -1881,20 +1913,25 @@ void Account::readStickerSets( } void Account::writeInstalledStickers() { + using SetFlag = Data::StickersSetFlag; + writeStickerSets(_installedStickersKey, [](const Data::StickersSet &set) { if (set.id == Data::Stickers::CloudRecentSetId || set.id == Data::Stickers::FavedSetId - || set.id == Data::Stickers::CloudRecentAttachedSetId) { // separate files for them + || set.id == Data::Stickers::CloudRecentAttachedSetId) { + // separate files for them return StickerSetCheckResult::Skip; - } else if (set.flags & MTPDstickerSet_ClientFlag::f_special) { + } else if (set.flags & SetFlag::Special) { if (set.stickers.isEmpty()) { // all other special are "installed" return StickerSetCheckResult::Skip; } - } else if (!(set.flags & MTPDstickerSet::Flag::f_installed_date) || (set.flags & MTPDstickerSet::Flag::f_archived)) { + } else if (!(set.flags & SetFlag::Installed) + || (set.flags & SetFlag::Archived)) { return StickerSetCheckResult::Skip; - } else if (set.flags & MTPDstickerSet::Flag::f_masks) { + } else if (set.flags & SetFlag::Masks) { return StickerSetCheckResult::Skip; - } else if (set.flags & MTPDstickerSet_ClientFlag::f_not_loaded) { // waiting to receive + } else if (set.flags & SetFlag::NotLoaded) { + // waiting to receive return StickerSetCheckResult::Abort; } else if (set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; @@ -1904,16 +1941,19 @@ void Account::writeInstalledStickers() { } void Account::writeFeaturedStickers() { + using SetFlag = Data::StickersSetFlag; + writeStickerSets(_featuredStickersKey, [](const Data::StickersSet &set) { if (set.id == Data::Stickers::CloudRecentSetId || set.id == Data::Stickers::FavedSetId - || set.id == Data::Stickers::CloudRecentAttachedSetId) { // separate files for them + || set.id == Data::Stickers::CloudRecentAttachedSetId) { + // separate files for them return StickerSetCheckResult::Skip; - } else if (set.flags & MTPDstickerSet_ClientFlag::f_special) { + } else if (set.flags & SetFlag::Special) { return StickerSetCheckResult::Skip; - } else if (!(set.flags & MTPDstickerSet_ClientFlag::f_featured)) { + } else if (!(set.flags & SetFlag::Featured)) { return StickerSetCheckResult::Skip; - } else if (set.flags & MTPDstickerSet_ClientFlag::f_not_loaded) { // waiting to receive + } else if (set.flags & SetFlag::NotLoaded) { // waiting to receive return StickerSetCheckResult::Abort; } else if (set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; @@ -1924,7 +1964,8 @@ void Account::writeFeaturedStickers() { void Account::writeRecentStickers() { writeStickerSets(_recentStickersKey, [](const Data::StickersSet &set) { - if (set.id != Data::Stickers::CloudRecentSetId || set.stickers.isEmpty()) { + if (set.id != Data::Stickers::CloudRecentSetId + || set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; } return StickerSetCheckResult::Write; @@ -1941,11 +1982,14 @@ void Account::writeFavedStickers() { } void Account::writeArchivedStickers() { + using SetFlag = Data::StickersSetFlag; + writeStickerSets(_archivedStickersKey, [](const Data::StickersSet &set) { - if (set.flags & MTPDstickerSet::Flag::f_masks) { + if (set.flags & SetFlag::Masks) { return StickerSetCheckResult::Skip; } - if (!(set.flags & MTPDstickerSet::Flag::f_archived) || set.stickers.isEmpty()) { + if (!(set.flags & SetFlag::Archived) + || set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; } return StickerSetCheckResult::Write; @@ -1953,11 +1997,13 @@ void Account::writeArchivedStickers() { } void Account::writeArchivedMasks() { + using SetFlag = Data::StickersSetFlag; + writeStickerSets(_archivedStickersKey, [](const Data::StickersSet &set) { - if (!(set.flags & MTPDstickerSet::Flag::f_masks)) { + if (!(set.flags & SetFlag::Masks)) { return StickerSetCheckResult::Skip; } - if (!(set.flags & MTPDstickerSet::Flag::f_archived) || set.stickers.isEmpty()) { + if (!(set.flags & SetFlag::Archived) || set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; } return StickerSetCheckResult::Write; @@ -1965,8 +2011,10 @@ void Account::writeArchivedMasks() { } void Account::writeInstalledMasks() { + using SetFlag = Data::StickersSetFlag; + writeStickerSets(_installedMasksKey, [](const Data::StickersSet &set) { - if (!(set.flags & MTPDstickerSet::Flag::f_masks) || set.stickers.isEmpty()) { + if (!(set.flags & SetFlag::Masks) || set.stickers.isEmpty()) { return StickerSetCheckResult::Skip; } return StickerSetCheckResult::Write; @@ -1984,6 +2032,8 @@ void Account::writeRecentMasks() { } void Account::importOldRecentStickers() { + using SetFlag = Data::StickersSetFlag; + if (!_recentStickersKeyOld) { return; } @@ -2015,9 +2065,7 @@ void Account::importOldRecentStickers() { QString(), 0, // count 0, // hash - (MTPDstickerSet::Flag::f_official - | MTPDstickerSet::Flag::f_installed_date - | MTPDstickerSet_ClientFlag::f_special), + (SetFlag::Official | SetFlag::Installed | SetFlag::Special), kDefaultStickerInstallDate)).first->second.get(); const auto custom = sets.emplace( Data::Stickers::CustomSetId, @@ -2029,8 +2077,7 @@ void Account::importOldRecentStickers() { QString(), 0, // count 0, // hash - (MTPDstickerSet::Flag::f_installed_date - | MTPDstickerSet_ClientFlag::f_special), + (SetFlag::Installed | SetFlag::Special), kDefaultStickerInstallDate)).first->second.get(); QMap read; @@ -2112,14 +2159,14 @@ void Account::readInstalledStickers() { readStickerSets( _installedStickersKey, &_owner->session().data().stickers().setsOrderRef(), - MTPDstickerSet::Flag::f_installed_date); + Data::StickersSetFlag::Installed); } void Account::readFeaturedStickers() { readStickerSets( _featuredStickersKey, &_owner->session().data().stickers().featuredSetsOrderRef(), - MTPDstickerSet::Flags() | MTPDstickerSet_ClientFlag::f_featured); + Data::StickersSetFlag::Featured); const auto &sets = _owner->session().data().stickers().sets(); const auto &order = _owner->session().data().stickers().featuredSetsOrder(); @@ -2127,7 +2174,7 @@ void Account::readFeaturedStickers() { for (const auto setId : order) { auto it = sets.find(setId); if (it != sets.cend() - && (it->second->flags & MTPDstickerSet_ClientFlag::f_unread)) { + && (it->second->flags & Data::StickersSetFlag::Unread)) { ++unreadCount; } } @@ -2172,7 +2219,7 @@ void Account::readInstalledMasks() { readStickerSets( _installedMasksKey, &_owner->session().data().stickers().maskSetsOrderRef(), - MTPDstickerSet::Flag::f_installed_date); + Data::StickersSetFlag::Installed); } void Account::writeSavedGifs() { diff --git a/Telegram/SourceFiles/storage/storage_account.h b/Telegram/SourceFiles/storage/storage_account.h index df9093ea4..82eac45a4 100644 --- a/Telegram/SourceFiles/storage/storage_account.h +++ b/Telegram/SourceFiles/storage/storage_account.h @@ -220,7 +220,7 @@ private: void readStickerSets( FileKey &stickersKey, Data::StickersSetsOrder *outOrder = nullptr, - MTPDstickerSet::Flags readingFlags = 0); + Data::StickersSetFlags readingFlags = 0); void importOldRecentStickers(); void readTrustedBots();