| 594 | } |
| 595 | |
| 596 | mtpRequestId EditRichMessage( |
| 597 | not_null<HistoryItem*> item, |
| 598 | Fn<std::optional<MTPInputRichMessage>()> richMessage, |
| 599 | SendOptions options, |
| 600 | Fn<void(mtpRequestId requestId)> done, |
| 601 | Fn<void(const QString &error, mtpRequestId requestId)> fail) { |
| 602 | const auto session = &item->history()->session(); |
| 603 | const auto api = &session->api(); |
| 604 | const auto sentEntities = MTPVector<MTPMessageEntity>(); |
| 605 | const auto flags = ComputeEditMessageFlags( |
| 606 | item, |
| 607 | sentEntities, |
| 608 | Data::WebPageDraft(), |
| 609 | options, |
| 610 | false, |
| 611 | false, |
| 612 | true); |
| 613 | const auto id = EditMessageRequestId(item); |
| 614 | const auto origin = item->fullId(); |
| 615 | const auto performRequest = [=]( |
| 616 | const auto &repeatRequest, |
| 617 | mtpRequestId originalRequestId, |
| 618 | bool refreshed) -> mtpRequestId { |
| 619 | const auto current = richMessage ? richMessage() : std::nullopt; |
| 620 | const auto requestId = originalRequestId ? originalRequestId : 0; |
| 621 | if (!current) { |
| 622 | if (fail) { |
| 623 | fail(QString(), requestId); |
| 624 | } |
| 625 | return requestId; |
| 626 | } |
| 627 | return api->request(MTPmessages_EditMessage( |
| 628 | MTP_flags(flags), |
| 629 | item->history()->peer->input(), |
| 630 | MTP_int(id), |
| 631 | MTPstring(), |
| 632 | MTPInputMedia(), |
| 633 | MTPReplyMarkup(), |
| 634 | sentEntities, |
| 635 | MTP_int(options.scheduled), |
| 636 | MTP_int(options.scheduleRepeatPeriod), |
| 637 | MTP_int(item->shortcutId()), |
| 638 | *current |
| 639 | )).done([=](const MTPUpdates &result, mtpRequestId requestId) { |
| 640 | api->applyUpdates(result); |
| 641 | if (done) { |
| 642 | done(originalRequestId ? originalRequestId : requestId); |
| 643 | } |
| 644 | }).fail([=](const MTP::Error &error, mtpRequestId requestId) { |
| 645 | if (!refreshed && error.type().startsWith(u"FILE_REFERENCE_"_q)) { |
| 646 | api->refreshFileReference(origin, [=](const auto &) { |
| 647 | repeatRequest( |
| 648 | repeatRequest, |
| 649 | originalRequestId ? originalRequestId : requestId, |
| 650 | true); |
| 651 | }); |
| 652 | } else if (fail) { |
| 653 | fail(error.type(), originalRequestId ? originalRequestId : requestId); |
no test coverage detected