Added initial api support of stickerset attribute in web pages.

This commit is contained in:
23rd 2024-04-18 05:14:19 +03:00 committed by John Preston
parent a3b8397361
commit f43f99cff2
6 changed files with 52 additions and 0 deletions

View file

@ -312,6 +312,7 @@ PreviewWrap::PreviewWrap(
nullptr, // document nullptr, // document
WebPageCollage(), WebPageCollage(),
nullptr, // iv nullptr, // iv
nullptr, // stickerSet
0, // duration 0, // duration
QString(), // author QString(), // author
false, // hasLargeMedia false, // hasLargeMedia

View file

@ -3377,6 +3377,7 @@ not_null<WebPageData*> Session::processWebpage(
nullptr, nullptr,
WebPageCollage(), WebPageCollage(),
nullptr, nullptr,
nullptr,
0, 0,
QString(), QString(),
false, false,
@ -3402,6 +3403,7 @@ not_null<WebPageData*> Session::webpage(
nullptr, nullptr,
WebPageCollage(), WebPageCollage(),
nullptr, nullptr,
nullptr,
0, 0,
QString(), QString(),
false, false,
@ -3420,6 +3422,7 @@ not_null<WebPageData*> Session::webpage(
DocumentData *document, DocumentData *document,
WebPageCollage &&collage, WebPageCollage &&collage,
std::unique_ptr<Iv::Data> iv, std::unique_ptr<Iv::Data> iv,
std::unique_ptr<WebPageStickerSet> stickerSet,
int duration, int duration,
const QString &author, const QString &author,
bool hasLargeMedia, bool hasLargeMedia,
@ -3438,6 +3441,7 @@ not_null<WebPageData*> Session::webpage(
document, document,
std::move(collage), std::move(collage),
std::move(iv), std::move(iv),
std::move(stickerSet),
duration, duration,
author, author,
hasLargeMedia, hasLargeMedia,
@ -3490,6 +3494,29 @@ void Session::webpageApplyFields(
} }
return nullptr; return nullptr;
}; };
using WebPageStickerSetPtr = std::unique_ptr<WebPageStickerSet>;
const auto lookupStickerSet = [&]() -> WebPageStickerSetPtr {
if (const auto attributes = data.vattributes()) {
for (const auto &attribute : attributes->v) {
auto result = attribute.match([&](
const MTPDwebPageAttributeStickerSet &data) {
auto result = std::make_unique<WebPageStickerSet>();
result->isEmoji = data.is_emojis();
result->isTextColor = data.is_text_color();
for (const auto &tl : data.vstickers().v) {
result->items.push_back(processDocument(tl));
}
return result;
}, [](const auto &) {
return WebPageStickerSetPtr(nullptr);
});
if (!result->items.empty()) {
return result;
}
}
}
return nullptr;
};
auto story = (Data::Story*)nullptr; auto story = (Data::Story*)nullptr;
auto storyId = FullStoryId(); auto storyId = FullStoryId();
if (const auto attributes = data.vattributes()) { if (const auto attributes = data.vattributes()) {
@ -3581,6 +3608,7 @@ void Session::webpageApplyFields(
: lookupThemeDocument()), : lookupThemeDocument()),
WebPageCollage(this, data), WebPageCollage(this, data),
std::move(iv), std::move(iv),
lookupStickerSet(),
data.vduration().value_or_empty(), data.vduration().value_or_empty(),
qs(data.vauthor().value_or_empty()), qs(data.vauthor().value_or_empty()),
data.is_has_large_media(), data.is_has_large_media(),
@ -3600,6 +3628,7 @@ void Session::webpageApplyFields(
DocumentData *document, DocumentData *document,
WebPageCollage &&collage, WebPageCollage &&collage,
std::unique_ptr<Iv::Data> iv, std::unique_ptr<Iv::Data> iv,
std::unique_ptr<WebPageStickerSet> stickerSet,
int duration, int duration,
const QString &author, const QString &author,
bool hasLargeMedia, bool hasLargeMedia,
@ -3617,6 +3646,7 @@ void Session::webpageApplyFields(
document, document,
std::move(collage), std::move(collage),
std::move(iv), std::move(iv),
std::move(stickerSet),
duration, duration,
author, author,
hasLargeMedia, hasLargeMedia,

View file

@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class Image; class Image;
class HistoryItem; class HistoryItem;
struct WebPageCollage; struct WebPageCollage;
struct WebPageStickerSet;
enum class WebPageType : uint8; enum class WebPageType : uint8;
enum class NewMessageType; enum class NewMessageType;
@ -579,6 +580,7 @@ public:
DocumentData *document, DocumentData *document,
WebPageCollage &&collage, WebPageCollage &&collage,
std::unique_ptr<Iv::Data> iv, std::unique_ptr<Iv::Data> iv,
std::unique_ptr<WebPageStickerSet> stickerSet,
int duration, int duration,
const QString &author, const QString &author,
bool hasLargeMedia, bool hasLargeMedia,
@ -857,6 +859,7 @@ private:
DocumentData *document, DocumentData *document,
WebPageCollage &&collage, WebPageCollage &&collage,
std::unique_ptr<Iv::Data> iv, std::unique_ptr<Iv::Data> iv,
std::unique_ptr<WebPageStickerSet> stickerSet,
int duration, int duration,
const QString &author, const QString &author,
bool hasLargeMedia, bool hasLargeMedia,

View file

@ -166,6 +166,8 @@ WebPageType ParseWebPageType(
return WebPageType::ChannelBoost; return WebPageType::ChannelBoost;
} else if (type == u"telegram_giftcode"_q) { } else if (type == u"telegram_giftcode"_q) {
return WebPageType::Giftcode; return WebPageType::Giftcode;
} else if (type == u"telegram_stickerset"_q) {
return WebPageType::StickerSet;
} else if (hasIV) { } else if (hasIV) {
return WebPageType::ArticleWithIV; return WebPageType::ArticleWithIV;
} else { } else {
@ -219,6 +221,7 @@ bool WebPageData::applyChanges(
DocumentData *newDocument, DocumentData *newDocument,
WebPageCollage &&newCollage, WebPageCollage &&newCollage,
std::unique_ptr<Iv::Data> newIv, std::unique_ptr<Iv::Data> newIv,
std::unique_ptr<WebPageStickerSet> newStickerSet,
int newDuration, int newDuration,
const QString &newAuthor, const QString &newAuthor,
bool newHasLargeMedia, bool newHasLargeMedia,
@ -272,6 +275,7 @@ bool WebPageData::applyChanges(
&& collage.items == newCollage.items && collage.items == newCollage.items
&& (!iv == !newIv) && (!iv == !newIv)
&& (!iv || iv->partial() == newIv->partial()) && (!iv || iv->partial() == newIv->partial())
&& (!stickerSet == !newStickerSet)
&& duration == newDuration && duration == newDuration
&& author == resultAuthor && author == resultAuthor
&& hasLargeMedia == (newHasLargeMedia ? 1 : 0) && hasLargeMedia == (newHasLargeMedia ? 1 : 0)
@ -293,6 +297,7 @@ bool WebPageData::applyChanges(
document = newDocument; document = newDocument;
collage = std::move(newCollage); collage = std::move(newCollage);
iv = std::move(newIv); iv = std::move(newIv);
stickerSet = std::move(newStickerSet);
duration = newDuration; duration = newDuration;
author = resultAuthor; author = resultAuthor;
pendingTill = newPendingTill; pendingTill = newPendingTill;

View file

@ -46,6 +46,7 @@ enum class WebPageType : uint8 {
WallPaper, WallPaper,
Theme, Theme,
Story, Story,
StickerSet,
Article, Article,
ArticleWithIV, ArticleWithIV,
@ -68,6 +69,15 @@ struct WebPageCollage {
}; };
struct WebPageStickerSet {
WebPageStickerSet() = default;
std::vector<not_null<DocumentData*>> items;
bool isEmoji = false;
bool isTextColor = false;
};
struct WebPageData { struct WebPageData {
WebPageData(not_null<Data::Session*> owner, const WebPageId &id); WebPageData(not_null<Data::Session*> owner, const WebPageId &id);
~WebPageData(); ~WebPageData();
@ -87,6 +97,7 @@ struct WebPageData {
DocumentData *newDocument, DocumentData *newDocument,
WebPageCollage &&newCollage, WebPageCollage &&newCollage,
std::unique_ptr<Iv::Data> newIv, std::unique_ptr<Iv::Data> newIv,
std::unique_ptr<WebPageStickerSet> newStickerSet,
int newDuration, int newDuration,
const QString &newAuthor, const QString &newAuthor,
bool newHasLargeMedia, bool newHasLargeMedia,
@ -114,6 +125,7 @@ struct WebPageData {
DocumentData *document = nullptr; DocumentData *document = nullptr;
WebPageCollage collage; WebPageCollage collage;
std::unique_ptr<Iv::Data> iv; std::unique_ptr<Iv::Data> iv;
std::unique_ptr<WebPageStickerSet> stickerSet;
int duration = 0; int duration = 0;
TimeId pendingTill = 0; TimeId pendingTill = 0;
uint32 version : 30 = 0; uint32 version : 30 = 0;

View file

@ -657,6 +657,7 @@ HistoryItem::HistoryItem(
nullptr, nullptr,
WebPageCollage(), WebPageCollage(),
nullptr, nullptr,
nullptr,
0, 0,
QString(), QString(),
false, false,