321 lines
9.6 KiB
C++
321 lines
9.6 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#pragma once
|
|
|
|
#include "mtproto/sender.h"
|
|
#include "data/stickers/data_stickers_set.h"
|
|
#include "settings.h"
|
|
|
|
class HistoryItem;
|
|
class DocumentData;
|
|
|
|
namespace Main {
|
|
class Session;
|
|
} // namespace Main
|
|
|
|
namespace Window {
|
|
class SessionController;
|
|
} // namespace Window
|
|
|
|
namespace Data {
|
|
|
|
class Session;
|
|
class DocumentMedia;
|
|
|
|
enum class StickersType : uchar {
|
|
Stickers,
|
|
Masks,
|
|
Emoji,
|
|
};
|
|
|
|
class Stickers final {
|
|
public:
|
|
explicit Stickers(not_null<Session*> owner);
|
|
|
|
[[nodiscard]] Session &owner() const;
|
|
[[nodiscard]] Main::Session &session() const;
|
|
|
|
// for backward compatibility
|
|
static constexpr auto DefaultSetId = 0;
|
|
static constexpr auto CustomSetId = 0xFFFFFFFFFFFFFFFFULL;
|
|
|
|
// For stickers panel, should not appear in Sets.
|
|
static constexpr auto RecentSetId = 0xFFFFFFFFFFFFFFFEULL;
|
|
static constexpr auto NoneSetId = 0xFFFFFFFFFFFFFFFDULL;
|
|
static constexpr auto FeaturedSetId = 0xFFFFFFFFFFFFFFFBULL;
|
|
|
|
// For cloud-stored recent stickers.
|
|
static constexpr auto CloudRecentSetId = 0xFFFFFFFFFFFFFFFCULL;
|
|
static constexpr auto CloudRecentAttachedSetId = 0xFFFFFFFFFFFFFFF9ULL;
|
|
|
|
// For cloud-stored faved stickers.
|
|
static constexpr auto FavedSetId = 0xFFFFFFFFFFFFFFFAULL;
|
|
|
|
// For setting up megagroup sticker set.
|
|
static constexpr auto MegagroupSetId = 0xFFFFFFFFFFFFFFEFULL;
|
|
|
|
void notifyUpdated(StickersType type);
|
|
[[nodiscard]] rpl::producer<StickersType> updated() const;
|
|
[[nodiscard]] rpl::producer<> updated(StickersType type) const;
|
|
void notifyRecentUpdated(StickersType type);
|
|
[[nodiscard]] rpl::producer<StickersType> recentUpdated() const;
|
|
[[nodiscard]] rpl::producer<> recentUpdated(StickersType type) const;
|
|
void notifySavedGifsUpdated();
|
|
[[nodiscard]] rpl::producer<> savedGifsUpdated() const;
|
|
void notifyStickerSetInstalled(uint64 setId);
|
|
[[nodiscard]] rpl::producer<uint64> stickerSetInstalled() const;
|
|
void notifyEmojiSetInstalled(uint64 setId);
|
|
[[nodiscard]] rpl::producer<uint64> emojiSetInstalled() const;
|
|
|
|
void incrementSticker(not_null<DocumentData*> document);
|
|
|
|
bool updateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastUpdate, now);
|
|
}
|
|
void setLastUpdate(crl::time update) {
|
|
_lastUpdate = update;
|
|
}
|
|
bool recentUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastRecentUpdate, now);
|
|
}
|
|
void setLastRecentUpdate(crl::time update) {
|
|
if (update) {
|
|
notifyRecentUpdated(StickersType::Stickers);
|
|
}
|
|
_lastRecentUpdate = update;
|
|
}
|
|
bool masksUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastMasksUpdate, now);
|
|
}
|
|
void setLastMasksUpdate(crl::time update) {
|
|
_lastMasksUpdate = update;
|
|
}
|
|
bool emojiUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastEmojiUpdate, now);
|
|
}
|
|
void setLastEmojiUpdate(crl::time update) {
|
|
_lastEmojiUpdate = update;
|
|
}
|
|
bool recentAttachedUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastRecentAttachedUpdate, now);
|
|
}
|
|
void setLastRecentAttachedUpdate(crl::time update) {
|
|
if (update) {
|
|
notifyRecentUpdated(StickersType::Masks);
|
|
}
|
|
_lastRecentAttachedUpdate = update;
|
|
}
|
|
bool favedUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastFavedUpdate, now);
|
|
}
|
|
void setLastFavedUpdate(crl::time update) {
|
|
_lastFavedUpdate = update;
|
|
}
|
|
bool featuredUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastFeaturedUpdate, now);
|
|
}
|
|
void setLastFeaturedUpdate(crl::time update) {
|
|
_lastFeaturedUpdate = update;
|
|
}
|
|
bool featuredEmojiUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastFeaturedEmojiUpdate, now);
|
|
}
|
|
void setLastFeaturedEmojiUpdate(crl::time update) {
|
|
_lastFeaturedEmojiUpdate = update;
|
|
}
|
|
bool savedGifsUpdateNeeded(crl::time now) const {
|
|
return updateNeeded(_lastSavedGifsUpdate, now);
|
|
}
|
|
void setLastSavedGifsUpdate(crl::time update) {
|
|
_lastSavedGifsUpdate = update;
|
|
}
|
|
int featuredSetsUnreadCount() const {
|
|
return _featuredSetsUnreadCount.current();
|
|
}
|
|
void setFeaturedSetsUnreadCount(int count) {
|
|
_featuredSetsUnreadCount = count;
|
|
}
|
|
[[nodiscard]] rpl::producer<int> featuredSetsUnreadCountValue() const {
|
|
return _featuredSetsUnreadCount.value();
|
|
}
|
|
const StickersSets &sets() const {
|
|
return _sets;
|
|
}
|
|
StickersSets &setsRef() {
|
|
return _sets;
|
|
}
|
|
const StickersSetsOrder &setsOrder() const {
|
|
return _setsOrder;
|
|
}
|
|
StickersSetsOrder &setsOrderRef() {
|
|
return _setsOrder;
|
|
}
|
|
const StickersSetsOrder &maskSetsOrder() const {
|
|
return _maskSetsOrder;
|
|
}
|
|
StickersSetsOrder &maskSetsOrderRef() {
|
|
return _maskSetsOrder;
|
|
}
|
|
const StickersSetsOrder &emojiSetsOrder() const {
|
|
return _emojiSetsOrder;
|
|
}
|
|
StickersSetsOrder &emojiSetsOrderRef() {
|
|
return _emojiSetsOrder;
|
|
}
|
|
const StickersSetsOrder &featuredSetsOrder() const {
|
|
return _featuredSetsOrder;
|
|
}
|
|
StickersSetsOrder &featuredSetsOrderRef() {
|
|
return _featuredSetsOrder;
|
|
}
|
|
const StickersSetsOrder &featuredEmojiSetsOrder() const {
|
|
return _featuredEmojiSetsOrder;
|
|
}
|
|
StickersSetsOrder &featuredEmojiSetsOrderRef() {
|
|
return _featuredEmojiSetsOrder;
|
|
}
|
|
const StickersSetsOrder &archivedSetsOrder() const {
|
|
return _archivedSetsOrder;
|
|
}
|
|
StickersSetsOrder &archivedSetsOrderRef() {
|
|
return _archivedSetsOrder;
|
|
}
|
|
const StickersSetsOrder &archivedMaskSetsOrder() const {
|
|
return _archivedMaskSetsOrder;
|
|
}
|
|
StickersSetsOrder &archivedMaskSetsOrderRef() {
|
|
return _archivedMaskSetsOrder;
|
|
}
|
|
const SavedGifs &savedGifs() const {
|
|
return _savedGifs;
|
|
}
|
|
SavedGifs &savedGifsRef() {
|
|
return _savedGifs;
|
|
}
|
|
void removeFromRecentSet(not_null<DocumentData*> document);
|
|
|
|
void addSavedGif(
|
|
Window::SessionController *controller,
|
|
not_null<DocumentData*> document);
|
|
void checkSavedGif(not_null<HistoryItem*> item);
|
|
|
|
void applyArchivedResult(
|
|
const MTPDmessages_stickerSetInstallResultArchive &d);
|
|
void installLocally(uint64 setId);
|
|
void undoInstallLocally(uint64 setId);
|
|
bool isFaved(not_null<const DocumentData*> document);
|
|
void setFaved(
|
|
Window::SessionController *controller,
|
|
not_null<DocumentData*> document,
|
|
bool faved);
|
|
|
|
void setsReceived(const QVector<MTPStickerSet> &data, uint64 hash);
|
|
void masksReceived(const QVector<MTPStickerSet> &data, uint64 hash);
|
|
void emojiReceived(const QVector<MTPStickerSet> &data, uint64 hash);
|
|
void specialSetReceived(
|
|
uint64 setId,
|
|
const QString &setTitle,
|
|
const QVector<MTPDocument> &items,
|
|
uint64 hash,
|
|
const QVector<MTPStickerPack> &packs = QVector<MTPStickerPack>(),
|
|
const QVector<MTPint> &usageDates = QVector<MTPint>());
|
|
void featuredSetsReceived(const MTPmessages_FeaturedStickers &result);
|
|
void featuredEmojiSetsReceived(
|
|
const MTPmessages_FeaturedStickers &result);
|
|
void gifsReceived(const QVector<MTPDocument> &items, uint64 hash);
|
|
|
|
std::vector<not_null<DocumentData*>> getListByEmoji(
|
|
std::vector<EmojiPtr> emoji,
|
|
uint64 seed,
|
|
bool forceAllResults = false);
|
|
std::optional<std::vector<not_null<EmojiPtr>>> getEmojiListFromSet(
|
|
not_null<DocumentData*> document);
|
|
|
|
not_null<StickersSet*> feedSet(const MTPStickerSet &data);
|
|
not_null<StickersSet*> feedSet(const MTPStickerSetCovered &data);
|
|
not_null<StickersSet*> feedSetFull(const MTPDmessages_stickerSet &data);
|
|
void feedSetStickers(
|
|
not_null<StickersSet*> set,
|
|
const QVector<MTPDocument> &documents,
|
|
const QVector<MTPStickerPack> &packs);
|
|
void feedSetCovers(
|
|
not_null<StickersSet*> set,
|
|
const QVector<MTPDocument> &documents);
|
|
void newSetReceived(const MTPDmessages_stickerSet &set);
|
|
|
|
QString getSetTitle(const MTPDstickerSet &s);
|
|
|
|
RecentStickerPack &getRecentPack() const;
|
|
|
|
private:
|
|
bool updateNeeded(crl::time lastUpdate, crl::time now) const {
|
|
constexpr auto kUpdateTimeout = crl::time(3600'000);
|
|
return (lastUpdate == 0)
|
|
|| (now >= lastUpdate + kUpdateTimeout);
|
|
}
|
|
void checkFavedLimit(
|
|
StickersSet &set,
|
|
Window::SessionController *controller = nullptr);
|
|
void setIsFaved(
|
|
Window::SessionController *controller,
|
|
not_null<DocumentData*> document,
|
|
std::optional<std::vector<not_null<EmojiPtr>>> emojiList
|
|
= std::nullopt);
|
|
void setIsNotFaved(not_null<DocumentData*> document);
|
|
void pushFavedToFront(
|
|
StickersSet &set,
|
|
Window::SessionController *controller,
|
|
not_null<DocumentData*> document,
|
|
const std::vector<not_null<EmojiPtr>> &emojiList);
|
|
void moveFavedToFront(StickersSet &set, int index);
|
|
void requestSetToPushFaved(
|
|
Window::SessionController *controller,
|
|
not_null<DocumentData*> document);
|
|
void setPackAndEmoji(
|
|
StickersSet &set,
|
|
StickersPack &&pack,
|
|
const std::vector<TimeId> &&dates,
|
|
const QVector<MTPStickerPack> &packs);
|
|
void somethingReceived(
|
|
const QVector<MTPStickerSet> &list,
|
|
uint64 hash,
|
|
StickersType type);
|
|
void featuredReceived(
|
|
const MTPDmessages_featuredStickers &data,
|
|
StickersType type);
|
|
|
|
const not_null<Session*> _owner;
|
|
rpl::event_stream<StickersType> _updated;
|
|
rpl::event_stream<StickersType> _recentUpdated;
|
|
rpl::event_stream<> _savedGifsUpdated;
|
|
rpl::event_stream<uint64> _stickerSetInstalled;
|
|
rpl::event_stream<uint64> _emojiSetInstalled;
|
|
crl::time _lastUpdate = 0;
|
|
crl::time _lastRecentUpdate = 0;
|
|
crl::time _lastFavedUpdate = 0;
|
|
crl::time _lastFeaturedUpdate = 0;
|
|
crl::time _lastSavedGifsUpdate = 0;
|
|
crl::time _lastMasksUpdate = 0;
|
|
crl::time _lastEmojiUpdate = 0;
|
|
crl::time _lastFeaturedEmojiUpdate = 0;
|
|
crl::time _lastRecentAttachedUpdate = 0;
|
|
rpl::variable<int> _featuredSetsUnreadCount = 0;
|
|
StickersSets _sets;
|
|
StickersSetsOrder _setsOrder;
|
|
StickersSetsOrder _maskSetsOrder;
|
|
StickersSetsOrder _emojiSetsOrder;
|
|
StickersSetsOrder _featuredSetsOrder;
|
|
StickersSetsOrder _featuredEmojiSetsOrder;
|
|
StickersSetsOrder _archivedSetsOrder;
|
|
StickersSetsOrder _archivedMaskSetsOrder;
|
|
SavedGifs _savedGifs;
|
|
|
|
};
|
|
|
|
} // namespace Data
|