Receive and track recent sticker usage date.

This commit is contained in:
John Preston 2018-03-07 20:43:26 +03:00
parent f0a95032a5
commit ccef155f7a
6 changed files with 70 additions and 11 deletions

View File

@ -1397,7 +1397,9 @@ void ApiWrap::saveStickerSets(
writeRecent = true; writeRecent = true;
} }
_stickersClearRecentRequestId = request(MTPmessages_ClearRecentStickers(MTP_flags(0))).done([this](const MTPBool &result) { _stickersClearRecentRequestId = request(MTPmessages_ClearRecentStickers(
MTP_flags(0)
)).done([this](const MTPBool &result) {
_stickersClearRecentRequestId = 0; _stickersClearRecentRequestId = 0;
}).fail([this](const RPCError &error) { }).fail([this](const RPCError &error) {
_stickersClearRecentRequestId = 0; _stickersClearRecentRequestId = 0;
@ -2301,7 +2303,8 @@ void ApiWrap::requestRecentStickers(TimeId now) {
lang(lng_recent_stickers), lang(lng_recent_stickers),
d.vstickers.v, d.vstickers.v,
d.vhash.v, d.vhash.v,
d.vpacks.v); d.vpacks.v,
d.vdates.v);
} return; } return;
default: Unexpected("Type in ApiWrap::recentStickersDone()"); default: Unexpected("Type in ApiWrap::recentStickersDone()");
} }

View File

@ -405,8 +405,13 @@ void SetsReceived(const QVector<MTPStickerSet> &data, int32 hash) {
Auth().data().notifyStickersUpdated(); Auth().data().notifyStickersUpdated();
} }
void SetPackAndEmoji(Set &set, Pack &&pack, const QVector<MTPStickerPack> &packs) { void SetPackAndEmoji(
Set &set,
Pack &&pack,
const std::vector<TimeId> &&dates,
const QVector<MTPStickerPack> &packs) {
set.stickers = std::move(pack); set.stickers = std::move(pack);
set.dates = std::move(dates);
set.emoji.clear(); set.emoji.clear();
for_const (auto &mtpPack, packs) { for_const (auto &mtpPack, packs) {
Assert(mtpPack.type() == mtpc_stickerPack); Assert(mtpPack.type() == mtpc_stickerPack);
@ -433,12 +438,12 @@ void SpecialSetReceived(
const QString &setTitle, const QString &setTitle,
const QVector<MTPDocument> &items, const QVector<MTPDocument> &items,
int32 hash, int32 hash,
const QVector<MTPStickerPack> &packs) { const QVector<MTPStickerPack> &packs,
const QVector<MTPint> &usageDates) {
auto &sets = Auth().data().stickerSetsRef(); auto &sets = Auth().data().stickerSetsRef();
auto it = sets.find(setId); auto it = sets.find(setId);
auto &d_docs = items; if (items.isEmpty()) {
if (d_docs.isEmpty()) {
if (it != sets.cend()) { if (it != sets.cend()) {
sets.erase(it); sets.erase(it);
} }
@ -458,14 +463,22 @@ void SpecialSetReceived(
} }
it->hash = hash; it->hash = hash;
auto dates = std::vector<TimeId>();
auto dateIndex = 0;
auto datesAvailable = (items.size() == usageDates.size());
auto custom = sets.find(CustomSetId); auto custom = sets.find(CustomSetId);
auto pack = Pack(); auto pack = Pack();
pack.reserve(d_docs.size()); pack.reserve(items.size());
for_const (auto &mtpDocument, d_docs) { for_const (auto &mtpDocument, items) {
const auto date = datesAvailable
? TimeId(usageDates[dateIndex++].v)
: TimeId();
auto document = Auth().data().document(mtpDocument); auto document = Auth().data().document(mtpDocument);
if (!document->sticker()) continue; if (!document->sticker()) continue;
pack.push_back(document); pack.push_back(document);
dates.push_back(date);
if (custom != sets.cend()) { if (custom != sets.cend()) {
auto index = custom->stickers.indexOf(document); auto index = custom->stickers.indexOf(document);
if (index >= 0) { if (index >= 0) {
@ -492,7 +505,7 @@ void SpecialSetReceived(
if (pack.isEmpty()) { if (pack.isEmpty()) {
sets.erase(it); sets.erase(it);
} else { } else {
SetPackAndEmoji(*it, std::move(pack), packs); SetPackAndEmoji(*it, std::move(pack), std::move(dates), packs);
} }
if (writeRecent) { if (writeRecent) {

View File

@ -52,6 +52,7 @@ struct Set {
MTPDstickerSet::Flags flags; MTPDstickerSet::Flags flags;
TimeId installDate = 0; TimeId installDate = 0;
Pack stickers; Pack stickers;
std::vector<TimeId> dates;
Pack covers; Pack covers;
ByEmojiMap emoji; ByEmojiMap emoji;
}; };
@ -77,7 +78,8 @@ void SpecialSetReceived(
const QString &setTitle, const QString &setTitle,
const QVector<MTPDocument> &items, const QVector<MTPDocument> &items,
int32 hash, int32 hash,
const QVector<MTPStickerPack> &packs = QVector<MTPStickerPack>()); const QVector<MTPStickerPack> &packs = QVector<MTPStickerPack>(),
const QVector<MTPint> &usageDates = QVector<MTPint>());
void FeaturedSetsReceived( void FeaturedSetsReceived(
const QVector<MTPStickerSetCovered> &data, const QVector<MTPStickerSetCovered> &data,
const QVector<MTPlong> &unread, const QVector<MTPlong> &unread,

View File

@ -4060,9 +4060,16 @@ void MainWidget::incrementSticker(DocumentData *sticker) {
} }
auto index = it->stickers.indexOf(sticker); auto index = it->stickers.indexOf(sticker);
if (index > 0) { if (index > 0) {
if (!it->dates.empty()) {
Assert(it->dates.size() == it->stickers.size());
it->dates.erase(it->dates.begin() + index);
}
it->stickers.removeAt(index); it->stickers.removeAt(index);
} }
if (index) { if (index) {
if (it->dates.size() == it->stickers.size()) {
it->dates.insert(it->dates.begin(), unixtime());
}
it->stickers.push_front(sticker); it->stickers.push_front(sticker);
writeRecentStickers = true; writeRecentStickers = true;
} }

View File

@ -3216,6 +3216,15 @@ void _writeStickerSet(QDataStream &stream, const Stickers::Set &set) {
for (auto j = set.stickers.cbegin(), e = set.stickers.cend(); j != e; ++j) { for (auto j = set.stickers.cbegin(), e = set.stickers.cend(); j != e; ++j) {
Serialize::Document::writeToStream(stream, *j); Serialize::Document::writeToStream(stream, *j);
} }
if (AppVersion > 1002008) {
stream << qint32(set.dates.size());
if (!set.dates.empty()) {
Assert(set.dates.size() == set.stickers.size());
for (const auto date : set.dates) {
stream << qint32(date);
}
}
}
if (AppVersion > 9018) { if (AppVersion > 9018) {
stream << qint32(set.emoji.size()); stream << qint32(set.emoji.size());
@ -3267,6 +3276,11 @@ void _writeStickerSets(FileKey &stickersKey, CheckSet checkSet, const Stickers::
for_const (auto &sticker, set.stickers) { for_const (auto &sticker, set.stickers) {
size += Serialize::Document::sizeInStream(sticker); size += Serialize::Document::sizeInStream(sticker);
} }
size += sizeof(qint32); // dates count
if (!set.dates.empty()) {
Assert(set.stickers.size() == set.dates.size());
size += set.dates.size() * sizeof(qint32);
}
size += sizeof(qint32); // emojiCount size += sizeof(qint32); // emojiCount
for (auto j = set.emoji.cbegin(), e = set.emoji.cend(); j != e; ++j) { for (auto j = set.emoji.cbegin(), e = set.emoji.cend(); j != e; ++j) {
@ -3432,6 +3446,23 @@ void _readStickerSets(FileKey &stickersKey, Stickers::Order *outOrder = nullptr,
} }
} }
if (stickers.version > 1002008) {
auto datesCount = qint32(0);
stickers.stream >> datesCount;
if (datesCount > 0) {
if (datesCount != scnt) {
// Bad file.
return;
}
set.dates.reserve(datesCount);
for (auto i = 0; i != datesCount; ++i) {
auto date = qint32();
stickers.stream >> date;
set.dates.push_back(TimeId(date));
}
}
}
if (stickers.version > 9018) { if (stickers.version > 9018) {
qint32 emojiCount; qint32 emojiCount;
stickers.stream >> emojiCount; stickers.stream >> emojiCount;

View File

@ -82,7 +82,10 @@ DocumentData *Document::readFromStreamHelper(int streamAppVersion, QDataStream &
if (typeOfSet == StickerSetTypeEmpty) { if (typeOfSet == StickerSetTypeEmpty) {
attributes.push_back(MTP_documentAttributeSticker(MTP_flags(0), MTP_string(alt), MTP_inputStickerSetEmpty(), MTPMaskCoords())); attributes.push_back(MTP_documentAttributeSticker(MTP_flags(0), MTP_string(alt), MTP_inputStickerSetEmpty(), MTPMaskCoords()));
} else if (info) { } else if (info) {
if (info->setId == Stickers::DefaultSetId || info->setId == Stickers::CloudRecentSetId || info->setId == Stickers::FavedSetId || info->setId == Stickers::CustomSetId) { if (info->setId == Stickers::DefaultSetId
|| info->setId == Stickers::CloudRecentSetId
|| info->setId == Stickers::FavedSetId
|| info->setId == Stickers::CustomSetId) {
typeOfSet = StickerSetTypeEmpty; typeOfSet = StickerSetTypeEmpty;
} }