Register sponsored view only on full message show.

This commit is contained in:
John Preston 2021-11-03 15:49:48 +04:00
parent 52bacb3cde
commit 7a57174ab1
6 changed files with 39 additions and 31 deletions

View file

@ -92,15 +92,24 @@ bool SponsoredMessages::append(not_null<History*> history) {
return true; return true;
} }
bool SponsoredMessages::canHaveFor(not_null<History*> history) const {
return history->isChannel();
}
void SponsoredMessages::request(not_null<History*> history) { void SponsoredMessages::request(not_null<History*> history) {
if (!canHaveFor(history)) {
return;
}
auto &request = _requests[history]; auto &request = _requests[history];
if (request.requestId || TooEarlyForRequest(request.lastReceived)) { if (request.requestId || TooEarlyForRequest(request.lastReceived)) {
return; return;
} }
const auto channel = history->peer->asChannel();
Assert(channel != nullptr);
request.requestId = _session->api().request( request.requestId = _session->api().request(
MTPchannels_GetSponsoredMessages( MTPchannels_GetSponsoredMessages(
_session->data().channel(history->channelId())->inputChannel channel->inputChannel)
)).done([=](const MTPmessages_sponsoredMessages &result) { ).done([=](const MTPmessages_sponsoredMessages &result) {
parse(history, result); parse(history, result);
}).fail([=](const MTP::Error &error) { }).fail([=](const MTP::Error &error) {
_requests.remove(history); _requests.remove(history);
@ -169,6 +178,9 @@ void SponsoredMessages::clearItems(not_null<History*> history) {
const SponsoredMessages::Entry *SponsoredMessages::find( const SponsoredMessages::Entry *SponsoredMessages::find(
const FullMsgId &fullId) const { const FullMsgId &fullId) const {
if (!fullId.channel) {
return nullptr;
}
const auto history = _session->data().history( const auto history = _session->data().history(
peerFromChannel(fullId.channel)); peerFromChannel(fullId.channel));
const auto it = _data.find(history); const auto it = _data.find(history);
@ -195,12 +207,13 @@ void SponsoredMessages::view(const FullMsgId &fullId) {
if (request.requestId || TooEarlyForRequest(request.lastReceived)) { if (request.requestId || TooEarlyForRequest(request.lastReceived)) {
return; return;
} }
const auto history = entryPtr->item->history(); const auto channel = entryPtr->item->history()->peer->asChannel();
Assert(channel != nullptr);
request.requestId = _session->api().request( request.requestId = _session->api().request(
MTPchannels_ViewSponsoredMessage( MTPchannels_ViewSponsoredMessage(
_session->data().channel(history->channelId())->inputChannel, channel->inputChannel,
MTP_bytes(randomId) MTP_bytes(randomId))
)).done([=] { ).done([=] {
auto &request = _viewRequests[randomId]; auto &request = _viewRequests[randomId];
request.lastReceived = crl::now(); request.lastReceived = crl::now();
request.requestId = 0; request.requestId = 0;

View file

@ -36,6 +36,7 @@ public:
SponsoredMessages &operator=(const SponsoredMessages &other) = delete; SponsoredMessages &operator=(const SponsoredMessages &other) = delete;
~SponsoredMessages(); ~SponsoredMessages();
[[nodiscard]] bool canHaveFor(not_null<History*> history) const;
void request(not_null<History*> history); void request(not_null<History*> history);
[[nodiscard]] bool append(not_null<History*> history); [[nodiscard]] bool append(not_null<History*> history);
void clearItems(not_null<History*> history); void clearItems(not_null<History*> history);

View file

@ -2674,10 +2674,6 @@ QString History::topPromotionMessage() const {
return _topPromotedMessage; return _topPromotedMessage;
} }
bool History::canHaveSponsoredMessages() const {
return isChannel();
}
bool History::clearUnreadOnClientSide() const { bool History::clearUnreadOnClientSide() const {
if (!session().supportMode()) { if (!session().supportMode()) {
return false; return false;

View file

@ -282,8 +282,6 @@ public:
[[nodiscard]] bool topPromotionAboutShown() const; [[nodiscard]] bool topPromotionAboutShown() const;
void markTopPromotionAboutShown(); void markTopPromotionAboutShown();
[[nodiscard]] bool canHaveSponsoredMessages() const;
MsgId minMsgId() const; MsgId minMsgId() const;
MsgId maxMsgId() const; MsgId maxMsgId() const;
MsgId msgIdForRead() const; MsgId msgIdForRead() const;

View file

@ -679,18 +679,20 @@ void HistoryInner::paintEvent(QPaintEvent *e) {
seltoy - mtop); seltoy - mtop);
view->draw(p, context); view->draw(p, context);
if (item->hasViews()) { const auto height = view->height();
session().api().views().scheduleIncrement(item); const auto middle = top + height / 2;
} const auto bottom = top + height;
if (item->isSponsored()) { if (_visibleAreaBottom >= middle
session().data().sponsoredMessages().view(item->fullId()); && _visibleAreaTop <= middle) {
} if (item->hasViews()) {
if (item->isUnreadMention() && !item->isUnreadMedia()) { session().api().views().scheduleIncrement(item);
readMentions.insert(item); }
_widget->enqueueMessageHighlight(view); if (item->isUnreadMention() && !item->isUnreadMedia()) {
readMentions.insert(item);
_widget->enqueueMessageHighlight(view);
}
} }
const auto height = view->height();
top += height; top += height;
context.translate(0, -height); context.translate(0, -height);
p.translate(0, height); p.translate(0, height);
@ -739,16 +741,16 @@ void HistoryInner::paintEvent(QPaintEvent *e) {
if (!item->out() && item->unread()) { if (!item->out() && item->unread()) {
readTill = item; readTill = item;
} }
if (item->isSponsored()) {
session().data().sponsoredMessages().view(
item->fullId());
}
} }
if (_visibleAreaBottom >= middle if (_visibleAreaBottom >= middle
&& _visibleAreaTop <= middle) { && _visibleAreaTop <= middle) {
if (item->hasViews()) { if (item->hasViews()) {
session().api().views().scheduleIncrement(item); session().api().views().scheduleIncrement(item);
} }
if (item->isSponsored()) {
session().data().sponsoredMessages().view(
item->fullId());
}
if (item->isUnreadMention() && !item->isUnreadMedia()) { if (item->isUnreadMention() && !item->isUnreadMedia()) {
readMentions.insert(item); readMentions.insert(item);
_widget->enqueueMessageHighlight(view); _widget->enqueueMessageHighlight(view);

View file

@ -2189,11 +2189,9 @@ void HistoryWidget::showHistory(
showAboutTopPromotion(); showAboutTopPromotion();
{ {
const auto hasSponsored = _history->canHaveSponsoredMessages(); auto &sponsored = session().data().sponsoredMessages();
_scroll->setTrackingContent(hasSponsored); sponsored.request(_history);
if (hasSponsored) { _scroll->setTrackingContent(sponsored.canHaveFor(_history));
session().data().sponsoredMessages().request(_history);
}
} }
} else { } else {
_chooseForReport = nullptr; _chooseForReport = nullptr;