Don't use MTP* for StickersSet flags.

This commit is contained in:
John Preston 2021-07-09 09:08:58 +03:00
parent 62fd968409
commit 4206ff0483
14 changed files with 273 additions and 262 deletions

View file

@ -40,6 +40,7 @@ namespace {
int32 CountStickersHash(
not_null<Main::Session*> 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<Main::Session*> 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);
}
}

View file

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

View file

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

View file

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

View file

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

View file

@ -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<Sticker> stickers;
@ -218,7 +218,7 @@ private:
};
struct FeaturedSet {
uint64 id = 0;
MTPDstickerSet::Flags flags = MTPDstickerSet::Flags();
Data::StickersSetFlags flags;
std::vector<Sticker> stickers;
};

View file

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

View file

@ -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<DocumentData*> document,
@ -130,7 +131,7 @@ void Stickers::incrementSticker(not_null<DocumentData*> 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<MTPStickerSetCovered>();
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<uint32>() % 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<MTPPhotoSize>(),
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<MTPStickerSetCovered>(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<MTPStickerSet> &data, int32 hash) {
: setsOrderRef();
setsOrder.clear();
using Flag = MTPDstickerSet::Flag;
using ClientFlag = MTPDstickerSet_ClientFlag;
auto &sets = setsRef();
QMap<uint64, uint64> 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<MTPStickerSet> &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<MTPStickerSet> &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<uint64, uint64>();
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<StickersSet>(
&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<not_null<DocumentData*>> 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<not_null<DocumentData*>> 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<not_null<DocumentData*>> 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<StickersSet>(
&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) {

View file

@ -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<Data::Session*> 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)

View file

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

View file

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

View file

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

View file

@ -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<Data::StickersSet>(
&_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<uint64, bool> 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() {

View file

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