Update API scheme to layer 182.

This commit is contained in:
John Preston 2024-06-14 09:38:35 +04:00
parent d993386756
commit fbbcc21198
13 changed files with 123 additions and 16 deletions

View file

@ -20,6 +20,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Api {
namespace {
constexpr auto kTransactionsLimit = 100;
[[nodiscard]] Data::CreditsHistoryEntry HistoryFromTL(
const MTPStarsTransaction &tl,
not_null<PeerData*> peer) {
@ -152,7 +154,8 @@ void CreditsHistory::request(
_requestId = _api.request(MTPpayments_GetStarsTransactions(
MTP_flags(_flags),
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input,
MTP_string(token)
MTP_string(token),
MTP_int(kTransactionsLimit)
)).done([=](const MTPpayments_StarsStatus &result) {
_requestId = 0;
done(StatusFromTL(result, _peer));

View file

@ -2165,7 +2165,8 @@ void ApiWrap::saveDraftsToCloud() {
entities,
Data::WebPageForMTP(
cloudDraft->webpage,
textWithTags.text.isEmpty())
textWithTags.text.isEmpty()),
MTP_long(0) // effect
)).done([=](const MTPBool &result, const MTP::Response &response) {
const auto requestId = response.requestId;
history->finishSavingCloudDraft(

View file

@ -25,6 +25,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/window_controller.h"
#include "window/window_session_controller.h"
#include "window/window_session_controller_link_info.h"
#include "styles/style_calls.h" // groupCallBoxLabel
#include "styles/style_layers.h"
namespace {
@ -121,7 +122,10 @@ void HiddenUrlClickHandler::Open(QString url, QVariant context) {
} else {
const auto parsedUrl = QUrl::fromUserInput(url);
if (UrlRequiresConfirmation(parsedUrl) && !base::IsCtrlPressed()) {
Core::App().hideMediaView();
const auto my = context.value<ClickHandlerContext>();
if (!my.show) {
Core::App().hideMediaView();
}
const auto displayed = parsedUrl.isValid()
? parsedUrl.toDisplayString()
: url;
@ -130,7 +134,6 @@ void HiddenUrlClickHandler::Open(QString url, QVariant context) {
: parsedUrl.isValid()
? QString::fromUtf8(parsedUrl.toEncoded())
: ShowEncoded(displayed);
const auto my = context.value<ClickHandlerContext>();
const auto controller = my.sessionWindow.get();
const auto use = controller
? &controller->window()
@ -140,8 +143,11 @@ void HiddenUrlClickHandler::Open(QString url, QVariant context) {
.text = (tr::lng_open_this_link(tr::now)),
.confirmed = [=](Fn<void()> hide) { hide(); open(); },
.confirmText = tr::lng_open_link(),
.labelStyle = my.dark ? &st::groupCallBoxLabel : nullptr,
});
const auto &st = st::boxLabel;
const auto &st = my.dark
? st::groupCallBoxLabel
: st::boxLabel;
box->addSkip(st.style.lineHeight - st::boxPadding.bottom());
const auto url = box->addRow(
object_ptr<Ui::FlatLabel>(box, displayUrl, st));
@ -190,6 +196,7 @@ void BotGameUrlClickHandler::onClick(ClickContext context) const {
_bot->name()),
.confirmed = callback,
.confirmText = tr::lng_allow_bot(),
.labelStyle = my.dark ? &st::groupCallBoxLabel : nullptr,
}));
}
}

View file

@ -47,6 +47,7 @@ struct ClickHandlerContext {
bool skipBotAutoLogin = false;
bool botStartAutoSubmit = false;
bool ignoreIv = false;
bool dark = false;
// Is filled from peer info.
PeerData *peer = nullptr;
};

View file

@ -82,6 +82,7 @@ using UpdateFlag = StoryUpdate::Flag;
});
}, [&](const MTPDmediaAreaSuggestedReaction &data) {
}, [&](const MTPDmediaAreaChannelPost &data) {
}, [&](const MTPDmediaAreaUrl &data) {
}, [&](const MTPDinputMediaAreaChannelPost &data) {
LOG(("API Error: Unexpected inputMediaAreaChannelPost from API."));
}, [&](const MTPDinputMediaAreaVenue &data) {
@ -103,6 +104,7 @@ using UpdateFlag = StoryUpdate::Flag;
.dark = data.is_dark(),
});
}, [&](const MTPDmediaAreaChannelPost &data) {
}, [&](const MTPDmediaAreaUrl &data) {
}, [&](const MTPDinputMediaAreaChannelPost &data) {
LOG(("API Error: Unexpected inputMediaAreaChannelPost from API."));
}, [&](const MTPDinputMediaAreaVenue &data) {
@ -124,6 +126,27 @@ using UpdateFlag = StoryUpdate::Flag;
peerFromChannel(data.vchannel_id()),
data.vmsg_id().v),
});
}, [&](const MTPDmediaAreaUrl &data) {
}, [&](const MTPDinputMediaAreaChannelPost &data) {
LOG(("API Error: Unexpected inputMediaAreaChannelPost from API."));
}, [&](const MTPDinputMediaAreaVenue &data) {
LOG(("API Error: Unexpected inputMediaAreaVenue from API."));
});
return result;
}
[[nodiscard]] auto ParseUrlArea(const MTPMediaArea &area)
-> std::optional<UrlArea> {
auto result = std::optional<UrlArea>();
area.match([&](const MTPDmediaAreaVenue &data) {
}, [&](const MTPDmediaAreaGeoPoint &data) {
}, [&](const MTPDmediaAreaSuggestedReaction &data) {
}, [&](const MTPDmediaAreaChannelPost &data) {
}, [&](const MTPDmediaAreaUrl &data) {
result.emplace(UrlArea{
.area = ParseArea(data.vcoordinates()),
.url = qs(data.vurl()),
});
}, [&](const MTPDinputMediaAreaChannelPost &data) {
LOG(("API Error: Unexpected inputMediaAreaChannelPost from API."));
}, [&](const MTPDinputMediaAreaVenue &data) {
@ -662,6 +685,10 @@ const std::vector<ChannelPost> &Story::channelPosts() const {
return _channelPosts;
}
const std::vector<UrlArea> &Story::urlAreas() const {
return _urlAreas;
}
void Story::applyChanges(
StoryMedia media,
const MTPDstoryItem &data,
@ -765,6 +792,7 @@ void Story::applyFields(
auto locations = std::vector<StoryLocation>();
auto suggestedReactions = std::vector<SuggestedReaction>();
auto channelPosts = std::vector<ChannelPost>();
auto urlAreas = std::vector<UrlArea>();
if (const auto areas = data.vmedia_areas()) {
for (const auto &area : areas->v) {
if (const auto location = ParseLocation(area)) {
@ -778,6 +806,8 @@ void Story::applyFields(
suggestedReactions.push_back(*reaction);
} else if (auto post = ParseChannelPost(area)) {
channelPosts.push_back(*post);
} else if (auto url = ParseUrlArea(area)) {
urlAreas.push_back(*url);
}
}
}
@ -790,6 +820,7 @@ void Story::applyFields(
const auto suggestedReactionsChanged
= (_suggestedReactions != suggestedReactions);
const auto channelPostsChanged = (_channelPosts != channelPosts);
const auto urlAreasChanged = (_urlAreas != urlAreas);
const auto reactionChanged = (_sentReactionId != reaction);
_out = out;
@ -815,6 +846,9 @@ void Story::applyFields(
if (channelPostsChanged) {
_channelPosts = std::move(channelPosts);
}
if (urlAreasChanged) {
_urlAreas = std::move(urlAreas);
}
if (reactionChanged) {
_sentReactionId = reaction;
}
@ -824,7 +858,8 @@ void Story::applyFields(
|| captionChanged
|| mediaChanged
|| locationsChanged
|| channelPostsChanged;
|| channelPostsChanged
|| urlAreasChanged;
const auto reactionsChanged = reactionChanged
|| suggestedReactionsChanged;
if (!initial && (changed || reactionsChanged)) {

View file

@ -122,6 +122,15 @@ struct ChannelPost {
const ChannelPost &) = default;
};
struct UrlArea {
StoryArea area;
QString url;
friend inline bool operator==(
const UrlArea &,
const UrlArea &) = default;
};
class Story final {
public:
Story(
@ -197,6 +206,8 @@ public:
-> const std::vector<SuggestedReaction> &;
[[nodiscard]] auto channelPosts() const
-> const std::vector<ChannelPost> &;
[[nodiscard]] auto urlAreas() const
-> const std::vector<UrlArea> &;
void applyChanges(
StoryMedia media,
@ -247,6 +258,7 @@ private:
std::vector<StoryLocation> _locations;
std::vector<SuggestedReaction> _suggestedReactions;
std::vector<ChannelPost> _channelPosts;
std::vector<UrlArea> _urlAreas;
StoryViews _views;
StoryViews _channelReactions;
const TimeId _date = 0;

View file

@ -13,6 +13,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/peers/prepare_short_info_box.h"
#include "chat_helpers/compose/compose_show.h"
#include "core/application.h"
#include "core/click_handler_types.h"
#include "core/core_settings.h"
#include "core/update_checker.h"
#include "data/data_changes.h"
@ -1046,6 +1047,9 @@ void Controller::updateAreas(Data::Story *story) {
const auto &channelPosts = story
? story->channelPosts()
: std::vector<Data::ChannelPost>();
const auto &urlAreas = story
? story->urlAreas()
: std::vector<Data::UrlArea>();
if (_locations != locations) {
_locations = locations;
_areas.clear();
@ -1054,6 +1058,10 @@ void Controller::updateAreas(Data::Story *story) {
_channelPosts = channelPosts;
_areas.clear();
}
if (_urlAreas != urlAreas) {
_urlAreas = urlAreas;
_areas.clear();
}
const auto reactionsCount = int(suggestedReactions.size());
if (_suggestedReactions.size() == reactionsCount && !_areas.empty()) {
for (auto i = 0; i != reactionsCount; ++i) {
@ -1197,13 +1205,15 @@ ClickHandlerPtr Controller::lookupAreaHandler(QPoint point) const {
if (!layout
|| (_locations.empty()
&& _suggestedReactions.empty()
&& _channelPosts.empty())) {
&& _channelPosts.empty()
&& _urlAreas.empty())) {
return nullptr;
} else if (_areas.empty()) {
const auto now = story();
_areas.reserve(_locations.size()
+ _suggestedReactions.size()
+ _channelPosts.size());
+ _channelPosts.size()
+ _urlAreas.size());
for (const auto &location : _locations) {
_areas.push_back({
.original = location.area.geometry,
@ -1244,6 +1254,13 @@ ClickHandlerPtr Controller::lookupAreaHandler(QPoint point) const {
});
}
}
for (const auto &url : _urlAreas) {
_areas.push_back({
.original = url.area.geometry,
.rotation = url.area.rotation,
.handler = std::make_shared<HiddenUrlClickHandler>(url.url),
});
}
rebuildActiveAreas(*layout);
}

View file

@ -302,6 +302,7 @@ private:
std::vector<Data::StoryLocation> _locations;
std::vector<Data::SuggestedReaction> _suggestedReactions;
std::vector<Data::ChannelPost> _channelPosts;
std::vector<Data::UrlArea> _urlAreas;
mutable std::vector<ActiveArea> _areas;
std::vector<CachedSource> _cachedSourcesList;

View file

@ -170,6 +170,10 @@ void View::showFullCaption() {
_controller->showFullCaption();
}
std::shared_ptr<ChatHelpers::Show> View::uiShow() const {
return _controller->uiShow();
}
rpl::lifetime &View::lifetime() {
return _controller->lifetime();
}

View file

@ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class ClickHandlerHost;
namespace ChatHelpers {
class Show;
} // namespace ChatHelpers
namespace Data {
class Story;
struct StoriesContext;
@ -125,6 +129,8 @@ public:
not_null<Ui::PopupMenu*> menu,
QPoint desiredPosition);
[[nodiscard]] std::shared_ptr<ChatHelpers::Show> uiShow() const;
[[nodiscard]] rpl::lifetime &lifetime();
private:

View file

@ -5840,6 +5840,8 @@ void OverlayWidget::handleMouseRelease(
QVariant::fromValue(ClickHandlerContext{
.itemId = _message ? _message->fullId() : FullMsgId(),
.sessionWindow = base::make_weak(findWindow()),
.show = _stories ? _stories->uiShow() : nullptr,
.dark = true,
})
});
return;

View file

@ -415,6 +415,8 @@ updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:
updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update;
updateBroadcastRevenueTransactions#dfd961f5 peer:Peer balances:BroadcastRevenueBalances = Update;
updateStarsBalance#fb85198 balance:long = Update;
updateBusinessBotCallbackQuery#1ea2fda7 flags:# query_id:long user_id:long connection_id:string message:Message reply_to_message:flags.2?Message chat_instance:long data:flags.0?bytes = Update;
updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@ -792,7 +794,7 @@ contacts.topPeers#70b772a8 categories:Vector<TopPeerCategoryPeers> chats:Vector<
contacts.topPeersDisabled#b52c939d = contacts.TopPeers;
draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage;
draftMessage#3fccf7ef flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo message:string entities:flags.3?Vector<MessageEntity> media:flags.5?InputMedia date:int = DraftMessage;
draftMessage#2d65321f flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo message:string entities:flags.3?Vector<MessageEntity> media:flags.5?InputMedia date:int effect:flags.7?long = DraftMessage;
messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers;
messages.featuredStickers#be382906 flags:# premium:flags.0?true hash:long count:int sets:Vector<StickerSetCovered> unread:Vector<long> = messages.FeaturedStickers;
@ -1603,14 +1605,15 @@ exportedStoryLink#3fc9053b link:string = ExportedStoryLink;
storiesStealthMode#712e27fd flags:# active_until_date:flags.0?int cooldown_until_date:flags.1?int = StoriesStealthMode;
mediaAreaCoordinates#3d1ea4e x:double y:double w:double h:double rotation:double = MediaAreaCoordinates;
mediaAreaCoordinates#cfc9e002 flags:# x:double y:double w:double h:double rotation:double radius:flags.0?double = MediaAreaCoordinates;
mediaAreaVenue#be82db9c coordinates:MediaAreaCoordinates geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MediaArea;
inputMediaAreaVenue#b282217f coordinates:MediaAreaCoordinates query_id:long result_id:string = MediaArea;
mediaAreaGeoPoint#df8b3b22 coordinates:MediaAreaCoordinates geo:GeoPoint = MediaArea;
mediaAreaGeoPoint#cad5452d flags:# coordinates:MediaAreaCoordinates geo:GeoPoint address:flags.0?GeoPointAddress = MediaArea;
mediaAreaSuggestedReaction#14455871 flags:# dark:flags.0?true flipped:flags.1?true coordinates:MediaAreaCoordinates reaction:Reaction = MediaArea;
mediaAreaChannelPost#770416af coordinates:MediaAreaCoordinates channel_id:long msg_id:int = MediaArea;
inputMediaAreaChannelPost#2271f2bf coordinates:MediaAreaCoordinates channel:InputChannel msg_id:int = MediaArea;
mediaAreaUrl#37381085 coordinates:MediaAreaCoordinates url:string = MediaArea;
peerStories#9a35e999 flags:# peer:Peer max_read_id:flags.0?int stories:Vector<StoryItem> = PeerStories;
@ -1803,10 +1806,22 @@ starsTransactionPeer#d80da15d peer:Peer = StarsTransactionPeer;
starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption;
starsTransaction#cc7079b2 flags:# refund:flags.3?true id:string stars:long date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument = StarsTransaction;
starsTransaction#aa00c898 flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true id:string stars:long date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string = StarsTransaction;
payments.starsStatus#8cf4ee60 flags:# balance:long history:Vector<StarsTransaction> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = payments.StarsStatus;
foundStory#e87acbc0 peer:Peer story:StoryItem = FoundStory;
stories.foundStories#e2de7737 flags:# count:int stories:Vector<FoundStory> next_offset:flags.0?string chats:Vector<Chat> users:Vector<User> = stories.FoundStories;
geoPointAddress#de4c5d93 flags:# country_iso2:string state:flags.0?string city:flags.1?string street:flags.2?string = GeoPointAddress;
starsRevenueStatus#79342946 flags:# withdrawal_enabled:flags.0?true current_balance:long available_balance:long overall_revenue:long next_withdrawal_at:flags.1?int = StarsRevenueStatus;
payments.starsRevenueStats#c92bb73b revenue_graph:StatsGraph status:StarsRevenueStatus usd_rate:double = payments.StarsRevenueStats;
payments.starsRevenueWithdrawalUrl#1dab80b7 url:string = payments.StarsRevenueWithdrawalUrl;
---functions---
invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@ -2050,7 +2065,7 @@ messages.editInlineBotMessage#83557dba flags:# no_webpage:flags.1?true invert_me
messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer;
messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;
messages.getPeerDialogs#e470bcfd peers:Vector<InputDialogPeer> = messages.PeerDialogs;
messages.saveDraft#7ff3b806 flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo peer:InputPeer message:string entities:flags.3?Vector<MessageEntity> media:flags.5?InputMedia = Bool;
messages.saveDraft#d372c5ce flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo peer:InputPeer message:string entities:flags.3?Vector<MessageEntity> media:flags.5?InputMedia effect:flags.7?long = Bool;
messages.getAllDrafts#6a3f8d65 = Updates;
messages.getFeaturedStickers#64780b14 hash:long = messages.FeaturedStickers;
messages.readFeaturedStickers#5b118126 id:Vector<long> = Bool;
@ -2349,9 +2364,11 @@ payments.getGiveawayInfo#f4239425 peer:InputPeer msg_id:int = payments.GiveawayI
payments.launchPrepaidGiveaway#5ff58f20 peer:InputPeer giveaway_id:long purpose:InputStorePaymentPurpose = Updates;
payments.getStarsTopupOptions#c00ec7d3 = Vector<StarsTopupOption>;
payments.getStarsStatus#104fcfa7 peer:InputPeer = payments.StarsStatus;
payments.getStarsTransactions#673ac2f9 flags:# inbound:flags.0?true outbound:flags.1?true peer:InputPeer offset:string = payments.StarsStatus;
payments.getStarsTransactions#97938d5a flags:# inbound:flags.0?true outbound:flags.1?true ascending:flags.2?true peer:InputPeer offset:string limit:int = payments.StarsStatus;
payments.sendStarsForm#2bb731d flags:# form_id:long invoice:InputInvoice = payments.PaymentResult;
payments.refundStarsCharge#25ae8f4a user_id:InputUser charge_id:string = Updates;
payments.getStarsRevenueStats#d91ffad6 flags:# dark:flags.0?true peer:InputPeer = payments.StarsRevenueStats;
payments.getStarsRevenueWithdrawalUrl#13bbe8b3 peer:InputPeer stars:long password:InputCheckPasswordSRP = payments.StarsRevenueWithdrawalUrl;
stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true emojis:flags.5?true text_color:flags.6?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector<InputStickerSetItem> software:flags.3?string = messages.StickerSet;
stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet;
@ -2453,6 +2470,7 @@ stories.getChatsToSend#a56a8b60 = messages.Chats;
stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool;
stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList;
stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector<int> = Bool;
stories.searchPosts#6cea116a flags:# hashtag:flags.0?string area:flags.1?MediaArea offset:string limit:int = stories.FoundStories;
premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList;
premium.getMyBoosts#be77b4a = premium.MyBoosts;
@ -2470,4 +2488,4 @@ smsjobs.finishJob#4f1ebf24 flags:# job_id:string error:flags.0?string = Bool;
fragment.getCollectibleInfo#be1e85ba collectible:InputCollectible = fragment.CollectibleInfo;
// LAYER 181
// LAYER 182

View file

@ -34,7 +34,7 @@ PUBLIC
desktop-app::lib_tl
)
if (WIN32 AND NOT build_win64 AND NOT build_winarm AND QT_VERSION GREATER 6)
if (WIN32 AND NOT build_win64 AND NOT build_winarm)
target_compile_options(td_scheme
PRIVATE
/bigobj # scheme.cpp has too many sections.