tdesktop/Telegram/SourceFiles/data/data_sponsored_messages.h

138 lines
3.3 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 "base/timer.h"
#include "history/history_item.h"
#include "ui/image/image_location.h"
#include "window/window_session_controller_link_info.h"
class History;
namespace Main {
class Session;
} // namespace Main
namespace Data {
class Session;
struct SponsoredFrom {
PeerData *peer = nullptr;
QString title;
bool isBroadcast = false;
bool isMegagroup = false;
bool isChannel = false;
bool isPublic = false;
std::optional<Window::PeerByLinkInfo> botLinkInfo;
bool isExactPost = false;
bool isRecommended = false;
QString externalLink;
PhotoId webpageOrBotPhotoId = PhotoId(0);
bool isForceUserpicDisplay = false;
QString buttonText;
};
struct SponsoredMessage {
QByteArray randomId;
SponsoredFrom from;
TextWithEntities textWithEntities;
History *history = nullptr;
MsgId msgId;
QString chatInviteHash;
QString externalLink;
TextWithEntities sponsorInfo;
TextWithEntities additionalInfo;
};
class SponsoredMessages final {
public:
enum class State {
None,
AppendToEnd,
InjectToMiddle,
};
struct Details {
std::optional<QString> hash;
PeerData *peer = nullptr;
MsgId msgId;
std::vector<TextWithEntities> info;
QString externalLink;
bool isForceUserpicDisplay = false;
QString buttonText;
std::optional<Window::PeerByLinkInfo> botLinkInfo;
};
using RandomId = QByteArray;
explicit SponsoredMessages(not_null<Session*> owner);
SponsoredMessages(const SponsoredMessages &other) = delete;
SponsoredMessages &operator=(const SponsoredMessages &other) = delete;
~SponsoredMessages();
[[nodiscard]] bool canHaveFor(not_null<History*> history) const;
void request(not_null<History*> history, Fn<void()> done);
void clearItems(not_null<History*> history);
[[nodiscard]] Details lookupDetails(const FullMsgId &fullId) const;
void clicked(const FullMsgId &fullId);
[[nodiscard]] bool append(not_null<History*> history);
void inject(
not_null<History*> history,
MsgId injectAfterMsgId,
int betweenHeight,
int fallbackWidth);
void view(const FullMsgId &fullId);
[[nodiscard]] State state(not_null<History*> history) const;
private:
using OwnedItem = std::unique_ptr<HistoryItem, HistoryItem::Destroyer>;
struct Entry {
OwnedItem item;
FullMsgId itemFullId;
SponsoredMessage sponsored;
};
struct List {
std::vector<Entry> entries;
// Data between history displays.
size_t injectedCount = 0;
bool showedAll = false;
//
crl::time received = 0;
int postsBetween = 0;
State state = State::None;
};
struct Request {
mtpRequestId requestId = 0;
crl::time lastReceived = 0;
};
void parse(
not_null<History*> history,
const MTPmessages_sponsoredMessages &list);
void append(
not_null<History*> history,
List &list,
const MTPSponsoredMessage &message);
void clearOldRequests();
const Entry *find(const FullMsgId &fullId) const;
const not_null<Main::Session*> _session;
base::Timer _clearTimer;
base::flat_map<not_null<History*>, List> _data;
base::flat_map<not_null<History*>, Request> _requests;
base::flat_map<RandomId, Request> _viewRequests;
rpl::lifetime _lifetime;
};
} // namespace Data