diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp index e8e2e75e7..22bcb7511 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_result.cpp @@ -149,10 +149,9 @@ std::unique_ptr Result::Create( message = &r.vsend_message(); } break; } - auto badAttachment = (result->_photo && result->_photo->isNull()) - || (result->_document && result->_document->isNull()); - - if (!message) { + if ((result->_photo && result->_photo->isNull()) + || (result->_document && result->_document->isNull()) + || !message) { return nullptr; } @@ -170,108 +169,98 @@ std::unique_ptr Result::Create( } } - switch (message->type()) { - case mtpc_botInlineMessageMediaAuto: { - const auto &r = message->c_botInlineMessageMediaAuto(); - const auto message = qs(r.vmessage()); + message->match([&](const MTPDbotInlineMessageMediaAuto &data) { + const auto message = qs(data.vmessage()); const auto entities = Api::EntitiesFromMTP( session, - r.ventities().value_or_empty()); + data.ventities().value_or_empty()); if (result->_type == Type::Photo) { - if (!result->_photo) { - return nullptr; + if (result->_photo) { + result->sendData = std::make_unique( + session, + result->_photo, + message, + entities); + } else { + LOG(("Inline Error: No 'photo' in media-auto, type=photo.")); } - result->sendData = std::make_unique( - session, - result->_photo, - message, - entities); } else if (result->_type == Type::Game) { result->createGame(session); result->sendData = std::make_unique( session, result->_game); } else { - if (!result->_document) { - return nullptr; + if (result->_document) { + result->sendData = std::make_unique( + session, + result->_document, + message, + entities); + } else { + LOG(("Inline Error: No 'document' in media-auto, type=%1." + ).arg(int(result->_type))); } - result->sendData = std::make_unique( - session, - result->_document, - message, - entities); } - if (const auto markup = r.vreply_markup()) { - result->_mtpKeyboard = std::make_unique(*markup); - } - } break; - - case mtpc_botInlineMessageText: { - const auto &r = message->c_botInlineMessageText(); + }, [&](const MTPDbotInlineMessageText &data) { result->sendData = std::make_unique( session, - qs(r.vmessage()), - Api::EntitiesFromMTP(session, r.ventities().value_or_empty()), - r.is_no_webpage()); - if (const auto markup = r.vreply_markup()) { - result->_mtpKeyboard = std::make_unique(*markup); - } - } break; - - case mtpc_botInlineMessageMediaGeo: { - // #TODO layer 72 save period and send live location?.. - auto &r = message->c_botInlineMessageMediaGeo(); - if (r.vgeo().type() == mtpc_geoPoint) { - result->sendData = std::make_unique( - session, - r.vgeo().c_geoPoint()); - } else { - badAttachment = true; - } - if (const auto markup = r.vreply_markup()) { - result->_mtpKeyboard = std::make_unique(*markup); - } - } break; - - case mtpc_botInlineMessageMediaVenue: { - auto &r = message->c_botInlineMessageMediaVenue(); - if (r.vgeo().type() == mtpc_geoPoint) { + qs(data.vmessage()), + Api::EntitiesFromMTP(session, data.ventities().value_or_empty()), + data.is_no_webpage()); + }, [&](const MTPDbotInlineMessageMediaGeo &data) { + data.vgeo().match([&](const MTPDgeoPoint &geo) { + if (const auto period = data.vperiod()) { + result->sendData = std::make_unique( + session, + geo, + period->v, + (data.vheading() + ? std::make_optional(data.vheading()->v) + : std::nullopt), + (data.vproximity_notification_radius() + ? std::make_optional( + data.vproximity_notification_radius()->v) + : std::nullopt)); + } else { + result->sendData = std::make_unique( + session, + geo); + } + }, [&](const MTPDgeoPointEmpty &) { + LOG(("Inline Error: Empty 'geo' in media-geo.")); + }); + }, [&](const MTPDbotInlineMessageMediaVenue &data) { + data.vgeo().match([&](const MTPDgeoPoint &geo) { result->sendData = std::make_unique( session, - r.vgeo().c_geoPoint(), - qs(r.vvenue_id()), - qs(r.vprovider()), - qs(r.vtitle()), - qs(r.vaddress())); - } else { - badAttachment = true; - } - if (const auto markup = r.vreply_markup()) { - result->_mtpKeyboard = std::make_unique(*markup); - } - } break; - - case mtpc_botInlineMessageMediaContact: { - auto &r = message->c_botInlineMessageMediaContact(); + geo, + qs(data.vvenue_id()), + qs(data.vprovider()), + qs(data.vtitle()), + qs(data.vaddress())); + }, [&](const MTPDgeoPointEmpty &) { + LOG(("Inline Error: Empty 'geo' in media-venue.")); + }); + }, [&](const MTPDbotInlineMessageMediaContact &data) { result->sendData = std::make_unique( session, - qs(r.vfirst_name()), - qs(r.vlast_name()), - qs(r.vphone_number())); - if (const auto markup = r.vreply_markup()) { - result->_mtpKeyboard = std::make_unique(*markup); - } - } break; + qs(data.vfirst_name()), + qs(data.vlast_name()), + qs(data.vphone_number())); + }, [&](const MTPDbotInlineMessageMediaInvoice &data) { + // #TODO payments + }); - default: { - badAttachment = true; - } break; - } - - if (badAttachment || !result->sendData || !result->sendData->isValid()) { + if (!result->sendData || !result->sendData->isValid()) { return nullptr; } + message->match([&](const auto &data) { + if (const auto markup = data.vreply_markup()) { + result->_mtpKeyboard = std::make_unique(*markup); + } + }); + if (const auto point = result->getLocationPoint()) { const auto scale = 1 + (cScale() * cIntRetinaFactor()) / 200; const auto zoom = 15 + (scale - 1); diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_send_data.cpp b/Telegram/SourceFiles/inline_bots/inline_bot_send_data.cpp index 2088615ee..6b3cae70e 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_send_data.cpp +++ b/Telegram/SourceFiles/inline_bots/inline_bot_send_data.cpp @@ -97,7 +97,18 @@ SendDataCommon::SentMTPMessageFields SendText::getSentMessageFields() const { SendDataCommon::SentMTPMessageFields SendGeo::getSentMessageFields() const { SentMTPMessageFields result; - result.media = MTP_messageMediaGeo(_location.toMTP()); + if (_period) { + using Flag = MTPDmessageMediaGeoLive::Flag; + result.media = MTP_messageMediaGeoLive( + MTP_flags((_heading ? Flag::f_heading : Flag(0)) + | (_proximityNotificationRadius ? Flag::f_proximity_notification_radius : Flag(0))), + _location.toMTP(), + MTP_int(_heading.value_or(0)), + MTP_int(*_period), + MTP_int(_proximityNotificationRadius.value_or(0))); + } else { + result.media = MTP_messageMediaGeo(_location.toMTP()); + } return result; } diff --git a/Telegram/SourceFiles/inline_bots/inline_bot_send_data.h b/Telegram/SourceFiles/inline_bots/inline_bot_send_data.h index 5d9780190..c977ebd1d 100644 --- a/Telegram/SourceFiles/inline_bots/inline_bot_send_data.h +++ b/Telegram/SourceFiles/inline_bots/inline_bot_send_data.h @@ -135,6 +135,18 @@ public: : SendDataCommon(session) , _location(point) { } + SendGeo( + not_null session, + const MTPDgeoPoint &point, + int period, + std::optional heading, + std::optional proximityNotificationRadius) + : SendDataCommon(session) + , _location(point) + , _period(period) + , _heading(heading) + , _proximityNotificationRadius(proximityNotificationRadius){ + } bool isValid() const override { return true; @@ -151,6 +163,9 @@ public: private: Data::LocationPoint _location; + std::optional _period; + std::optional _heading; + std::optional _proximityNotificationRadius; };