From cf9a78a164fdeab827a98453f5ab8036face8fb5 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sat, 2 Apr 2016 15:20:53 +0400 Subject: [PATCH] Inline bot stickers done, but not tested yet. --- Telegram/SourceFiles/application.cpp | 3 - Telegram/SourceFiles/dropdown.cpp | 242 ++++++---- Telegram/SourceFiles/facades.cpp | 6 +- Telegram/SourceFiles/gui/text.h | 2 + Telegram/SourceFiles/history.cpp | 6 +- Telegram/SourceFiles/historywidget.cpp | 75 +--- Telegram/SourceFiles/layout.cpp | 313 +++++++------ Telegram/SourceFiles/layout.h | 165 +++++-- Telegram/SourceFiles/mtproto/scheme.tl | 5 +- Telegram/SourceFiles/mtproto/scheme_auto.cpp | 97 +--- Telegram/SourceFiles/mtproto/scheme_auto.h | 445 ++++++------------- Telegram/SourceFiles/settings.cpp | 2 - Telegram/SourceFiles/settings.h | 1 - Telegram/SourceFiles/structs.cpp | 94 +++- Telegram/SourceFiles/structs.h | 238 +++++++++- 15 files changed, 940 insertions(+), 754 deletions(-) diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index f84770840..88c45f668 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -1040,9 +1040,6 @@ void AppClass::checkMapVersion() { } } } - if (cNeedConfigResave()) { - Local::writeUserSettings(); - } } AppClass::~AppClass() { diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index 1bef5c8a3..582abde95 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -1447,59 +1447,77 @@ void StickerPanInner::mouseReleaseEvent(QMouseEvent *e) { } LayoutInlineItem *item = _inlineRows.at(row).items.at(col); - PhotoData *photo = item->photo(); - DocumentData *doc = item->document(); - InlineResult *result = item->result(); - if (doc) { - if (doc->loaded()) { - emit selected(doc); - } else if (doc->loading()) { - doc->cancel(); - } else { - DocumentOpenClickHandler::doOpen(doc, ActionOnLoadNone); + PhotoData *photo = item->getPhoto(); + DocumentData *document = item->getDocument(); + InlineResult *inlineResult = item->getInlineResult(); + using Type = InlineResult::Type; + auto getShownPhoto = [photo, inlineResult]() -> PhotoData* { + if (photo) { + return photo; + } else if (inlineResult && inlineResult->type == Type::Photo) { + return inlineResult->photo; } - } else if (photo) { - if (photo->medium->loaded() || photo->thumb->loaded()) { + return nullptr; + }; + auto getShownDocument = [document, inlineResult]() -> DocumentData* { + auto inlineResultIsFileType = [](InlineResult *inlineResult) { + return inlineResult->type == Type::Video || + inlineResult->type == Type::Audio || + inlineResult->type == Type::Sticker || + inlineResult->type == Type::File || + inlineResult->type == Type::Gif; + }; + if (document) { + return document; + } else if (inlineResult && inlineResultIsFileType(inlineResult)) { + return inlineResult->document; + } + return nullptr; + }; + auto sendInlineItem = [photo, document, inlineResult, this]() -> void { + if (photo) { emit selected(photo); - } else if (!photo->medium->loading()) { - photo->thumb->loadEvenCancelled(); - photo->medium->loadEvenCancelled(); + } else if (document) { + emit selected(document); + } else if (inlineResult) { + emit selected(inlineResult, _inlineBot); } - } else if (result) { - if (result->type == qstr("gif")) { - if (result->doc) { - if (result->doc->loaded()) { - emit selected(result, _inlineBot); - } else if (result->doc->loading()) { - result->doc->cancel(); - } else { - DocumentOpenClickHandler::doOpen(result->doc, ActionOnLoadNone); - } - } else if (result->loaded()) { - emit selected(result, _inlineBot); - } else if (result->loading()) { - result->cancelFile(); + }; + if (PhotoData *shownPhoto = getShownPhoto()) { + if (shownPhoto->medium->loaded() || shownPhoto->thumb->loaded()) { + sendInlineItem(); + } else if (!shownPhoto->medium->loading()) { + shownPhoto->thumb->loadEvenCancelled(); + shownPhoto->medium->loadEvenCancelled(); + } + } else if (DocumentData *shownDocument = getShownDocument()) { + if (shownDocument->loaded()) { + sendInlineItem(); + } else if (shownDocument->loading()) { + shownDocument->cancel(); + } else { + DocumentOpenClickHandler::doOpen(shownDocument, ActionOnLoadNone); + } + } else if (inlineResult) { + if (inlineResult->type == Type::Photo) { + if (inlineResult->thumb->loaded()) { + sendInlineItem(); + } else if (!inlineResult->thumb->loading()) { + inlineResult->thumb->loadEvenCancelled(); + Ui::repaintInlineItem(item); + } + } else if (inlineResult->type == Type::File) { + if (inlineResult->loaded()) { + sendInlineItem(); + } else if (inlineResult->loading()) { + inlineResult->cancelFile(); Ui::repaintInlineItem(item); } else { - result->saveFile(QString(), LoadFromCloudOrLocal, false); - Ui::repaintInlineItem(item); - } - } else if (result->type == qstr("photo")) { - if (result->photo) { - if (result->photo->medium->loaded() || result->photo->thumb->loaded()) { - emit selected(result, _inlineBot); - } else if (!result->photo->medium->loading()) { - result->photo->thumb->loadEvenCancelled(); - result->photo->medium->loadEvenCancelled(); - } - } else if (result->thumb->loaded()) { - emit selected(result, _inlineBot); - } else if (!result->thumb->loading()) { - result->thumb->loadEvenCancelled(); + inlineResult->saveFile(QString(), LoadFromCloudOrLocal, false); Ui::repaintInlineItem(item); } } else { - emit selected(result, _inlineBot); + sendInlineItem(); } } return; @@ -1616,14 +1634,14 @@ void StickerPanInner::hideFinish(bool completely) { if (completely) { clearInlineRows(false); for (GifLayouts::const_iterator i = _gifLayouts.cbegin(), e = _gifLayouts.cend(); i != e; ++i) { - i.value()->document()->forget(); + i.value()->getDocument()->forget(); } for (InlineLayouts::const_iterator i = _inlineLayouts.cbegin(), e = _inlineLayouts.cend(); i != e; ++i) { - if (i.value()->result()->doc) { - i.value()->result()->doc->forget(); + if (i.value()->getInlineResult()->document) { + i.value()->getInlineResult()->document->forget(); } - if (i.value()->result()->photo) { - i.value()->result()->photo->forget(); + if (i.value()->getInlineResult()->photo) { + i.value()->getInlineResult()->photo->forget(); } } } @@ -1660,7 +1678,7 @@ void StickerPanInner::refreshStickers() { } bool StickerPanInner::inlineRowsAddItem(DocumentData *savedGif, InlineResult *result, InlineRow &row, int32 &sumWidth) { - LayoutInlineItem *layout = 0; + LayoutInlineItem *layout = nullptr; if (savedGif) { layout = layoutPrepareSavedGif(savedGif, (_inlineRows.size() * MatrixRowShift) + row.items.size()); } else if (result) { @@ -1751,7 +1769,7 @@ void StickerPanInner::clearInlineRows(bool resultsDeleted) { LayoutInlineGif *StickerPanInner::layoutPrepareSavedGif(DocumentData *doc, int32 position) { GifLayouts::const_iterator i = _gifLayouts.constFind(doc); if (i == _gifLayouts.cend()) { - i = _gifLayouts.insert(doc, new LayoutInlineGif(0, doc, true)); + i = _gifLayouts.insert(doc, new LayoutInlineGif(doc, true)); i.value()->initDimensions(); } if (!i.value()->maxWidth()) return 0; @@ -1763,17 +1781,20 @@ LayoutInlineGif *StickerPanInner::layoutPrepareSavedGif(DocumentData *doc, int32 LayoutInlineItem *StickerPanInner::layoutPrepareInlineResult(InlineResult *result, int32 position) { InlineLayouts::const_iterator i = _inlineLayouts.constFind(result); if (i == _inlineLayouts.cend()) { - LayoutInlineItem *layout = 0; - if (result->type == qstr("gif")) { - layout = new LayoutInlineGif(result, 0, false); - } else if (result->type == qstr("photo")) { - layout = new LayoutInlinePhoto(result, 0); - } else if (result->type == qstr("video")) { - layout = new LayoutInlineWebVideo(result); - } else if (result->type == qstr("article")) { - layout = new LayoutInlineArticle(result, _inlineWithThumb); + LayoutInlineItem *layout = nullptr; + using Type = InlineResult::Type; + switch (result->type) { + case Type::Photo: layout = new LayoutInlinePhoto(result); break; + case Type::Video: layout = new LayoutInlineWebVideo(result); break; + case Type::Sticker: layout = new LayoutInlineSticker(result); break; + case Type::Audio: + case Type::File: //layout = new LayoutInlineFile(result); break; + case Type::Gif: layout = new LayoutInlineGif(result); break; + case Type::Article: + case Type::Contact: + case Type::Venue: layout = new LayoutInlineArticle(result, _inlineWithThumb); break; } - if (!layout) return 0; + if (!layout) return nullptr; i = _inlineLayouts.insert(result, layout); layout->initDimensions(); @@ -1959,7 +1980,7 @@ int32 StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &res int32 StickerPanInner::validateExistingInlineRows(const InlineResults &results) { int32 count = results.size(), until = 0, untilrow = 0, untilcol = 0; for (; until < count;) { - if (untilrow >= _inlineRows.size() || _inlineRows.at(untilrow).items.at(untilcol)->result() != results.at(until)) { + if (untilrow >= _inlineRows.size() || _inlineRows.at(untilrow).items.at(untilcol)->getInlineResult() != results.at(until)) { break; } ++until; @@ -2239,8 +2260,8 @@ void StickerPanInner::updateSelected() { } if (_pressedSel >= 0 && _selected >= 0 && _pressedSel != _selected) { _pressedSel = _selected; - if (row >= 0 && col >= 0 && _inlineRows.at(row).items.at(col)->document()) { - Ui::showStickerPreview(_inlineRows.at(row).items.at(col)->document()); + if (row >= 0 && col >= 0 && _inlineRows.at(row).items.at(col)->getDocument()) { + Ui::showStickerPreview(_inlineRows.at(row).items.at(col)->getDocument()); } } } @@ -2339,8 +2360,8 @@ void StickerPanInner::onPreview() { if (_pressedSel < 0) return; if (_showingInlineItems) { int32 row = _pressedSel / MatrixRowShift, col = _pressedSel % MatrixRowShift; - if (row < _inlineRows.size() && col < _inlineRows.at(row).items.size() && _inlineRows.at(row).items.at(col)->document() && _inlineRows.at(row).items.at(col)->document()->loaded()) { - Ui::showStickerPreview(_inlineRows.at(row).items.at(col)->document()); + if (row < _inlineRows.size() && col < _inlineRows.at(row).items.size() && _inlineRows.at(row).items.at(col)->getDocument() && _inlineRows.at(row).items.at(col)->getDocument()->loaded()) { + Ui::showStickerPreview(_inlineRows.at(row).items.at(col)->getDocument()); _previewShown = true; } } else if (_pressedSel < MatrixRowShift * _sets.size()) { @@ -3646,28 +3667,26 @@ void EmojiPan::inlineResultsDone(const MTPmessages_BotResults &result) { if (count) { it.value()->results.reserve(it.value()->results.size() + count); } + auto inlineResultTypes = InlineResult::getTypesMap(); + auto getInlineResultType = [&inlineResultTypes](const MTPBotInlineResult &inlineResult) -> InlineResult::Type { + QString type; + switch (inlineResult.type()) { + case mtpc_botInlineResult: type = qs(inlineResult.c_botInlineResult().vtype); break; + case mtpc_botInlineMediaResult: type = qs(inlineResult.c_botInlineMediaResult().vtype); break; + } + return inlineResultTypes.value(type, InlineResult::Type::Unknown); + }; for (int32 i = 0; i < count; ++i) { - InlineResult *result = new InlineResult(queryId); - const MTPBotInlineMessage *message = 0; + InlineResult::Type type = getInlineResultType(v.at(i)); + if (type == InlineResult::Type::Unknown) continue; + + UniquePointer result = MakeUnique(queryId, type); + + const MTPBotInlineMessage *message = nullptr; switch (v.at(i).type()) { - case mtpc_botInlineMediaResultPhoto: { - const MTPDbotInlineMediaResultPhoto &r(v.at(i).c_botInlineMediaResultPhoto()); - result->id = qs(r.vid); - result->type = qs(r.vtype); - result->photo = App::feedPhoto(r.vphoto); - message = &r.vsend_message; - } break; - case mtpc_botInlineMediaResultDocument: { - const MTPDbotInlineMediaResultDocument &r(v.at(i).c_botInlineMediaResultDocument()); - result->id = qs(r.vid); - result->type = qs(r.vtype); - result->doc = App::feedDocument(r.vdocument); - message = &r.vsend_message; - } break; case mtpc_botInlineResult: { const MTPDbotInlineResult &r(v.at(i).c_botInlineResult()); result->id = qs(r.vid); - result->type = qs(r.vtype); result->title = r.has_title() ? qs(r.vtitle) : QString(); result->description = r.has_description() ? qs(r.vdescription) : QString(); result->url = r.has_url() ? qs(r.vurl) : QString(); @@ -3682,24 +3701,56 @@ void EmojiPan::inlineResultsDone(const MTPmessages_BotResults &result) { } message = &r.vsend_message; } break; + case mtpc_botInlineMediaResult: { + const MTPDbotInlineMediaResult &r(v.at(i).c_botInlineMediaResult()); + result->id = qs(r.vid); + if (r.has_photo()) result->photo = App::feedPhoto(r.vphoto); + if (r.has_document()) result->document = App::feedDocument(r.vdocument); + message = &r.vsend_message; + } break; } - bool badAttachment = (result->photo && !result->photo->access) || (result->doc && !result->doc->access); + bool badAttachment = (result->photo && !result->photo->access) || (result->document && !result->document->access); if (!message) { - delete result; continue; } switch (message->type()) { case mtpc_botInlineMessageMediaAuto: { const MTPDbotInlineMessageMediaAuto &r(message->c_botInlineMessageMediaAuto()); - result->caption = qs(r.vcaption); + if (result->type == InlineResult::Type::Photo) { + result->sendData.reset(new InlineResultSendPhoto(result->photo, result->content_url, qs(r.vcaption))); + } else { + result->sendData.reset(new InlineResultSendFile(result->document, result->content_url, qs(r.vcaption))); + } } break; case mtpc_botInlineMessageText: { const MTPDbotInlineMessageText &r(message->c_botInlineMessageText()); - result->message = qs(r.vmessage); - if (r.has_entities()) result->entities = entitiesFromMTP(r.ventities.c_vector().v); - result->noWebPage = r.is_no_webpage(); + EntitiesInText entities = r.has_entities() ? entitiesFromMTP(r.ventities.c_vector().v) : EntitiesInText(); + result->sendData.reset(new InlineResultSendText(qs(r.vmessage), entities, r.is_no_webpage())); + } break; + + case mtpc_botInlineMessageMediaGeo: { + const MTPDbotInlineMessageMediaGeo &r(message->c_botInlineMessageMediaGeo()); + if (r.vgeo.type() == mtpc_geoPoint) { + result->sendData.reset(new InlineResultSendGeo(r.vgeo.c_geoPoint())); + } else { + badAttachment = true; + } + } break; + + case mtpc_botInlineMessageMediaVenue: { + const MTPDbotInlineMessageMediaVenue &r(message->c_botInlineMessageMediaVenue()); + if (r.vgeo.type() == mtpc_geoPoint) { + result->sendData.reset(new InlineResultSendVenue(r.vgeo.c_geoPoint(), qs(r.vvenue_id), qs(r.vprovider), qs(r.vtitle), qs(r.vaddress))); + } else { + badAttachment = true; + } + } break; + + case mtpc_botInlineMessageMediaContact: { + const MTPDbotInlineMessageMediaContact &r(message->c_botInlineMessageMediaContact()); + result->sendData.reset(new InlineResultSendContact(qs(r.vfirst_name), qs(r.vlast_name), qs(r.vphone_number))); } break; default: { @@ -3707,13 +3758,12 @@ void EmojiPan::inlineResultsDone(const MTPmessages_BotResults &result) { } break; } - bool canSend = (result->photo || result->doc || !result->message.isEmpty() || (!result->content_url.isEmpty() && (result->type == qstr("gif") || result->type == qstr("photo")))); - if (result->type.isEmpty() || badAttachment || !canSend) { - delete result; - } else { - ++added; - it.value()->results.push_back(result); + if (badAttachment || !result->sendData || !result->sendData->isValid()) { + continue; } + + ++added; + it.value()->results.push_back(result.release()); } if (!added) { diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index aa298b0e5..08c373f38 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -279,17 +279,17 @@ namespace Notify { } #define DefineReadOnlyVar(Namespace, Type, Name) const Type &Name() { \ - t_assert_full(Namespace##Data != 0, #Namespace "Data is null in " #Namespace "::" #Name, __FILE__, __LINE__); \ + t_assert_full(Namespace##Data != 0, #Namespace "Data != nullptr in " #Namespace "::" #Name, __FILE__, __LINE__); \ return Namespace##Data->Name; \ } #define DefineRefVar(Namespace, Type, Name) DefineReadOnlyVar(Namespace, Type, Name) \ Type &Ref##Name() { \ - t_assert_full(Namespace##Data != 0, #Namespace "Data is null in Global::Ref" #Name, __FILE__, __LINE__); \ + t_assert_full(Namespace##Data != 0, #Namespace "Data != nullptr in " #Namespace "::Ref" #Name, __FILE__, __LINE__); \ return Namespace##Data->Name; \ } #define DefineVar(Namespace, Type, Name) DefineRefVar(Namespace, Type, Name) \ void Set##Name(const Type &Name) { \ - t_assert_full(Namespace##Data != 0, #Namespace "Data is null in Global::Set" #Name, __FILE__, __LINE__); \ + t_assert_full(Namespace##Data != 0, #Namespace "Data != nullptr in " #Namespace "::Set" #Name, __FILE__, __LINE__); \ Namespace##Data->Name = Name; \ } diff --git a/Telegram/SourceFiles/gui/text.h b/Telegram/SourceFiles/gui/text.h index 5d2307385..e2f93ff9d 100644 --- a/Telegram/SourceFiles/gui/text.h +++ b/Telegram/SourceFiles/gui/text.h @@ -560,6 +560,8 @@ struct LocationCoords { } LocationCoords(float64 lat, float64 lon) : lat(lat), lon(lon) { } + LocationCoords(const MTPDgeoPoint &point) : lat(point.vlat.v), lon(point.vlong.v) { + } float64 lat, lon; }; inline bool operator==(const LocationCoords &a, const LocationCoords &b) { diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index cd8cd615e..c67b5d4a0 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -6751,15 +6751,13 @@ void HistoryMessage::initMedia(const MTPMessageMedia *media, QString ¤tTex case mtpc_messageMediaGeo: { const MTPGeoPoint &point(media->c_messageMediaGeo().vgeo); if (point.type() == mtpc_geoPoint) { - const MTPDgeoPoint &d(point.c_geoPoint()); - _media.reset(this, new HistoryLocation(LocationCoords(d.vlat.v, d.vlong.v))); + _media.reset(this, new HistoryLocation(LocationCoords(point.c_geoPoint()))); } } break; case mtpc_messageMediaVenue: { const MTPDmessageMediaVenue &d(media->c_messageMediaVenue()); if (d.vgeo.type() == mtpc_geoPoint) { - const MTPDgeoPoint &g(d.vgeo.c_geoPoint()); - _media.reset(this, new HistoryLocation(LocationCoords(g.vlat.v, g.vlong.v), qs(d.vtitle), qs(d.vaddress))); + _media.reset(this, new HistoryLocation(LocationCoords(d.vgeo.c_geoPoint()), qs(d.vtitle), qs(d.vaddress))); } } break; case mtpc_messageMediaPhoto: { diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 62b905ba8..7d897ad82 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -3588,7 +3588,7 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re updateTopBarSelection(); if (_inlineBot) { - _inlineBot = 0; + _inlineBot = nullptr; _emojiPan.clearInlineBot(); updateFieldPlaceholder(); } @@ -5358,7 +5358,7 @@ bool HistoryWidget::inlineBotResolveFail(QString name, const RPCError &error) { _inlineBotResolveRequestId = 0; // Notify::inlineBotRequesting(false); if (name == _inlineBotUsername) { - _inlineBot = 0; + _inlineBot = nullptr; onCheckMentionDropdown(); } return true; @@ -6765,65 +6765,22 @@ void HistoryWidget::onInlineResultSend(InlineResult *result, UserData *bot) { flags |= MTPDmessage::Flag::f_via_bot_id; } - if (result->message.isEmpty()) { - if (result->doc) { - _history->addNewDocument(newId.msg, flags, bot ? peerToUser(bot->id) : 0, replyToId(), date(MTP_int(unixtime())), showFromName ? MTP::authedId() : 0, result->doc, result->caption); - } else if (result->photo) { - _history->addNewPhoto(newId.msg, flags, bot ? peerToUser(bot->id) : 0, replyToId(), date(MTP_int(unixtime())), showFromName ? MTP::authedId() : 0, result->photo, result->caption); - } else if (result->type == qstr("gif")) { - MTPPhotoSize thumbSize; - QPixmap thumb; - int32 tw = result->thumb->width(), th = result->thumb->height(); - if (tw > 0 && th > 0 && tw < 20 * th && th < 20 * tw && result->thumb->loaded()) { - if (tw > th) { - if (tw > 90) { - th = th * 90 / tw; - tw = 90; - } - } else if (th > 90) { - tw = tw * 90 / th; - th = 90; - } - thumbSize = MTP_photoSize(MTP_string(""), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(tw), MTP_int(th), MTP_int(0)); - thumb = result->thumb->pixNoCache(tw, th, ImagePixSmooth); - } else { - tw = th = 0; - thumbSize = MTP_photoSizeEmpty(MTP_string("")); - } - uint64 docId = rand_value(); - QVector attributes(1, MTP_documentAttributeFilename(MTP_string((result->content_type == qstr("video/mp4") ? "animation.gif.mp4" : "animation.gif")))); - attributes.push_back(MTP_documentAttributeAnimated()); - attributes.push_back(MTP_documentAttributeVideo(MTP_int(result->duration), MTP_int(result->width), MTP_int(result->height))); - MTPDocument document = MTP_document(MTP_long(docId), MTP_long(0), MTP_int(unixtime()), MTP_string(result->content_type), MTP_int(result->data().size()), thumbSize, MTP_int(MTP::maindc()), MTP_vector(attributes)); - if (tw > 0 && th > 0) { - App::feedDocument(document, thumb); - } - Local::writeStickerImage(mediaKey(DocumentFileLocation, MTP::maindc(), docId), result->data()); - _history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(newId.msg), MTP_int(showFromName ? MTP::authedId() : 0), peerToMTP(_history->peer->id), MTPnullFwdHeader, MTP_int(bot ? peerToUser(bot->id) : 0), MTP_int(replyToId()), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaDocument(document, MTP_string(result->caption)), MTPnullMarkup, MTPnullEntities, MTP_int(1), MTPint()), NewMessageUnread); - } else if (result->type == qstr("photo")) { - QImage fileThumb(result->thumb->pix().toImage()); - - QVector photoSizes; - - QPixmap thumb = (fileThumb.width() > 100 || fileThumb.height() > 100) ? QPixmap::fromImage(fileThumb.scaled(100, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::ColorOnly) : QPixmap::fromImage(fileThumb); - ImagePtr thumbPtr = ImagePtr(thumb, "JPG"); - photoSizes.push_back(MTP_photoSize(MTP_string("s"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(thumb.width()), MTP_int(thumb.height()), MTP_int(0))); - - QSize medium = resizeKeepAspect(result->width, result->height, 320, 320); - photoSizes.push_back(MTP_photoSize(MTP_string("m"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(medium.width()), MTP_int(medium.height()), MTP_int(0))); - - photoSizes.push_back(MTP_photoSize(MTP_string("x"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(result->width), MTP_int(result->height), MTP_int(0))); - - uint64 photoId = rand_value(); - PhotoData *ph = App::photoSet(photoId, 0, 0, unixtime(), thumbPtr, ImagePtr(medium.width(), medium.height()), ImagePtr(result->width, result->height)); - MTPPhoto photo = MTP_photo(MTP_long(photoId), MTP_long(0), MTP_int(ph->date), MTP_vector(photoSizes)); - - _history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(newId.msg), MTP_int(showFromName ? MTP::authedId() : 0), peerToMTP(_history->peer->id), MTPnullFwdHeader, MTP_int(bot ? peerToUser(bot->id) : 0), MTP_int(replyToId()), MTP_int(unixtime()), MTP_string(""), MTP_messageMediaPhoto(photo, MTP_string(result->caption)), MTPnullMarkup, MTPnullEntities, MTP_int(1), MTPint()), NewMessageUnread); - } + UserId messageFromId = showFromName ? MTP::authedId() : 0; + MTPint messageDate = MTP_int(unixtime()); + UserId messageViaBotId = bot ? peerToUser(bot->id) : 0; + MsgId messageId = newId.msg; + if (DocumentData *document = result->sendData->getSentDocument()) { + _history->addNewDocument(messageId, flags, messageViaBotId, replyToId(), date(messageDate), messageFromId, document, result->sendData->getSentCaption()); + } else if (PhotoData *photo = result->sendData->getSentPhoto()) { + _history->addNewPhoto(messageId, flags, messageViaBotId, replyToId(), date(messageDate), messageFromId, photo, result->sendData->getSentCaption()); } else { - flags |= MTPDmessage::Flag::f_entities; - _history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(newId.msg), MTP_int(showFromName ? MTP::authedId() : 0), peerToMTP(_history->peer->id), MTPnullFwdHeader, MTP_int(bot ? peerToUser(bot->id) : 0), MTP_int(replyToId()), MTP_int(unixtime()), MTP_string(result->message), MTP_messageMediaEmpty(), MTPnullMarkup, linksToMTP(result->entities), MTP_int(1), MTPint()), NewMessageUnread); + InlineResultSendData::SentMTPMessageFields fields = result->sendData->getSentMessageFields(result); + if (!fields.entities.c_vector().v.isEmpty()) { + flags |= MTPDmessage::Flag::f_entities; + } + _history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(messageId), MTP_int(messageFromId), peerToMTP(_history->peer->id), MTPnullFwdHeader, MTP_int(messageViaBotId), MTP_int(replyToId()), messageDate, fields.text, fields.media, MTPnullMarkup, fields.entities, MTP_int(1), MTPint()), NewMessageUnread); } + _history->sendRequestId = MTP::send(MTPmessages_SendInlineBotResult(MTP_flags(sendFlags), _peer->input, MTP_int(replyToId()), MTP_long(randomId), MTP_long(result->queryId), MTP_string(result->id)), App::main()->rpcDone(&MainWidget::sentUpdatesReceived), App::main()->rpcFail(&MainWidget::sendMessageFail), 0, 0, _history->sendRequestId); App::main()->finishForwarding(_history, _broadcast.checked(), _silent.checked()); cancelReply(lastKeyboardUsed); diff --git a/Telegram/SourceFiles/layout.cpp b/Telegram/SourceFiles/layout.cpp index b1f3d572d..72528908a 100644 --- a/Telegram/SourceFiles/layout.cpp +++ b/Telegram/SourceFiles/layout.cpp @@ -1335,13 +1335,6 @@ LayoutOverviewLink::Link::Link(const QString &url, const QString &text) , lnk(clickHandlerFromUrl(url)) { } -LayoutInlineItem::LayoutInlineItem(InlineResult *result, DocumentData *doc, PhotoData *photo) : LayoutItem() -, _result(result) -, _doc(doc) -, _photo(photo) -, _position(0) { -} - void LayoutInlineItem::setPosition(int32 position) { _position = position; } @@ -1350,15 +1343,15 @@ int32 LayoutInlineItem::position() const { return _position; } -InlineResult *LayoutInlineItem::result() const { +InlineResult *LayoutInlineItem::getInlineResult() const { return _result; } -DocumentData *LayoutInlineItem::document() const { +DocumentData *LayoutInlineItem::getDocument() const { return _doc; } -PhotoData *LayoutInlineItem::photo() const { +PhotoData *LayoutInlineItem::getPhoto() const { return _photo; } @@ -1366,8 +1359,8 @@ void LayoutInlineItem::preload() { if (_result) { if (_result->photo) { _result->photo->thumb->load(); - } else if (_result->doc) { - _result->doc->thumb->load(); + } else if (_result->document) { + _result->document->thumb->load(); } else if (!_result->thumb->isNull()) { _result->thumb->load(); } @@ -1384,12 +1377,103 @@ void LayoutInlineItem::update() { } } -LayoutInlineGif::LayoutInlineGif(InlineResult *result, DocumentData *doc, bool saved) : LayoutInlineItem(result, doc, 0) -, _state(0) -, _gif(0) -, _send(new SendInlineItemClickHandler()) -, _delete((doc && saved) ? new DeleteSavedGifClickHandler(doc) : nullptr) -, _animation(0) { +LayoutInlineAbstractFile::LayoutInlineAbstractFile(InlineResult *result) : LayoutInlineItem(result) { +} + +LayoutInlineAbstractFile::LayoutInlineAbstractFile(DocumentData *document) : LayoutInlineItem(document) { +} + +int LayoutInlineAbstractFile::content_width() const { + if (DocumentData *document = getShownDocument()) { + if (document->dimensions.width() > 0) { + return document->dimensions.width(); + } + if (!document->thumb->isNull()) { + return convertScale(document->thumb->width()); + } + } else if (_result) { + return _result->width; + } + return 0; +} + +int LayoutInlineAbstractFile::content_height() const { + if (DocumentData *document = getShownDocument()) { + if (document->dimensions.height() > 0) { + return document->dimensions.height(); + } + if (!document->thumb->isNull()) { + return convertScale(document->thumb->height()); + } + } else if (_result) { + return _result->height; + } + return 0; +} + +bool LayoutInlineAbstractFile::content_loading() const { + if (DocumentData *document = getShownDocument()) { + return document->loading(); + } + return _result->loading(); +} + +bool LayoutInlineAbstractFile::content_displayLoading() const { + if (DocumentData *document = getShownDocument()) { + return document->displayLoading(); + } + return _result->displayLoading(); +} + +bool LayoutInlineAbstractFile::content_loaded() const { + if (DocumentData *document = getShownDocument()) { + return document->loaded(); + } + return _result->loaded(); +} + +float64 LayoutInlineAbstractFile::content_progress() const { + if (DocumentData *document = getShownDocument()) { + return document->progress(); + } + return _result->progress(); +} + +void LayoutInlineAbstractFile::content_automaticLoad() const { + if (DocumentData *document = getShownDocument()) { + document->automaticLoad(nullptr); + } else { + _result->automaticLoadGif(); + } +} + +void LayoutInlineAbstractFile::content_forget() { + if (DocumentData *document = getShownDocument()) { + document->forget(); + } else { + _result->forget(); + } +} + +FileLocation LayoutInlineAbstractFile::content_location() const { + if (DocumentData *document = getShownDocument()) { + return document->location(); + } + return FileLocation(); +} + +QByteArray LayoutInlineAbstractFile::content_data() const { + if (DocumentData *document = getShownDocument()) { + return document->data(); + } + return _result->data(); +} + +LayoutInlineGif::LayoutInlineGif(InlineResult *result) : LayoutInlineAbstractFile(result) { +} + +LayoutInlineGif::LayoutInlineGif(DocumentData *document, bool hasDeleteButton) : LayoutInlineAbstractFile(document) +, _delete(hasDeleteButton ? new DeleteSavedGifClickHandler(document) : nullptr) { } void LayoutInlineGif::initDimensions() { @@ -1466,7 +1550,7 @@ void LayoutInlineGif::paint(Painter &p, const QRect &clip, uint32 selection, con p.setOpacity((st::msgDateImgBg->c.alphaF() * (1 - over)) + (st::msgDateImgBgOver->c.alphaF() * over)); p.fillRect(r, st::black); } else { - p.fillRect(r, (_state & StateOver) ? st::msgDateImgBgOver : st::msgDateImgBg); + p.fillRect(r, (_state & StateFlag::Over) ? st::msgDateImgBgOver : st::msgDateImgBg); } p.setOpacity(radialOpacity * p.opacity()); @@ -1488,8 +1572,8 @@ void LayoutInlineGif::paint(Painter &p, const QRect &clip, uint32 selection, con } } - if (_delete && (_state & StateOver)) { - float64 deleteOver = _a_deleteOver.current(context->ms, (_state & StateDeleteOver) ? 1 : 0); + if (_delete && (_state & StateFlag::Over)) { + float64 deleteOver = _a_deleteOver.current(context->ms, (_state & StateFlag::DeleteOver) ? 1 : 0); QPoint deletePos = QPoint(_width - st::stickerPanDelete.pxWidth(), 0); p.setOpacity(deleteOver + (1 - deleteOver) * st::stickerPanDeleteOpacity); p.drawSpriteLeft(deletePos, _width, st::stickerPanDelete); @@ -1511,20 +1595,20 @@ void LayoutInlineGif::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool a if (!p) return; if (_delete && p == _delete) { - bool wasactive = (_state & StateDeleteOver); + bool wasactive = (_state & StateFlag::DeleteOver); if (active != wasactive) { float64 from = active ? 0 : 1, to = active ? 1 : 0; EnsureAnimation(_a_deleteOver, from, func(this, &LayoutInlineGif::update)); _a_deleteOver.start(to, st::stickersRowDuration); if (active) { - _state |= StateDeleteOver; + _state |= StateFlag::DeleteOver; } else { - _state &= ~StateDeleteOver; + _state &= ~StateFlag::DeleteOver; } } } if (p == _delete || p == _send) { - bool wasactive = (_state & StateOver); + bool wasactive = (_state & StateFlag::Over); if (active != wasactive) { if (!content_loaded()) { ensureAnimation(); @@ -1533,9 +1617,9 @@ void LayoutInlineGif::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool a _animation->_a_over.start(to, st::stickersRowDuration); } if (active) { - _state |= StateOver; + _state |= StateFlag::Over; } else { - _state &= ~StateOver; + _state &= ~StateFlag::Over; } } } @@ -1579,22 +1663,25 @@ LayoutInlineGif::~LayoutInlineGif() { } void LayoutInlineGif::prepareThumb(int32 width, int32 height, const QSize &frame) const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - if (doc && !doc->thumb->isNull()) { - if (doc->thumb->loaded()) { - if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { - _thumb = doc->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), ImagePixSmooth, width, height); + if (DocumentData *document = getShownDocument()) { + if (!document->thumb->isNull()) { + if (document->thumb->loaded()) { + if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { + _thumb = document->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), ImagePixSmooth, width, height); + } + } else { + document->thumb->load(); } - } else { - doc->thumb->load(); } - } else if (_result && !_result->thumb_url.isEmpty()) { - if (_result->thumb->loaded()) { - if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { - _thumb = _result->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), ImagePixSmooth, width, height); + } else { + if (!_result->thumb_url.isEmpty()) { + if (_result->thumb->loaded()) { + if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { + _thumb = _result->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), ImagePixSmooth, width, height); + } + } else { + _result->thumb->load(); } - } else { - _result->thumb->load(); } } } @@ -1654,87 +1741,69 @@ void LayoutInlineGif::clipCallback(ClipReaderNotification notification) { } } -int32 LayoutInlineGif::content_width() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - if (doc) { - if (doc->dimensions.width() > 0) { - return doc->dimensions.width(); - } - if (!doc->thumb->isNull()) { - return convertScale(doc->thumb->width()); - } - } else if (_result) { - return _result->width; +LayoutInlineSticker::LayoutInlineSticker(InlineResult *result) : LayoutInlineAbstractFile(result) { +} + +void LayoutInlineSticker::initDimensions() { + _maxw = st::stickerPanSize.width(); + _minh = st::stickerPanSize.height(); +} + +void LayoutInlineSticker::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const { + bool loaded = content_loaded(); + + prepareThumb(); + if (!_thumb.isNull()) { + int w = _thumb.width() / cIntRetinaFactor(), h = _thumb.height() / cIntRetinaFactor(); + QPoint pos = QPoint((st::stickerPanSize.width() - w) / 2, (st::stickerPanSize.height() - h) / 2); + p.drawPixmap(pos, _thumb); } - return 0; } -int32 LayoutInlineGif::content_height() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - if (doc) { - if (doc->dimensions.height() > 0) { - return doc->dimensions.height(); - } - if (!doc->thumb->isNull()) { - return convertScale(doc->thumb->height()); - } - } else if (_result) { - return _result->height; +void LayoutInlineSticker::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const { + if (x >= 0 && x < _width && y >= 0 && y < st::inlineMediaHeight) { + link = _send; } - return 0; } -bool LayoutInlineGif::content_loading() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->loading() : _result->loading(); +QSize LayoutInlineSticker::getThumbSize() const { + int width = qMax(content_width(), 1), height = qMax(content_height(), 1); + float64 coefw = (st::stickerPanSize.width() - st::msgRadius * 2) / float64(width); + float64 coefh = (st::stickerPanSize.height() - st::msgRadius * 2) / float64(height); + float64 coef = qMin(qMin(coefw, coefh), 1.); + int w = qRound(coef * content_width()), h = qRound(coef * content_height()); + return QSize(qMax(w, 1), qMax(h, 1)); } -bool LayoutInlineGif::content_displayLoading() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->displayLoading() : _result->displayLoading(); -} +void LayoutInlineSticker::prepareThumb() const { + if (DocumentData *document = getShownDocument()) { + bool goodThumb = !document->thumb->isNull() && ((document->thumb->width() >= 128) || (document->thumb->height() >= 128)); + if (goodThumb) { + document->thumb->load(); + } else { + document->checkSticker(); + } -bool LayoutInlineGif::content_loaded() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->loaded() : _result->loaded(); -} - -float64 LayoutInlineGif::content_progress() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->progress() : _result->progress(); -} - -void LayoutInlineGif::content_automaticLoad() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - if (doc) { - doc->automaticLoad(0); + ImagePtr sticker = goodThumb ? document->thumb : document->sticker()->img; + if (!_thumbLoaded && sticker->loaded()) { + QSize thumbSize = getThumbSize(); + _thumb = sticker->pix(thumbSize.width(), thumbSize.height()); + _thumbLoaded = true; + } } else { - _result->automaticLoadGif(); + if (_result->thumb->loaded()) { + if (!_thumbLoaded) { + QSize thumbSize = getThumbSize(); + _thumb = _result->thumb->pix(thumbSize.width(), thumbSize.height()); + _thumbLoaded = true; + } + } else { + _result->thumb->load(); + } } } -void LayoutInlineGif::content_forget() { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - if (doc) { - doc->forget(); - } else { - _result->forget(); - } -} - -FileLocation LayoutInlineGif::content_location() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->location() : FileLocation(); -} - -QByteArray LayoutInlineGif::content_data() const { - DocumentData *doc = _doc ? _doc : (_result ? _result->doc : 0); - return doc ? doc->data() : _result->data(); -} - -LayoutInlinePhoto::LayoutInlinePhoto(InlineResult *result, PhotoData *photo) : LayoutInlineItem(result, 0, photo) -, _send(new SendInlineItemClickHandler()) -, _thumbLoaded(false) { +LayoutInlinePhoto::LayoutInlinePhoto(InlineResult *result) : LayoutInlineItem(result) { } void LayoutInlinePhoto::initDimensions() { @@ -1797,8 +1866,7 @@ QSize LayoutInlinePhoto::countFrameSize() const { } void LayoutInlinePhoto::prepareThumb(int32 width, int32 height, const QSize &frame) const { - PhotoData *photo = _photo ? _photo : (_result ? _result->photo : 0); - if (photo) { + if (PhotoData *photo = getShownPhoto()) { if (photo->medium->loaded()) { if (!_thumbLoaded || _thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { _thumb = photo->medium->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), ImagePixSmooth, width, height); @@ -1823,9 +1891,8 @@ void LayoutInlinePhoto::prepareThumb(int32 width, int32 height, const QSize &fra } } -int32 LayoutInlinePhoto::content_width() const { - PhotoData *photo = _photo ? _photo : (_result ? _result->photo : 0); - if (photo) { +int LayoutInlinePhoto::content_width() const { + if (PhotoData *photo = getShownPhoto()) { return photo->full->width(); } else if (_result) { return _result->width; @@ -1833,9 +1900,8 @@ int32 LayoutInlinePhoto::content_width() const { return 0; } -int32 LayoutInlinePhoto::content_height() const { - PhotoData *photo = _photo ? _photo : (_result ? _result->photo : 0); - if (photo) { +int LayoutInlinePhoto::content_height() const { + if (PhotoData *photo = getShownPhoto()) { return photo->full->height(); } else if (_result) { return _result->height; @@ -1844,21 +1910,21 @@ int32 LayoutInlinePhoto::content_height() const { } bool LayoutInlinePhoto::content_loaded() const { - PhotoData *photo = _photo ? _photo : (_result ? _result->photo : 0); - return photo ? photo->loaded() : _result->loaded(); + if (PhotoData *photo = getShownPhoto()) { + return photo->loaded(); + } + return _result->loaded(); } void LayoutInlinePhoto::content_forget() { - PhotoData *photo = _photo ? _photo : (_result ? _result->photo : 0); - if (photo) { + if (PhotoData *photo = getShownPhoto()) { photo->forget(); } else { _result->forget(); } } -LayoutInlineWebVideo::LayoutInlineWebVideo(InlineResult *result) : LayoutInlineItem(result, 0, 0) -, _send(new SendInlineItemClickHandler()) +LayoutInlineWebVideo::LayoutInlineWebVideo(InlineResult *result) : LayoutInlineItem(result) , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) , _description(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) { if (!result->content_url.isEmpty()) { @@ -1951,8 +2017,7 @@ void LayoutInlineWebVideo::prepareThumb(int32 width, int32 height) const { } } -LayoutInlineArticle::LayoutInlineArticle(InlineResult *result, bool withThumb) : LayoutInlineItem(result, 0, 0) -, _send(new SendInlineItemClickHandler()) +LayoutInlineArticle::LayoutInlineArticle(InlineResult *result, bool withThumb) : LayoutInlineItem(result) , _withThumb(withThumb) , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) , _description(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) { diff --git a/Telegram/SourceFiles/layout.h b/Telegram/SourceFiles/layout.h index 3a740e403..0777ee14f 100644 --- a/Telegram/SourceFiles/layout.h +++ b/Telegram/SourceFiles/layout.h @@ -471,10 +471,23 @@ public: bool paused, lastRow; }; +// this type used as a flag, we dynamic_cast<> to it +class SendInlineItemClickHandler : public ClickHandler { +public: + void onClick(Qt::MouseButton) const override { + } +}; + class LayoutInlineItem : public LayoutItem { public: - LayoutInlineItem(InlineResult *result, DocumentData *doc, PhotoData *photo); + LayoutInlineItem(InlineResult *result) : _result(result) { + } + LayoutInlineItem(DocumentData *doc) : _doc(doc) { + } + // Not used anywhere currently. + //LayoutInlineItem(PhotoData *photo) : _photo(photo) { + //} virtual void setPosition(int32 position); int32 position() const; @@ -483,9 +496,9 @@ public: return true; } - InlineResult *result() const; - DocumentData *document() const; - PhotoData *photo() const; + InlineResult *getInlineResult() const; + DocumentData *getDocument() const; + PhotoData *getPhoto() const; void preload(); void update(); @@ -499,19 +512,43 @@ public: } protected: - InlineResult *_result; - DocumentData *_doc; - PhotoData *_photo; + InlineResult *_result = nullptr; + DocumentData *_doc = nullptr; + PhotoData *_photo = nullptr; - int32 _position; // < 0 means removed from layout + ClickHandlerPtr _send = ClickHandlerPtr{ new SendInlineItemClickHandler() }; + + int _position = 0; // < 0 means removed from layout }; -// this type used as a flag, we dynamic_cast<> to it -class SendInlineItemClickHandler : public ClickHandler { +class LayoutInlineAbstractFile : public LayoutInlineItem { public: - void onClick(Qt::MouseButton) const override { + LayoutInlineAbstractFile(InlineResult *result); + // for saved gif layouts + LayoutInlineAbstractFile(DocumentData *doc); + +protected: + DocumentData *getShownDocument() const { + if (DocumentData *result = getDocument()) { + return result; + } else if (InlineResult *result = getInlineResult()) { + return result->document; + } + return nullptr; } + + int content_width() const; + int content_height() const; + bool content_loading() const; + bool content_displayLoading() const; + bool content_loaded() const; + float64 content_progress() const; + void content_automaticLoad() const; + void content_forget(); + FileLocation content_location() const; + QByteArray content_data() const; + }; class DeleteSavedGifClickHandler : public LeftButtonClickHandler { @@ -527,9 +564,10 @@ private: }; -class LayoutInlineGif : public LayoutInlineItem { +class LayoutInlineGif : public LayoutInlineAbstractFile { public: - LayoutInlineGif(InlineResult *result, DocumentData *doc, bool saved); + LayoutInlineGif(InlineResult *result); + LayoutInlineGif(DocumentData *doc, bool hasDeleteButton); void setPosition(int32 position) override; void initDimensions() override; @@ -548,27 +586,21 @@ public: ~LayoutInlineGif(); private: + QSize countFrameSize() const; - int32 content_width() const; - int32 content_height() const; - bool content_loading() const; - bool content_displayLoading() const; - bool content_loaded() const; - float64 content_progress() const; - void content_automaticLoad() const; - void content_forget(); - FileLocation content_location() const; - QByteArray content_data() const; - - enum StateFlags { - StateOver = 0x01, - StateDeleteOver = 0x02, + enum class StateFlag { + Over = 0x01, + DeleteOver = 0x02, }; - int32 _state; + Q_DECLARE_FLAGS(StateFlags, StateFlag); + StateFlags _state; + friend inline StateFlags operator~(StateFlag flag) { + return ~StateFlags(flag); + } - ClipReader *_gif; - ClickHandlerPtr _send, _delete; + ClipReader *_gif = nullptr; + ClickHandlerPtr _delete; bool gif() const { return (!_gif || _gif == BadClipReader) ? false : true; } @@ -590,14 +622,16 @@ private: FloatAnimation _a_over; RadialAnimation radial; }; - mutable AnimationData *_animation; + mutable AnimationData *_animation = nullptr; mutable FloatAnimation _a_deleteOver; }; class LayoutInlinePhoto : public LayoutInlineItem { public: - LayoutInlinePhoto(InlineResult *result, PhotoData *photo); + LayoutInlinePhoto(InlineResult *result); + // Not used anywhere currently. + //LayoutInlinePhoto(PhotoData *photo); void initDimensions() override; @@ -609,18 +643,50 @@ public: void getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const override; private: + PhotoData *getShownPhoto() const { + if (PhotoData *result = getPhoto()) { + return result; + } else if (InlineResult *result = getInlineResult()) { + return result->photo; + } + return nullptr; + } + QSize countFrameSize() const; - int32 content_width() const; - int32 content_height() const; + int content_width() const; + int content_height() const; bool content_loaded() const; void content_forget(); - ClickHandlerPtr _send; + mutable QPixmap _thumb; + mutable bool _thumbLoaded = false; + void prepareThumb(int32 width, int32 height, const QSize &frame) const; + +}; + +class LayoutInlineSticker : public LayoutInlineAbstractFile { +public: + LayoutInlineSticker(InlineResult *result); + // Not used anywhere currently. + //LayoutInlineSticker(DocumentData *document); + + void initDimensions() override; + + bool fullLine() const override { + return false; + } + + void paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const override; + void getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const override; + +private: + + QSize getThumbSize() const; mutable QPixmap _thumb; - mutable bool _thumbLoaded; - void prepareThumb(int32 width, int32 height, const QSize &frame) const; + mutable bool _thumbLoaded = false; + void prepareThumb() const; }; @@ -635,7 +701,7 @@ public: private: - ClickHandlerPtr _send, _link; + ClickHandlerPtr _link; mutable QPixmap _thumb; Text _title, _description; @@ -646,6 +712,27 @@ private: }; +class LayoutInlineFile : public LayoutInlineAbstractFile { +public: + LayoutInlineFile(InlineResult *result); + + void initDimensions() override; + int32 resizeGetHeight(int32 width) override; + + void paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const override; + void getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const override; + +private: + + mutable QPixmap _thumb; + Text _title, _description; + QString _letter, _urlText; + int32 _urlWidth; + + void prepareThumb(int32 width, int32 height) const; + +}; + class LayoutInlineArticle : public LayoutInlineItem { public: LayoutInlineArticle(InlineResult *result, bool withThumb); @@ -658,7 +745,7 @@ public: private: - ClickHandlerPtr _send, _url, _link; + ClickHandlerPtr _url, _link; bool _withThumb; mutable QPixmap _thumb; diff --git a/Telegram/SourceFiles/mtproto/scheme.tl b/Telegram/SourceFiles/mtproto/scheme.tl index cd3ffacb4..90885da72 100644 --- a/Telegram/SourceFiles/mtproto/scheme.tl +++ b/Telegram/SourceFiles/mtproto/scheme.tl @@ -639,8 +639,6 @@ inputBotInlineMessageMediaVenue#8ab91f84 geo_point:InputGeoPoint title:string ad inputBotInlineMessageMediaContact#52971c52 phone_number:string first_name:string last_name:string = InputBotInlineMessage; inputBotInlineResult#2cbbe15a flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:InputBotInlineMessage = InputBotInlineResult; -inputBotInlineResultPhoto#243edc26 flags:# id:string type:string photo:InputPhoto send_message:InputBotInlineMessage = InputBotInlineResult; -inputBotInlineResultDocument#11af9bcc flags:# id:string type:string title:flags.1?string description:flags.2?string document:flags.5?InputDocument send_message:InputBotInlineMessage = InputBotInlineResult; botInlineMessageMediaAuto#fc56e87d caption:string = BotInlineMessage; botInlineMessageText#a56197a9 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector = BotInlineMessage; @@ -648,9 +646,8 @@ botInlineMessageMediaGeo#59d1ff36 geo:GeoPoint = BotInlineMessage; botInlineMessageMediaVenue#6fa16678 geo:GeoPoint title:string address:string provider:string venue_id:string = BotInlineMessage; botInlineMessageMediaContact#89202361 phone_number:string first_name:string last_name:string = BotInlineMessage; -botInlineMediaResultDocument#f897d33e id:string type:string document:Document send_message:BotInlineMessage = BotInlineResult; -botInlineMediaResultPhoto#c5528587 id:string type:string photo:Photo send_message:BotInlineMessage = BotInlineResult; botInlineResult#9bebaeb9 flags:# id:string type:string title:flags.1?string description:flags.2?string url:flags.3?string thumb_url:flags.4?string content_url:flags.5?string content_type:flags.5?string w:flags.6?int h:flags.6?int duration:flags.7?int send_message:BotInlineMessage = BotInlineResult; +botInlineMediaResult#17db940b flags:# id:string type:string photo:flags.0?Photo document:flags.1?Document title:flags.2?string description:flags.3?string send_message:BotInlineMessage = BotInlineResult; messages.botResults#1170b0a3 flags:# gallery:flags.0?true query_id:long next_offset:flags.1?string results:Vector = messages.BotResults; diff --git a/Telegram/SourceFiles/mtproto/scheme_auto.cpp b/Telegram/SourceFiles/mtproto/scheme_auto.cpp index 048e2e8c8..ad4c77d8d 100644 --- a/Telegram/SourceFiles/mtproto/scheme_auto.cpp +++ b/Telegram/SourceFiles/mtproto/scheme_auto.cpp @@ -5205,44 +5205,6 @@ void _serialize_inputBotInlineResult(MTPStringLogger &to, int32 stage, int32 lev } } -void _serialize_inputBotInlineResultPhoto(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputBotInlineResultPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_flags); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 4: to.add(" send_message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } -} - -void _serialize_inputBotInlineResultDocument(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { - MTPDinputBotInlineResultDocument::Flags flag(iflag); - - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ inputBotInlineResultDocument"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_flags); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" title: "); ++stages.back(); if (flag & MTPDinputBotInlineResultDocument::Flag::f_title) { types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 1 IN FIELD flags ]"); } break; - case 4: to.add(" description: "); ++stages.back(); if (flag & MTPDinputBotInlineResultDocument::Flag::f_description) { types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; - case 5: to.add(" document: "); ++stages.back(); if (flag & MTPDinputBotInlineResultDocument::Flag::f_document) { types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 5 IN FIELD flags ]"); } break; - case 6: to.add(" send_message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } -} - void _serialize_botInlineMessageMediaAuto(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { if (stage) { to.add(",\n").addSpaces(lev); @@ -5319,38 +5281,6 @@ void _serialize_botInlineMessageMediaContact(MTPStringLogger &to, int32 stage, i } } -void _serialize_botInlineMediaResultDocument(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ botInlineMediaResultDocument"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" document: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" send_message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } -} - -void _serialize_botInlineMediaResultPhoto(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { - if (stage) { - to.add(",\n").addSpaces(lev); - } else { - to.add("{ botInlineMediaResultPhoto"); - to.add("\n").addSpaces(lev); - } - switch (stage) { - case 0: to.add(" id: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 1: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 2: to.add(" photo: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - case 3: to.add(" send_message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; - default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; - } -} - void _serialize_botInlineResult(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { MTPDbotInlineResult::Flags flag(iflag); @@ -5378,6 +5308,28 @@ void _serialize_botInlineResult(MTPStringLogger &to, int32 stage, int32 lev, Typ } } +void _serialize_botInlineMediaResult(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { + MTPDbotInlineMediaResult::Flags flag(iflag); + + if (stage) { + to.add(",\n").addSpaces(lev); + } else { + to.add("{ botInlineMediaResult"); + to.add("\n").addSpaces(lev); + } + switch (stage) { + case 0: to.add(" flags: "); ++stages.back(); if (start >= end) throw Exception("start >= end in flags"); else flags.back() = *start; types.push_back(mtpc_flags); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 1: to.add(" id: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 2: to.add(" type: "); ++stages.back(); types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + case 3: to.add(" photo: "); ++stages.back(); if (flag & MTPDbotInlineMediaResult::Flag::f_photo) { types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 0 IN FIELD flags ]"); } break; + case 4: to.add(" document: "); ++stages.back(); if (flag & MTPDbotInlineMediaResult::Flag::f_document) { types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 1 IN FIELD flags ]"); } break; + case 5: to.add(" title: "); ++stages.back(); if (flag & MTPDbotInlineMediaResult::Flag::f_title) { types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 2 IN FIELD flags ]"); } break; + case 6: to.add(" description: "); ++stages.back(); if (flag & MTPDbotInlineMediaResult::Flag::f_description) { types.push_back(mtpc_string+0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); } else { to.add("[ SKIPPED BY BIT 3 IN FIELD flags ]"); } break; + case 7: to.add(" send_message: "); ++stages.back(); types.push_back(0); vtypes.push_back(0); stages.push_back(0); flags.push_back(0); break; + default: to.add("}"); types.pop_back(); vtypes.pop_back(); stages.pop_back(); flags.pop_back(); break; + } +} + void _serialize_messages_botResults(MTPStringLogger &to, int32 stage, int32 lev, Types &types, Types &vtypes, StagesFlags &stages, StagesFlags &flags, const mtpPrime *start, const mtpPrime *end, int32 iflag) { MTPDmessages_botResults::Flags flag(iflag); @@ -8437,16 +8389,13 @@ namespace { _serializers.insert(mtpc_inputBotInlineMessageMediaVenue, _serialize_inputBotInlineMessageMediaVenue); _serializers.insert(mtpc_inputBotInlineMessageMediaContact, _serialize_inputBotInlineMessageMediaContact); _serializers.insert(mtpc_inputBotInlineResult, _serialize_inputBotInlineResult); - _serializers.insert(mtpc_inputBotInlineResultPhoto, _serialize_inputBotInlineResultPhoto); - _serializers.insert(mtpc_inputBotInlineResultDocument, _serialize_inputBotInlineResultDocument); _serializers.insert(mtpc_botInlineMessageMediaAuto, _serialize_botInlineMessageMediaAuto); _serializers.insert(mtpc_botInlineMessageText, _serialize_botInlineMessageText); _serializers.insert(mtpc_botInlineMessageMediaGeo, _serialize_botInlineMessageMediaGeo); _serializers.insert(mtpc_botInlineMessageMediaVenue, _serialize_botInlineMessageMediaVenue); _serializers.insert(mtpc_botInlineMessageMediaContact, _serialize_botInlineMessageMediaContact); - _serializers.insert(mtpc_botInlineMediaResultDocument, _serialize_botInlineMediaResultDocument); - _serializers.insert(mtpc_botInlineMediaResultPhoto, _serialize_botInlineMediaResultPhoto); _serializers.insert(mtpc_botInlineResult, _serialize_botInlineResult); + _serializers.insert(mtpc_botInlineMediaResult, _serialize_botInlineMediaResult); _serializers.insert(mtpc_messages_botResults, _serialize_messages_botResults); _serializers.insert(mtpc_exportedMessageLink, _serialize_exportedMessageLink); _serializers.insert(mtpc_messageFwdHeader, _serialize_messageFwdHeader); diff --git a/Telegram/SourceFiles/mtproto/scheme_auto.h b/Telegram/SourceFiles/mtproto/scheme_auto.h index 81dc6dd9b..05c2e27c1 100644 --- a/Telegram/SourceFiles/mtproto/scheme_auto.h +++ b/Telegram/SourceFiles/mtproto/scheme_auto.h @@ -461,16 +461,13 @@ enum { mtpc_inputBotInlineMessageMediaVenue = 0x8ab91f84, mtpc_inputBotInlineMessageMediaContact = 0x52971c52, mtpc_inputBotInlineResult = 0x2cbbe15a, - mtpc_inputBotInlineResultPhoto = 0x243edc26, - mtpc_inputBotInlineResultDocument = 0x11af9bcc, mtpc_botInlineMessageMediaAuto = 0xfc56e87d, mtpc_botInlineMessageText = 0xa56197a9, mtpc_botInlineMessageMediaGeo = 0x59d1ff36, mtpc_botInlineMessageMediaVenue = 0x6fa16678, mtpc_botInlineMessageMediaContact = 0x89202361, - mtpc_botInlineMediaResultDocument = 0xf897d33e, - mtpc_botInlineMediaResultPhoto = 0xc5528587, mtpc_botInlineResult = 0x9bebaeb9, + mtpc_botInlineMediaResult = 0x17db940b, mtpc_messages_botResults = 0x1170b0a3, mtpc_exportedMessageLink = 0x1f486803, mtpc_messageFwdHeader = 0xc786ddcb, @@ -1270,8 +1267,6 @@ class MTPDinputBotInlineMessageMediaContact; class MTPinputBotInlineResult; class MTPDinputBotInlineResult; -class MTPDinputBotInlineResultPhoto; -class MTPDinputBotInlineResultDocument; class MTPbotInlineMessage; class MTPDbotInlineMessageMediaAuto; @@ -1281,9 +1276,8 @@ class MTPDbotInlineMessageMediaVenue; class MTPDbotInlineMessageMediaContact; class MTPbotInlineResult; -class MTPDbotInlineMediaResultDocument; -class MTPDbotInlineMediaResultPhoto; class MTPDbotInlineResult; +class MTPDbotInlineMediaResult; class MTPmessages_botResults; class MTPDmessages_botResults; @@ -8744,64 +8738,32 @@ typedef MTPBoxed MTPInputBotInlineMessage; class MTPinputBotInlineResult : private mtpDataOwner { public: - MTPinputBotInlineResult() : mtpDataOwner(0), _type(0) { - } - MTPinputBotInlineResult(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) : mtpDataOwner(0), _type(0) { + MTPinputBotInlineResult(); + MTPinputBotInlineResult(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_inputBotInlineResult) : mtpDataOwner(0) { read(from, end, cons); } MTPDinputBotInlineResult &_inputBotInlineResult() { if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResult) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResult); split(); return *(MTPDinputBotInlineResult*)data; } const MTPDinputBotInlineResult &c_inputBotInlineResult() const { if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResult) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResult); return *(const MTPDinputBotInlineResult*)data; } - MTPDinputBotInlineResultPhoto &_inputBotInlineResultPhoto() { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResultPhoto) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResultPhoto); - split(); - return *(MTPDinputBotInlineResultPhoto*)data; - } - const MTPDinputBotInlineResultPhoto &c_inputBotInlineResultPhoto() const { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResultPhoto) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResultPhoto); - return *(const MTPDinputBotInlineResultPhoto*)data; - } - - MTPDinputBotInlineResultDocument &_inputBotInlineResultDocument() { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResultDocument) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResultDocument); - split(); - return *(MTPDinputBotInlineResultDocument*)data; - } - const MTPDinputBotInlineResultDocument &c_inputBotInlineResultDocument() const { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_inputBotInlineResultDocument) throw mtpErrorWrongTypeId(_type, mtpc_inputBotInlineResultDocument); - return *(const MTPDinputBotInlineResultDocument*)data; - } - uint32 innerLength() const; mtpTypeId type() const; - void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons); + void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons = mtpc_inputBotInlineResult); void write(mtpBuffer &to) const; typedef void ResponseType; private: - explicit MTPinputBotInlineResult(mtpTypeId type); explicit MTPinputBotInlineResult(MTPDinputBotInlineResult *_data); - explicit MTPinputBotInlineResult(MTPDinputBotInlineResultPhoto *_data); - explicit MTPinputBotInlineResult(MTPDinputBotInlineResultDocument *_data); friend class MTP::internal::TypeCreator; - - mtpTypeId _type; }; typedef MTPBoxed MTPInputBotInlineResult; @@ -8902,30 +8864,6 @@ public: read(from, end, cons); } - MTPDbotInlineMediaResultDocument &_botInlineMediaResultDocument() { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_botInlineMediaResultDocument) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResultDocument); - split(); - return *(MTPDbotInlineMediaResultDocument*)data; - } - const MTPDbotInlineMediaResultDocument &c_botInlineMediaResultDocument() const { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_botInlineMediaResultDocument) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResultDocument); - return *(const MTPDbotInlineMediaResultDocument*)data; - } - - MTPDbotInlineMediaResultPhoto &_botInlineMediaResultPhoto() { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_botInlineMediaResultPhoto) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResultPhoto); - split(); - return *(MTPDbotInlineMediaResultPhoto*)data; - } - const MTPDbotInlineMediaResultPhoto &c_botInlineMediaResultPhoto() const { - if (!data) throw mtpErrorUninitialized(); - if (_type != mtpc_botInlineMediaResultPhoto) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResultPhoto); - return *(const MTPDbotInlineMediaResultPhoto*)data; - } - MTPDbotInlineResult &_botInlineResult() { if (!data) throw mtpErrorUninitialized(); if (_type != mtpc_botInlineResult) throw mtpErrorWrongTypeId(_type, mtpc_botInlineResult); @@ -8938,6 +8876,18 @@ public: return *(const MTPDbotInlineResult*)data; } + MTPDbotInlineMediaResult &_botInlineMediaResult() { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_botInlineMediaResult) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResult); + split(); + return *(MTPDbotInlineMediaResult*)data; + } + const MTPDbotInlineMediaResult &c_botInlineMediaResult() const { + if (!data) throw mtpErrorUninitialized(); + if (_type != mtpc_botInlineMediaResult) throw mtpErrorWrongTypeId(_type, mtpc_botInlineMediaResult); + return *(const MTPDbotInlineMediaResult*)data; + } + uint32 innerLength() const; mtpTypeId type() const; void read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons); @@ -8947,9 +8897,8 @@ public: private: explicit MTPbotInlineResult(mtpTypeId type); - explicit MTPbotInlineResult(MTPDbotInlineMediaResultDocument *_data); - explicit MTPbotInlineResult(MTPDbotInlineMediaResultPhoto *_data); explicit MTPbotInlineResult(MTPDbotInlineResult *_data); + explicit MTPbotInlineResult(MTPDbotInlineMediaResult *_data); friend class MTP::internal::TypeCreator; @@ -13496,56 +13445,6 @@ public: MTPInputBotInlineMessage vsend_message; }; -class MTPDinputBotInlineResultPhoto : public mtpDataImpl { -public: - enum class Flag : int32 { - MAX_FIELD = (1 << 0), - }; - Q_DECLARE_FLAGS(Flags, Flag); - friend inline Flags operator~(Flag v) { return QFlag(~static_cast(v)); } - - MTPDinputBotInlineResultPhoto() { - } - MTPDinputBotInlineResultPhoto(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPInputPhoto &_photo, const MTPInputBotInlineMessage &_send_message) : vflags(_flags), vid(_id), vtype(_type), vphoto(_photo), vsend_message(_send_message) { - } - - MTPflags vflags; - MTPstring vid; - MTPstring vtype; - MTPInputPhoto vphoto; - MTPInputBotInlineMessage vsend_message; -}; - -class MTPDinputBotInlineResultDocument : public mtpDataImpl { -public: - enum class Flag : int32 { - f_title = (1 << 1), - f_description = (1 << 2), - f_document = (1 << 5), - - MAX_FIELD = (1 << 5), - }; - Q_DECLARE_FLAGS(Flags, Flag); - friend inline Flags operator~(Flag v) { return QFlag(~static_cast(v)); } - - bool has_title() const { return vflags.v & Flag::f_title; } - bool has_description() const { return vflags.v & Flag::f_description; } - bool has_document() const { return vflags.v & Flag::f_document; } - - MTPDinputBotInlineResultDocument() { - } - MTPDinputBotInlineResultDocument(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPInputDocument &_document, const MTPInputBotInlineMessage &_send_message) : vflags(_flags), vid(_id), vtype(_type), vtitle(_title), vdescription(_description), vdocument(_document), vsend_message(_send_message) { - } - - MTPflags vflags; - MTPstring vid; - MTPstring vtype; - MTPstring vtitle; - MTPstring vdescription; - MTPInputDocument vdocument; - MTPInputBotInlineMessage vsend_message; -}; - class MTPDbotInlineMessageMediaAuto : public mtpDataImpl { public: MTPDbotInlineMessageMediaAuto() { @@ -13616,32 +13515,6 @@ public: MTPstring vlast_name; }; -class MTPDbotInlineMediaResultDocument : public mtpDataImpl { -public: - MTPDbotInlineMediaResultDocument() { - } - MTPDbotInlineMediaResultDocument(const MTPstring &_id, const MTPstring &_type, const MTPDocument &_document, const MTPBotInlineMessage &_send_message) : vid(_id), vtype(_type), vdocument(_document), vsend_message(_send_message) { - } - - MTPstring vid; - MTPstring vtype; - MTPDocument vdocument; - MTPBotInlineMessage vsend_message; -}; - -class MTPDbotInlineMediaResultPhoto : public mtpDataImpl { -public: - MTPDbotInlineMediaResultPhoto() { - } - MTPDbotInlineMediaResultPhoto(const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPBotInlineMessage &_send_message) : vid(_id), vtype(_type), vphoto(_photo), vsend_message(_send_message) { - } - - MTPstring vid; - MTPstring vtype; - MTPPhoto vphoto; - MTPBotInlineMessage vsend_message; -}; - class MTPDbotInlineResult : public mtpDataImpl { public: enum class Flag : int32 { @@ -13690,6 +13563,39 @@ public: MTPBotInlineMessage vsend_message; }; +class MTPDbotInlineMediaResult : public mtpDataImpl { +public: + enum class Flag : int32 { + f_photo = (1 << 0), + f_document = (1 << 1), + f_title = (1 << 2), + f_description = (1 << 3), + + MAX_FIELD = (1 << 3), + }; + Q_DECLARE_FLAGS(Flags, Flag); + friend inline Flags operator~(Flag v) { return QFlag(~static_cast(v)); } + + bool has_photo() const { return vflags.v & Flag::f_photo; } + bool has_document() const { return vflags.v & Flag::f_document; } + bool has_title() const { return vflags.v & Flag::f_title; } + bool has_description() const { return vflags.v & Flag::f_description; } + + MTPDbotInlineMediaResult() { + } + MTPDbotInlineMediaResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPDocument &_document, const MTPstring &_title, const MTPstring &_description, const MTPBotInlineMessage &_send_message) : vflags(_flags), vid(_id), vtype(_type), vphoto(_photo), vdocument(_document), vtitle(_title), vdescription(_description), vsend_message(_send_message) { + } + + MTPflags vflags; + MTPstring vid; + MTPstring vtype; + MTPPhoto vphoto; + MTPDocument vdocument; + MTPstring vtitle; + MTPstring vdescription; + MTPBotInlineMessage vsend_message; +}; + class MTPDmessages_botResults : public mtpDataImpl { public: enum class Flag : int32 { @@ -22769,12 +22675,6 @@ public: inline static MTPinputBotInlineResult new_inputBotInlineResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPstring &_url, const MTPstring &_thumb_url, const MTPstring &_content_url, const MTPstring &_content_type, MTPint _w, MTPint _h, MTPint _duration, const MTPInputBotInlineMessage &_send_message) { return MTPinputBotInlineResult(new MTPDinputBotInlineResult(_flags, _id, _type, _title, _description, _url, _thumb_url, _content_url, _content_type, _w, _h, _duration, _send_message)); } - inline static MTPinputBotInlineResult new_inputBotInlineResultPhoto(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPInputPhoto &_photo, const MTPInputBotInlineMessage &_send_message) { - return MTPinputBotInlineResult(new MTPDinputBotInlineResultPhoto(_flags, _id, _type, _photo, _send_message)); - } - inline static MTPinputBotInlineResult new_inputBotInlineResultDocument(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPInputDocument &_document, const MTPInputBotInlineMessage &_send_message) { - return MTPinputBotInlineResult(new MTPDinputBotInlineResultDocument(_flags, _id, _type, _title, _description, _document, _send_message)); - } inline static MTPbotInlineMessage new_botInlineMessageMediaAuto(const MTPstring &_caption) { return MTPbotInlineMessage(new MTPDbotInlineMessageMediaAuto(_caption)); } @@ -22790,15 +22690,12 @@ public: inline static MTPbotInlineMessage new_botInlineMessageMediaContact(const MTPstring &_phone_number, const MTPstring &_first_name, const MTPstring &_last_name) { return MTPbotInlineMessage(new MTPDbotInlineMessageMediaContact(_phone_number, _first_name, _last_name)); } - inline static MTPbotInlineResult new_botInlineMediaResultDocument(const MTPstring &_id, const MTPstring &_type, const MTPDocument &_document, const MTPBotInlineMessage &_send_message) { - return MTPbotInlineResult(new MTPDbotInlineMediaResultDocument(_id, _type, _document, _send_message)); - } - inline static MTPbotInlineResult new_botInlineMediaResultPhoto(const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPBotInlineMessage &_send_message) { - return MTPbotInlineResult(new MTPDbotInlineMediaResultPhoto(_id, _type, _photo, _send_message)); - } inline static MTPbotInlineResult new_botInlineResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPstring &_url, const MTPstring &_thumb_url, const MTPstring &_content_url, const MTPstring &_content_type, MTPint _w, MTPint _h, MTPint _duration, const MTPBotInlineMessage &_send_message) { return MTPbotInlineResult(new MTPDbotInlineResult(_flags, _id, _type, _title, _description, _url, _thumb_url, _content_url, _content_type, _w, _h, _duration, _send_message)); } + inline static MTPbotInlineResult new_botInlineMediaResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPDocument &_document, const MTPstring &_title, const MTPstring &_description, const MTPBotInlineMessage &_send_message) { + return MTPbotInlineResult(new MTPDbotInlineMediaResult(_flags, _id, _type, _photo, _document, _title, _description, _send_message)); + } inline static MTPmessages_botResults new_messages_botResults(const MTPflags &_flags, const MTPlong &_query_id, const MTPstring &_next_offset, const MTPVector &_results) { return MTPmessages_botResults(new MTPDmessages_botResults(_flags, _query_id, _next_offset, _results)); } @@ -33077,133 +32974,57 @@ inline MTPinputBotInlineMessage MTP_inputBotInlineMessageMediaContact(const MTPs return MTP::internal::TypeCreator::new_inputBotInlineMessageMediaContact(_phone_number, _first_name, _last_name); } +inline MTPinputBotInlineResult::MTPinputBotInlineResult() : mtpDataOwner(new MTPDinputBotInlineResult()) { +} + inline uint32 MTPinputBotInlineResult::innerLength() const { - switch (_type) { - case mtpc_inputBotInlineResult: { - const MTPDinputBotInlineResult &v(c_inputBotInlineResult()); - return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + (v.has_title() ? v.vtitle.innerLength() : 0) + (v.has_description() ? v.vdescription.innerLength() : 0) + (v.has_url() ? v.vurl.innerLength() : 0) + (v.has_thumb_url() ? v.vthumb_url.innerLength() : 0) + (v.has_content_url() ? v.vcontent_url.innerLength() : 0) + (v.has_content_type() ? v.vcontent_type.innerLength() : 0) + (v.has_w() ? v.vw.innerLength() : 0) + (v.has_h() ? v.vh.innerLength() : 0) + (v.has_duration() ? v.vduration.innerLength() : 0) + v.vsend_message.innerLength(); - } - case mtpc_inputBotInlineResultPhoto: { - const MTPDinputBotInlineResultPhoto &v(c_inputBotInlineResultPhoto()); - return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + v.vphoto.innerLength() + v.vsend_message.innerLength(); - } - case mtpc_inputBotInlineResultDocument: { - const MTPDinputBotInlineResultDocument &v(c_inputBotInlineResultDocument()); - return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + (v.has_title() ? v.vtitle.innerLength() : 0) + (v.has_description() ? v.vdescription.innerLength() : 0) + (v.has_document() ? v.vdocument.innerLength() : 0) + v.vsend_message.innerLength(); - } - } - return 0; + const MTPDinputBotInlineResult &v(c_inputBotInlineResult()); + return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + (v.has_title() ? v.vtitle.innerLength() : 0) + (v.has_description() ? v.vdescription.innerLength() : 0) + (v.has_url() ? v.vurl.innerLength() : 0) + (v.has_thumb_url() ? v.vthumb_url.innerLength() : 0) + (v.has_content_url() ? v.vcontent_url.innerLength() : 0) + (v.has_content_type() ? v.vcontent_type.innerLength() : 0) + (v.has_w() ? v.vw.innerLength() : 0) + (v.has_h() ? v.vh.innerLength() : 0) + (v.has_duration() ? v.vduration.innerLength() : 0) + v.vsend_message.innerLength(); } inline mtpTypeId MTPinputBotInlineResult::type() const { - if (!_type) throw mtpErrorUninitialized(); - return _type; + return mtpc_inputBotInlineResult; } inline void MTPinputBotInlineResult::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { - if (cons != _type) setData(0); - switch (cons) { - case mtpc_inputBotInlineResult: _type = cons; { - if (!data) setData(new MTPDinputBotInlineResult()); - MTPDinputBotInlineResult &v(_inputBotInlineResult()); - v.vflags.read(from, end); - v.vid.read(from, end); - v.vtype.read(from, end); - if (v.has_title()) { v.vtitle.read(from, end); } else { v.vtitle = MTPstring(); } - if (v.has_description()) { v.vdescription.read(from, end); } else { v.vdescription = MTPstring(); } - if (v.has_url()) { v.vurl.read(from, end); } else { v.vurl = MTPstring(); } - if (v.has_thumb_url()) { v.vthumb_url.read(from, end); } else { v.vthumb_url = MTPstring(); } - if (v.has_content_url()) { v.vcontent_url.read(from, end); } else { v.vcontent_url = MTPstring(); } - if (v.has_content_type()) { v.vcontent_type.read(from, end); } else { v.vcontent_type = MTPstring(); } - if (v.has_w()) { v.vw.read(from, end); } else { v.vw = MTPint(); } - if (v.has_h()) { v.vh.read(from, end); } else { v.vh = MTPint(); } - if (v.has_duration()) { v.vduration.read(from, end); } else { v.vduration = MTPint(); } - v.vsend_message.read(from, end); - } break; - case mtpc_inputBotInlineResultPhoto: _type = cons; { - if (!data) setData(new MTPDinputBotInlineResultPhoto()); - MTPDinputBotInlineResultPhoto &v(_inputBotInlineResultPhoto()); - v.vflags.read(from, end); - v.vid.read(from, end); - v.vtype.read(from, end); - v.vphoto.read(from, end); - v.vsend_message.read(from, end); - } break; - case mtpc_inputBotInlineResultDocument: _type = cons; { - if (!data) setData(new MTPDinputBotInlineResultDocument()); - MTPDinputBotInlineResultDocument &v(_inputBotInlineResultDocument()); - v.vflags.read(from, end); - v.vid.read(from, end); - v.vtype.read(from, end); - if (v.has_title()) { v.vtitle.read(from, end); } else { v.vtitle = MTPstring(); } - if (v.has_description()) { v.vdescription.read(from, end); } else { v.vdescription = MTPstring(); } - if (v.has_document()) { v.vdocument.read(from, end); } else { v.vdocument = MTPInputDocument(); } - v.vsend_message.read(from, end); - } break; - default: throw mtpErrorUnexpected(cons, "MTPinputBotInlineResult"); - } + if (cons != mtpc_inputBotInlineResult) throw mtpErrorUnexpected(cons, "MTPinputBotInlineResult"); + + if (!data) setData(new MTPDinputBotInlineResult()); + MTPDinputBotInlineResult &v(_inputBotInlineResult()); + v.vflags.read(from, end); + v.vid.read(from, end); + v.vtype.read(from, end); + if (v.has_title()) { v.vtitle.read(from, end); } else { v.vtitle = MTPstring(); } + if (v.has_description()) { v.vdescription.read(from, end); } else { v.vdescription = MTPstring(); } + if (v.has_url()) { v.vurl.read(from, end); } else { v.vurl = MTPstring(); } + if (v.has_thumb_url()) { v.vthumb_url.read(from, end); } else { v.vthumb_url = MTPstring(); } + if (v.has_content_url()) { v.vcontent_url.read(from, end); } else { v.vcontent_url = MTPstring(); } + if (v.has_content_type()) { v.vcontent_type.read(from, end); } else { v.vcontent_type = MTPstring(); } + if (v.has_w()) { v.vw.read(from, end); } else { v.vw = MTPint(); } + if (v.has_h()) { v.vh.read(from, end); } else { v.vh = MTPint(); } + if (v.has_duration()) { v.vduration.read(from, end); } else { v.vduration = MTPint(); } + v.vsend_message.read(from, end); } inline void MTPinputBotInlineResult::write(mtpBuffer &to) const { - switch (_type) { - case mtpc_inputBotInlineResult: { - const MTPDinputBotInlineResult &v(c_inputBotInlineResult()); - v.vflags.write(to); - v.vid.write(to); - v.vtype.write(to); - if (v.has_title()) v.vtitle.write(to); - if (v.has_description()) v.vdescription.write(to); - if (v.has_url()) v.vurl.write(to); - if (v.has_thumb_url()) v.vthumb_url.write(to); - if (v.has_content_url()) v.vcontent_url.write(to); - if (v.has_content_type()) v.vcontent_type.write(to); - if (v.has_w()) v.vw.write(to); - if (v.has_h()) v.vh.write(to); - if (v.has_duration()) v.vduration.write(to); - v.vsend_message.write(to); - } break; - case mtpc_inputBotInlineResultPhoto: { - const MTPDinputBotInlineResultPhoto &v(c_inputBotInlineResultPhoto()); - v.vflags.write(to); - v.vid.write(to); - v.vtype.write(to); - v.vphoto.write(to); - v.vsend_message.write(to); - } break; - case mtpc_inputBotInlineResultDocument: { - const MTPDinputBotInlineResultDocument &v(c_inputBotInlineResultDocument()); - v.vflags.write(to); - v.vid.write(to); - v.vtype.write(to); - if (v.has_title()) v.vtitle.write(to); - if (v.has_description()) v.vdescription.write(to); - if (v.has_document()) v.vdocument.write(to); - v.vsend_message.write(to); - } break; - } + const MTPDinputBotInlineResult &v(c_inputBotInlineResult()); + v.vflags.write(to); + v.vid.write(to); + v.vtype.write(to); + if (v.has_title()) v.vtitle.write(to); + if (v.has_description()) v.vdescription.write(to); + if (v.has_url()) v.vurl.write(to); + if (v.has_thumb_url()) v.vthumb_url.write(to); + if (v.has_content_url()) v.vcontent_url.write(to); + if (v.has_content_type()) v.vcontent_type.write(to); + if (v.has_w()) v.vw.write(to); + if (v.has_h()) v.vh.write(to); + if (v.has_duration()) v.vduration.write(to); + v.vsend_message.write(to); } -inline MTPinputBotInlineResult::MTPinputBotInlineResult(mtpTypeId type) : mtpDataOwner(0), _type(type) { - switch (type) { - case mtpc_inputBotInlineResult: setData(new MTPDinputBotInlineResult()); break; - case mtpc_inputBotInlineResultPhoto: setData(new MTPDinputBotInlineResultPhoto()); break; - case mtpc_inputBotInlineResultDocument: setData(new MTPDinputBotInlineResultDocument()); break; - default: throw mtpErrorBadTypeId(type, "MTPinputBotInlineResult"); - } -} -inline MTPinputBotInlineResult::MTPinputBotInlineResult(MTPDinputBotInlineResult *_data) : mtpDataOwner(_data), _type(mtpc_inputBotInlineResult) { -} -inline MTPinputBotInlineResult::MTPinputBotInlineResult(MTPDinputBotInlineResultPhoto *_data) : mtpDataOwner(_data), _type(mtpc_inputBotInlineResultPhoto) { -} -inline MTPinputBotInlineResult::MTPinputBotInlineResult(MTPDinputBotInlineResultDocument *_data) : mtpDataOwner(_data), _type(mtpc_inputBotInlineResultDocument) { +inline MTPinputBotInlineResult::MTPinputBotInlineResult(MTPDinputBotInlineResult *_data) : mtpDataOwner(_data) { } Q_DECLARE_OPERATORS_FOR_FLAGS(MTPDinputBotInlineResult::Flags) inline MTPinputBotInlineResult MTP_inputBotInlineResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPstring &_url, const MTPstring &_thumb_url, const MTPstring &_content_url, const MTPstring &_content_type, MTPint _w, MTPint _h, MTPint _duration, const MTPInputBotInlineMessage &_send_message) { return MTP::internal::TypeCreator::new_inputBotInlineResult(_flags, _id, _type, _title, _description, _url, _thumb_url, _content_url, _content_type, _w, _h, _duration, _send_message); } -inline MTPinputBotInlineResult MTP_inputBotInlineResultPhoto(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPInputPhoto &_photo, const MTPInputBotInlineMessage &_send_message) { - return MTP::internal::TypeCreator::new_inputBotInlineResultPhoto(_flags, _id, _type, _photo, _send_message); -} -Q_DECLARE_OPERATORS_FOR_FLAGS(MTPDinputBotInlineResultDocument::Flags) -inline MTPinputBotInlineResult MTP_inputBotInlineResultDocument(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPInputDocument &_document, const MTPInputBotInlineMessage &_send_message) { - return MTP::internal::TypeCreator::new_inputBotInlineResultDocument(_flags, _id, _type, _title, _description, _document, _send_message); -} inline uint32 MTPbotInlineMessage::innerLength() const { switch (_type) { @@ -33344,18 +33165,14 @@ inline MTPbotInlineMessage MTP_botInlineMessageMediaContact(const MTPstring &_ph inline uint32 MTPbotInlineResult::innerLength() const { switch (_type) { - case mtpc_botInlineMediaResultDocument: { - const MTPDbotInlineMediaResultDocument &v(c_botInlineMediaResultDocument()); - return v.vid.innerLength() + v.vtype.innerLength() + v.vdocument.innerLength() + v.vsend_message.innerLength(); - } - case mtpc_botInlineMediaResultPhoto: { - const MTPDbotInlineMediaResultPhoto &v(c_botInlineMediaResultPhoto()); - return v.vid.innerLength() + v.vtype.innerLength() + v.vphoto.innerLength() + v.vsend_message.innerLength(); - } case mtpc_botInlineResult: { const MTPDbotInlineResult &v(c_botInlineResult()); return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + (v.has_title() ? v.vtitle.innerLength() : 0) + (v.has_description() ? v.vdescription.innerLength() : 0) + (v.has_url() ? v.vurl.innerLength() : 0) + (v.has_thumb_url() ? v.vthumb_url.innerLength() : 0) + (v.has_content_url() ? v.vcontent_url.innerLength() : 0) + (v.has_content_type() ? v.vcontent_type.innerLength() : 0) + (v.has_w() ? v.vw.innerLength() : 0) + (v.has_h() ? v.vh.innerLength() : 0) + (v.has_duration() ? v.vduration.innerLength() : 0) + v.vsend_message.innerLength(); } + case mtpc_botInlineMediaResult: { + const MTPDbotInlineMediaResult &v(c_botInlineMediaResult()); + return v.vflags.innerLength() + v.vid.innerLength() + v.vtype.innerLength() + (v.has_photo() ? v.vphoto.innerLength() : 0) + (v.has_document() ? v.vdocument.innerLength() : 0) + (v.has_title() ? v.vtitle.innerLength() : 0) + (v.has_description() ? v.vdescription.innerLength() : 0) + v.vsend_message.innerLength(); + } } return 0; } @@ -33366,22 +33183,6 @@ inline mtpTypeId MTPbotInlineResult::type() const { inline void MTPbotInlineResult::read(const mtpPrime *&from, const mtpPrime *end, mtpTypeId cons) { if (cons != _type) setData(0); switch (cons) { - case mtpc_botInlineMediaResultDocument: _type = cons; { - if (!data) setData(new MTPDbotInlineMediaResultDocument()); - MTPDbotInlineMediaResultDocument &v(_botInlineMediaResultDocument()); - v.vid.read(from, end); - v.vtype.read(from, end); - v.vdocument.read(from, end); - v.vsend_message.read(from, end); - } break; - case mtpc_botInlineMediaResultPhoto: _type = cons; { - if (!data) setData(new MTPDbotInlineMediaResultPhoto()); - MTPDbotInlineMediaResultPhoto &v(_botInlineMediaResultPhoto()); - v.vid.read(from, end); - v.vtype.read(from, end); - v.vphoto.read(from, end); - v.vsend_message.read(from, end); - } break; case mtpc_botInlineResult: _type = cons; { if (!data) setData(new MTPDbotInlineResult()); MTPDbotInlineResult &v(_botInlineResult()); @@ -33399,25 +33200,23 @@ inline void MTPbotInlineResult::read(const mtpPrime *&from, const mtpPrime *end, if (v.has_duration()) { v.vduration.read(from, end); } else { v.vduration = MTPint(); } v.vsend_message.read(from, end); } break; + case mtpc_botInlineMediaResult: _type = cons; { + if (!data) setData(new MTPDbotInlineMediaResult()); + MTPDbotInlineMediaResult &v(_botInlineMediaResult()); + v.vflags.read(from, end); + v.vid.read(from, end); + v.vtype.read(from, end); + if (v.has_photo()) { v.vphoto.read(from, end); } else { v.vphoto = MTPPhoto(); } + if (v.has_document()) { v.vdocument.read(from, end); } else { v.vdocument = MTPDocument(); } + if (v.has_title()) { v.vtitle.read(from, end); } else { v.vtitle = MTPstring(); } + if (v.has_description()) { v.vdescription.read(from, end); } else { v.vdescription = MTPstring(); } + v.vsend_message.read(from, end); + } break; default: throw mtpErrorUnexpected(cons, "MTPbotInlineResult"); } } inline void MTPbotInlineResult::write(mtpBuffer &to) const { switch (_type) { - case mtpc_botInlineMediaResultDocument: { - const MTPDbotInlineMediaResultDocument &v(c_botInlineMediaResultDocument()); - v.vid.write(to); - v.vtype.write(to); - v.vdocument.write(to); - v.vsend_message.write(to); - } break; - case mtpc_botInlineMediaResultPhoto: { - const MTPDbotInlineMediaResultPhoto &v(c_botInlineMediaResultPhoto()); - v.vid.write(to); - v.vtype.write(to); - v.vphoto.write(to); - v.vsend_message.write(to); - } break; case mtpc_botInlineResult: { const MTPDbotInlineResult &v(c_botInlineResult()); v.vflags.write(to); @@ -33434,32 +33233,38 @@ inline void MTPbotInlineResult::write(mtpBuffer &to) const { if (v.has_duration()) v.vduration.write(to); v.vsend_message.write(to); } break; + case mtpc_botInlineMediaResult: { + const MTPDbotInlineMediaResult &v(c_botInlineMediaResult()); + v.vflags.write(to); + v.vid.write(to); + v.vtype.write(to); + if (v.has_photo()) v.vphoto.write(to); + if (v.has_document()) v.vdocument.write(to); + if (v.has_title()) v.vtitle.write(to); + if (v.has_description()) v.vdescription.write(to); + v.vsend_message.write(to); + } break; } } inline MTPbotInlineResult::MTPbotInlineResult(mtpTypeId type) : mtpDataOwner(0), _type(type) { switch (type) { - case mtpc_botInlineMediaResultDocument: setData(new MTPDbotInlineMediaResultDocument()); break; - case mtpc_botInlineMediaResultPhoto: setData(new MTPDbotInlineMediaResultPhoto()); break; case mtpc_botInlineResult: setData(new MTPDbotInlineResult()); break; + case mtpc_botInlineMediaResult: setData(new MTPDbotInlineMediaResult()); break; default: throw mtpErrorBadTypeId(type, "MTPbotInlineResult"); } } -inline MTPbotInlineResult::MTPbotInlineResult(MTPDbotInlineMediaResultDocument *_data) : mtpDataOwner(_data), _type(mtpc_botInlineMediaResultDocument) { -} -inline MTPbotInlineResult::MTPbotInlineResult(MTPDbotInlineMediaResultPhoto *_data) : mtpDataOwner(_data), _type(mtpc_botInlineMediaResultPhoto) { -} inline MTPbotInlineResult::MTPbotInlineResult(MTPDbotInlineResult *_data) : mtpDataOwner(_data), _type(mtpc_botInlineResult) { } -inline MTPbotInlineResult MTP_botInlineMediaResultDocument(const MTPstring &_id, const MTPstring &_type, const MTPDocument &_document, const MTPBotInlineMessage &_send_message) { - return MTP::internal::TypeCreator::new_botInlineMediaResultDocument(_id, _type, _document, _send_message); -} -inline MTPbotInlineResult MTP_botInlineMediaResultPhoto(const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPBotInlineMessage &_send_message) { - return MTP::internal::TypeCreator::new_botInlineMediaResultPhoto(_id, _type, _photo, _send_message); +inline MTPbotInlineResult::MTPbotInlineResult(MTPDbotInlineMediaResult *_data) : mtpDataOwner(_data), _type(mtpc_botInlineMediaResult) { } Q_DECLARE_OPERATORS_FOR_FLAGS(MTPDbotInlineResult::Flags) inline MTPbotInlineResult MTP_botInlineResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPstring &_title, const MTPstring &_description, const MTPstring &_url, const MTPstring &_thumb_url, const MTPstring &_content_url, const MTPstring &_content_type, MTPint _w, MTPint _h, MTPint _duration, const MTPBotInlineMessage &_send_message) { return MTP::internal::TypeCreator::new_botInlineResult(_flags, _id, _type, _title, _description, _url, _thumb_url, _content_url, _content_type, _w, _h, _duration, _send_message); } +Q_DECLARE_OPERATORS_FOR_FLAGS(MTPDbotInlineMediaResult::Flags) +inline MTPbotInlineResult MTP_botInlineMediaResult(const MTPflags &_flags, const MTPstring &_id, const MTPstring &_type, const MTPPhoto &_photo, const MTPDocument &_document, const MTPstring &_title, const MTPstring &_description, const MTPBotInlineMessage &_send_message) { + return MTP::internal::TypeCreator::new_botInlineMediaResult(_flags, _id, _type, _photo, _document, _title, _description, _send_message); +} inline MTPmessages_botResults::MTPmessages_botResults() : mtpDataOwner(new MTPDmessages_botResults()) { } diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp index 8e7b0321b..ad62dd631 100644 --- a/Telegram/SourceFiles/settings.cpp +++ b/Telegram/SourceFiles/settings.cpp @@ -78,8 +78,6 @@ bool gAskDownloadPath = false; QString gDownloadPath; QByteArray gDownloadPathBookmark; -bool gNeedConfigResave = false; - bool gCtrlEnter = false; QPixmapPointer gChatBackground = 0; diff --git a/Telegram/SourceFiles/settings.h b/Telegram/SourceFiles/settings.h index 18b069258..bf6a9739f 100644 --- a/Telegram/SourceFiles/settings.h +++ b/Telegram/SourceFiles/settings.h @@ -99,7 +99,6 @@ DeclareSetting(bool, TileBackground); DeclareSetting(bool, SoundNotify); DeclareSetting(bool, IncludeMuted); -DeclareSetting(bool, NeedConfigResave); DeclareSetting(bool, DesktopNotify); DeclareSetting(DBINotifyView, NotifyView); DeclareSetting(bool, AutoUpdate); diff --git a/Telegram/SourceFiles/structs.cpp b/Telegram/SourceFiles/structs.cpp index a60fce862..5acee84be 100644 --- a/Telegram/SourceFiles/structs.cpp +++ b/Telegram/SourceFiles/structs.cpp @@ -1442,8 +1442,100 @@ WebPageData::WebPageData(const WebPageId &id, WebPageType type, const QString &u , pendingTill(pendingTill) { } +InlineResultSendData::SentMTPMessageFields InlineResultSendText::getSentMessageFields(InlineResult*) const { + SentMTPMessageFields result; + result.text = MTP_string(_message); + result.entities = linksToMTP(_entities); + return result; +} + +InlineResultSendData::SentMTPMessageFields InlineResultSendGeo::getSentMessageFields(InlineResult*) const { + SentMTPMessageFields result; + result.media = MTP_messageMediaGeo(MTP_geoPoint(MTP_double(_location.lon), MTP_double(_location.lat))); + return result; +} + +InlineResultSendData::SentMTPMessageFields InlineResultSendVenue::getSentMessageFields(InlineResult*) const { + SentMTPMessageFields result; + result.media = MTP_messageMediaVenue(MTP_geoPoint(MTP_double(_location.lon), MTP_double(_location.lat)), MTP_string(_title), MTP_string(_address), MTP_string(_provider), MTP_string(_venueId)); + return result; +} + +InlineResultSendData::SentMTPMessageFields InlineResultSendContact::getSentMessageFields(InlineResult*) const { + SentMTPMessageFields result; + result.media = MTP_messageMediaContact(MTP_string(_phoneNumber), MTP_string(_firstName), MTP_string(_lastName), MTP_int(0)); + return result; +} + +InlineResultSendData::SentMTPMessageFields InlineResultSendPhoto::getSentMessageFields(InlineResult *owner) const { + SentMTPMessageFields result; + + QImage fileThumb(owner->thumb->pix().toImage()); + + QVector photoSizes; + + QPixmap thumb = (fileThumb.width() > 100 || fileThumb.height() > 100) ? QPixmap::fromImage(fileThumb.scaled(100, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::ColorOnly) : QPixmap::fromImage(fileThumb); + ImagePtr thumbPtr = ImagePtr(thumb, "JPG"); + photoSizes.push_back(MTP_photoSize(MTP_string("s"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(thumb.width()), MTP_int(thumb.height()), MTP_int(0))); + + QSize medium = resizeKeepAspect(owner->width, owner->height, 320, 320); + photoSizes.push_back(MTP_photoSize(MTP_string("m"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(medium.width()), MTP_int(medium.height()), MTP_int(0))); + + photoSizes.push_back(MTP_photoSize(MTP_string("x"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(owner->width), MTP_int(owner->height), MTP_int(0))); + + uint64 photoId = rand_value(); + PhotoData *ph = App::photoSet(photoId, 0, 0, unixtime(), thumbPtr, ImagePtr(medium.width(), medium.height()), ImagePtr(owner->width, owner->height)); + MTPPhoto photo = MTP_photo(MTP_long(photoId), MTP_long(0), MTP_int(ph->date), MTP_vector(photoSizes)); + + result.media = MTP_messageMediaPhoto(photo, MTP_string(_caption)); + + return result; +} + +InlineResultSendData::SentMTPMessageFields InlineResultSendFile::getSentMessageFields(InlineResult *owner) const { + SentMTPMessageFields result; + + MTPPhotoSize thumbSize; + QPixmap thumb; + int32 tw = owner->thumb->width(), th = owner->thumb->height(); + if (tw > 0 && th > 0 && tw < 20 * th && th < 20 * tw && owner->thumb->loaded()) { + if (tw > th) { + if (tw > 90) { + th = th * 90 / tw; + tw = 90; + } + } else if (th > 90) { + tw = tw * 90 / th; + th = 90; + } + thumbSize = MTP_photoSize(MTP_string(""), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(tw), MTP_int(th), MTP_int(0)); + thumb = owner->thumb->pixNoCache(tw, th, ImagePixSmooth); + } else { + tw = th = 0; + thumbSize = MTP_photoSizeEmpty(MTP_string("")); + } + uint64 docId = rand_value(); + QVector attributes; + + using Type = InlineResult::Type; + if (owner->type == Type::Gif) { + attributes.push_back(MTP_documentAttributeFilename(MTP_string((owner->content_type == qstr("video/mp4") ? "animation.gif.mp4" : "animation.gif")))); + attributes.push_back(MTP_documentAttributeAnimated()); + attributes.push_back(MTP_documentAttributeVideo(MTP_int(owner->duration), MTP_int(owner->width), MTP_int(owner->height))); + } + MTPDocument document = MTP_document(MTP_long(docId), MTP_long(0), MTP_int(unixtime()), MTP_string(owner->content_type), MTP_int(owner->data().size()), thumbSize, MTP_int(MTP::maindc()), MTP_vector(attributes)); + if (tw > 0 && th > 0) { + App::feedDocument(document, thumb); + } + Local::writeStickerImage(mediaKey(DocumentFileLocation, MTP::maindc(), docId), owner->data()); + + result.media = MTP_messageMediaDocument(document, MTP_string(_caption)); + + return result; +} + void InlineResult::automaticLoadGif() { - if (loaded() || type != qstr("gif") || (content_type != qstr("video/mp4") && content_type != "image/gif")) return; + if (loaded() || type != Type::Gif || (content_type != qstr("video/mp4") && content_type != "image/gif")) return; if (_loader != CancelledWebFileLoader) { // if load at least anywhere diff --git a/Telegram/SourceFiles/structs.h b/Telegram/SourceFiles/structs.h index 48d4f5f51..0dadc52e2 100644 --- a/Telegram/SourceFiles/structs.h +++ b/Telegram/SourceFiles/structs.h @@ -1026,13 +1026,13 @@ public: ImagePtr makeReplyPreview(); StickerData *sticker() { - return (type == StickerDocument) ? static_cast(_additional) : 0; + return (type == StickerDocument) ? static_cast(_additional) : nullptr; } void checkSticker() { StickerData *s = sticker(); if (!s) return; - automaticLoad(0); + automaticLoad(nullptr); if (s->img->isNull() && loaded()) { if (_data.isEmpty()) { const FileLocation &loc(location(true)); @@ -1046,16 +1046,16 @@ public: } } SongData *song() { - return (type == SongDocument) ? static_cast(_additional) : 0; + return (type == SongDocument) ? static_cast(_additional) : nullptr; } const SongData *song() const { - return (type == SongDocument) ? static_cast(_additional) : 0; + return (type == SongDocument) ? static_cast(_additional) : nullptr; } VoiceData *voice() { - return (type == VoiceDocument) ? static_cast(_additional) : 0; + return (type == VoiceDocument) ? static_cast(_additional) : nullptr; } const VoiceData *voice() const { - return (type == VoiceDocument) ? static_cast(_additional) : 0; + return (type == VoiceDocument) ? static_cast(_additional) : nullptr; } bool isAnimation() const { return (type == AnimatedDocument) || !mime.compare(qstr("image/gif"), Qt::CaseInsensitive); @@ -1246,30 +1246,220 @@ struct WebPageData { }; +class InlineResult; + +// Abstract class describing the message that will be +// sent if the user chooses this inline bot result. +// For each type of message that can be sent there will be a subclass. +class InlineResultSendData { +public: + InlineResultSendData() = default; + InlineResultSendData(const InlineResultSendData &other) = delete; + InlineResultSendData &operator=(const InlineResultSendData &other) = delete; + virtual ~InlineResultSendData() = default; + + virtual bool isValid() const = 0; + + virtual DocumentData *getSentDocument() const { + return nullptr; + } + virtual PhotoData *getSentPhoto() const { + return nullptr; + } + virtual QString getSentCaption() const { + return QString(); + } + struct SentMTPMessageFields { + MTPString text = MTP_string(""); + MTPVector entities = MTPnullEntities; + MTPMessageMedia media = MTP_messageMediaEmpty(); + }; + virtual SentMTPMessageFields getSentMessageFields(InlineResult *owner) const = 0; + +}; + +// Plain text message. +class InlineResultSendText : public InlineResultSendData { +public: + InlineResultSendText(const QString &message, const EntitiesInText &entities, bool noWebPage) + : _message(message) + , _entities(entities) + , _noWebPage(noWebPage) { + } + + bool isValid() const override { + return !_message.isEmpty(); + } + + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + QString _message; + EntitiesInText _entities; + bool _noWebPage; + +}; + +// Message with geo location point media. +class InlineResultSendGeo : public InlineResultSendData { +public: + InlineResultSendGeo(const MTPDgeoPoint &point) : _location(point) { + } + + bool isValid() const override { + return true; + } + + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + LocationCoords _location; + +}; + +// Message with venue media. +class InlineResultSendVenue : public InlineResultSendData { +public: + InlineResultSendVenue(const MTPDgeoPoint &point, const QString &venueId, + const QString &provider, const QString &title, const QString &address) + : _location(point) + , _venueId(venueId) + , _provider(provider) + , _title(title) + , _address(address) { + } + + bool isValid() const override { + return true; + } + + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + LocationCoords _location; + QString _venueId, _provider, _title, _address; + +}; + +// Message with shared contact media. +class InlineResultSendContact : public InlineResultSendData { +public: + InlineResultSendContact(const QString &firstName, const QString &lastName, const QString &phoneNumber) + : _firstName(firstName) + , _lastName(lastName) + , _phoneNumber(phoneNumber) { + } + + bool isValid() const override { + return (!_firstName.isEmpty() || !_lastName.isEmpty()) && !_phoneNumber.isEmpty(); + } + + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + QString _firstName, _lastName, _phoneNumber; + +}; + +// Message with photo. +class InlineResultSendPhoto : public InlineResultSendData { +public: + InlineResultSendPhoto(PhotoData *photo, const QString &url, const QString &caption) + : _photo(photo) + , _url(url) + , _caption(caption) { + } + + bool isValid() const override { + return _photo || !_url.isEmpty(); + } + + PhotoData *getSentPhoto() const override { + return _photo; + } + QString getSentCaption() const override { + return _caption; + } + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + PhotoData *_photo; + QString _url, _caption; + +}; + +// Message with file. +class InlineResultSendFile : public InlineResultSendData { +public: + InlineResultSendFile(DocumentData *document, const QString &url, const QString &caption) + : _document(document) + , _url(url) + , _caption(caption) { + } + + bool isValid() const override { + return _document || !_url.isEmpty(); + } + + DocumentData *getSentDocument() const override { + return _document; + } + QString getSentCaption() const override { + return _caption; + } + SentMTPMessageFields getSentMessageFields(InlineResult *owner) const override; + +private: + DocumentData *_document; + QString _url, _caption; + +}; + class InlineResult { public: - InlineResult(uint64 queryId) - : queryId(queryId) - , doc(0) - , photo(0) - , width(0) - , height(0) - , duration(0) - , noWebPage(false) - , _loader(0) { + enum class Type { + Unknown, + Photo, + Video, + Audio, + Sticker, + File, + Gif, + Article, + Contact, + Venue, + }; + static QMap getTypesMap() { + QMap result; + result.insert(qsl("photo"), Type::Photo); + result.insert(qsl("video"), Type::Video); + result.insert(qsl("audio"), Type::Audio); + result.insert(qsl("sticker"), Type::Sticker); + result.insert(qsl("file"), Type::File); + result.insert(qsl("gif"), Type::Gif); + result.insert(qsl("article"), Type::Article); + result.insert(qsl("contact"), Type::Contact); + result.insert(qsl("venue"), Type::Venue); + return result; } + + InlineResult(uint64 queryId, Type type) : queryId(queryId), type(type) { + } + InlineResult(const InlineResult &other) = delete; + InlineResult &operator=(const InlineResult &other) = delete; + uint64 queryId; - QString id, type; - DocumentData *doc; - PhotoData *photo; + QString id; + Type type; + DocumentData *document = nullptr; + PhotoData *photo = nullptr; QString title, description, url, thumb_url; QString content_type, content_url; - int32 width, height, duration; + int width = 0; + int height = 0; + int duration = 0; - QString message; // botContextMessageText - bool noWebPage; //currently not used - EntitiesInText entities; - QString caption; // if message.isEmpty() use botContextMessageMediaAuto + UniquePointer sendData; ImagePtr thumb; @@ -1289,7 +1479,7 @@ public: private: QByteArray _data; - mutable webFileLoader *_loader; + mutable webFileLoader *_loader = nullptr; }; typedef QList InlineResults;