diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 3b6ad3c67..2c9325ef8 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -27,13 +27,19 @@ using namespace rpl::details; template constexpr auto WithId = - is_callable_plain_v, mtpRequestId>; + is_callable_plain_v, mtpRequestId>; template constexpr auto WithoutId = - is_callable_plain_v>; + is_callable_plain_v>; template constexpr auto WithoutCallback = - is_callable_plain_v; + is_callable_plain_v; +template +constexpr auto ErrorWithId = + is_callable_plain_v; +template +constexpr auto ErrorWithoutId = + is_callable_plain_v; template mtpRequestId EditMessage( @@ -93,22 +99,30 @@ mtpRequestId EditMessage( const auto apply = [=] { api->applyUpdates(result); }; if constexpr (WithId) { - done(result, apply, requestId); + done(apply, requestId); } else if constexpr (WithoutId) { - done(result, apply); + done(apply); } else if constexpr (WithoutCallback) { - done(result); + done(); apply(); } else { - apply(); + t_bad_callback(done); } if (updateRecentStickers) { api->requestRecentStickersForce(true); } - }).fail( - fail - ).send(); + }).fail([=](const MTP::Error &error, mtpRequestId requestId) { + if constexpr (ErrorWithId) { + fail(error.type(), requestId); + } else if constexpr (ErrorWithoutId) { + fail(error.type()); + } else if constexpr (WithoutCallback) { + fail(); + } else { + t_bad_callback(fail); + } + }).send(); } template @@ -132,7 +146,7 @@ void EditMessageWithUploadedMedia( not_null item, SendOptions options, MTPInputMedia media) { - const auto done = [=](const auto &result, Fn applyUpdates) { + const auto done = [=](Fn applyUpdates) { if (item) { item->clearSavedMedia(); item->setIsLocalUpdateMedia(true); @@ -140,11 +154,10 @@ void EditMessageWithUploadedMedia( item->setIsLocalUpdateMedia(false); } }; - const auto fail = [=](const MTP::Error &error) { - const auto err = error.type(); + const auto fail = [=](const QString &error) { const auto session = &item->history()->session(); - const auto notModified = (err == u"MESSAGE_NOT_MODIFIED"_q); - const auto mediaInvalid = (err == u"MEDIA_NEW_INVALID"_q); + const auto notModified = (error == u"MESSAGE_NOT_MODIFIED"_q); + const auto mediaInvalid = (error == u"MEDIA_NEW_INVALID"_q); if (notModified || mediaInvalid) { item->returnSavedMedia(); session->data().sendHistoryChangeNotifications(); @@ -200,8 +213,8 @@ mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail) { + Fn done, + Fn fail) { return EditMessage(item, caption, options, done, fail); } @@ -209,17 +222,13 @@ mtpRequestId EditTextMessage( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail) { - const auto callback = [=]( - const auto &result, - Fn applyUpdates, - auto id) { + Fn done, + Fn fail) { + const auto callback = [=](Fn applyUpdates, mtpRequestId id) { applyUpdates(); - done(result, id); + done(id); }; return EditMessage(item, caption, options, callback, fail); } - } // namespace Api diff --git a/Telegram/SourceFiles/api/api_editing.h b/Telegram/SourceFiles/api/api_editing.h index 4a80e9dae..7c132124b 100644 --- a/Telegram/SourceFiles/api/api_editing.h +++ b/Telegram/SourceFiles/api/api_editing.h @@ -42,14 +42,14 @@ mtpRequestId EditCaption( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail); + Fn done, + Fn fail); mtpRequestId EditTextMessage( not_null item, const TextWithEntities &caption, SendOptions options, - Fn done, - Fn fail); + Fn done, + Fn fail); } // namespace Api diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index 4fa3aab5f..47b7b4785 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -438,14 +438,22 @@ void ApiWrap::sendMessageFail( not_null peer, uint64 randomId, FullMsgId itemId) { + sendMessageFail(error.type(), peer, randomId, itemId); +} + +void ApiWrap::sendMessageFail( + const QString &error, + not_null peer, + uint64 randomId, + FullMsgId itemId) { const auto show = ShowForPeer(peer); - if (error.type() == qstr("PEER_FLOOD")) { + if (error == qstr("PEER_FLOOD")) { show->showBox( Ui::MakeInformBox( PeerFloodErrorText(&session(), PeerFloodType::Send)), Ui::LayerOption::CloseOther); - } else if (error.type() == qstr("USER_BANNED_IN_CHANNEL")) { + } else if (error == qstr("USER_BANNED_IN_CHANNEL")) { const auto link = Ui::Text::Link( tr::lng_cant_more_info(tr::now), session().createInternalLinkFull(qsl("spambot"))); @@ -457,9 +465,9 @@ void ApiWrap::sendMessageFail( link, Ui::Text::WithEntities)), Ui::LayerOption::CloseOther); - } else if (error.type().startsWith(qstr("SLOWMODE_WAIT_"))) { + } else if (error.startsWith(qstr("SLOWMODE_WAIT_"))) { const auto chop = qstr("SLOWMODE_WAIT_").size(); - const auto left = base::StringViewMid(error.type(), chop).toInt(); + const auto left = base::StringViewMid(error, chop).toInt(); if (const auto channel = peer->asChannel()) { const auto seconds = channel->slowmodeSeconds(); if (seconds >= left) { @@ -469,7 +477,7 @@ void ApiWrap::sendMessageFail( requestFullPeer(peer); } } - } else if (error.type() == qstr("SCHEDULE_STATUS_PRIVATE")) { + } else if (error == qstr("SCHEDULE_STATUS_PRIVATE")) { auto &scheduled = _session->data().scheduledMessages(); Assert(peer->isUser()); if (const auto item = scheduled.lookupItem(peer->id, itemId.msg)) { @@ -478,7 +486,7 @@ void ApiWrap::sendMessageFail( Ui::MakeInformBox(tr::lng_cant_do_this()), Ui::LayerOption::CloseOther); } - } else if (error.type() == qstr("CHAT_FORWARDS_RESTRICTED")) { + } else if (error == qstr("CHAT_FORWARDS_RESTRICTED")) { if (show->valid()) { Ui::ShowMultilineToast({ .parentOverride = show->toastParent(), @@ -489,7 +497,7 @@ void ApiWrap::sendMessageFail( .duration = kJoinErrorDuration }); } - } else if (error.type() == qstr("PREMIUM_ACCOUNT_REQUIRED")) { + } else if (error == qstr("PREMIUM_ACCOUNT_REQUIRED")) { Settings::ShowPremium(&session(), "premium_stickers"); } if (const auto item = _session->data().message(itemId)) { diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index 18a693eb0..1caa1d763 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -343,6 +343,11 @@ public: not_null peer, uint64 randomId = 0, FullMsgId itemId = FullMsgId()); + void sendMessageFail( + const QString &error, + not_null peer, + uint64 randomId = 0, + FullMsgId itemId = FullMsgId()); void reloadContactSignupSilent(); rpl::producer contactSignupSilent() const; diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 85719b40b..f22adecd8 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -723,20 +723,19 @@ void EditCaptionBox::save() { return; } - const auto done = crl::guard(this, [=](const MTPUpdates &updates) { + const auto done = crl::guard(this, [=] { _saveRequestId = 0; closeBox(); }); - const auto fail = crl::guard(this, [=](const MTP::Error &error) { + const auto fail = crl::guard(this, [=](const QString &error) { _saveRequestId = 0; - const auto &type = error.type(); - if (ranges::contains(Api::kDefaultEditMessagesErrors, type)) { + if (ranges::contains(Api::kDefaultEditMessagesErrors, error)) { _error = tr::lng_edit_error(tr::now); update(); - } else if (type == u"MESSAGE_NOT_MODIFIED"_q) { + } else if (error == u"MESSAGE_NOT_MODIFIED"_q) { closeBox(); - } else if (type == u"MESSAGE_EMPTY"_q) { + } else if (error == u"MESSAGE_EMPTY"_q) { _field->setFocus(); _field->showError(); update(); diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 284d86d5f..a0f7d240a 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -3662,7 +3662,7 @@ void HistoryWidget::saveEditMsg() { const auto weak = Ui::MakeWeak(this); const auto history = _history; - const auto done = [=](const MTPUpdates &result, mtpRequestId requestId) { + const auto done = [=](mtpRequestId requestId) { crl::guard(weak, [=] { if (requestId == _saveEditMsgRequestId) { _saveEditMsgRequestId = 0; @@ -3677,7 +3677,7 @@ void HistoryWidget::saveEditMsg() { } }; - const auto fail = [=](const MTP::Error &error, mtpRequestId requestId) { + const auto fail = [=](const QString &error, mtpRequestId requestId) { if (const auto editDraft = history->localEditDraft()) { if (editDraft->saveRequestId == requestId) { editDraft->saveRequestId = 0; @@ -3687,12 +3687,11 @@ void HistoryWidget::saveEditMsg() { if (requestId == _saveEditMsgRequestId) { _saveEditMsgRequestId = 0; } - const auto &err = error.type(); - if (ranges::contains(Api::kDefaultEditMessagesErrors, err)) { + if (ranges::contains(Api::kDefaultEditMessagesErrors, error)) { controller()->show(Ui::MakeInformBox(tr::lng_edit_error())); - } else if (err == u"MESSAGE_NOT_MODIFIED"_q) { + } else if (error == u"MESSAGE_NOT_MODIFIED"_q) { cancelEdit(); - } else if (err == u"MESSAGE_EMPTY"_q) { + } else if (error == u"MESSAGE_EMPTY"_q) { _field->selectAll(); _field->setFocus(); } else { diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index de3aed3a4..9524930c2 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -1074,24 +1074,23 @@ void RepliesWidget::edit( session().api().request(base::take(*saveEditMsgRequestId)).cancel(); }); - const auto done = [=](const MTPUpdates &result, mtpRequestId requestId) { + const auto done = [=](mtpRequestId requestId) { if (requestId == *saveEditMsgRequestId) { *saveEditMsgRequestId = 0; _composeControls->cancelEditMessage(); } }; - const auto fail = [=](const MTP::Error &error, mtpRequestId requestId) { + const auto fail = [=](const QString &error, mtpRequestId requestId) { if (requestId == *saveEditMsgRequestId) { *saveEditMsgRequestId = 0; } - const auto &err = error.type(); - if (ranges::contains(Api::kDefaultEditMessagesErrors, err)) { + if (ranges::contains(Api::kDefaultEditMessagesErrors, error)) { controller()->show(Ui::MakeInformBox(tr::lng_edit_error())); - } else if (err == u"MESSAGE_NOT_MODIFIED"_q) { + } else if (error == u"MESSAGE_NOT_MODIFIED"_q) { _composeControls->cancelEditMessage(); - } else if (err == u"MESSAGE_EMPTY"_q) { + } else if (error == u"MESSAGE_EMPTY"_q) { doSetInnerFocus(); } else { controller()->show(Ui::MakeInformBox(tr::lng_edit_error())); diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index 49b287378..5370172db 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -688,24 +688,23 @@ void ScheduledWidget::edit( session().api().request(base::take(*saveEditMsgRequestId)).cancel(); }); - const auto done = [=](const MTPUpdates &result, mtpRequestId requestId) { + const auto done = [=](mtpRequestId requestId) { if (requestId == *saveEditMsgRequestId) { *saveEditMsgRequestId = 0; _composeControls->cancelEditMessage(); } }; - const auto fail = [=](const MTP::Error &error, mtpRequestId requestId) { + const auto fail = [=](const QString &error, mtpRequestId requestId) { if (requestId == *saveEditMsgRequestId) { *saveEditMsgRequestId = 0; } - const auto &err = error.type(); - if (ranges::contains(Api::kDefaultEditMessagesErrors, err)) { + if (ranges::contains(Api::kDefaultEditMessagesErrors, error)) { controller()->show(Ui::MakeInformBox(tr::lng_edit_error())); - } else if (err == u"MESSAGE_NOT_MODIFIED"_q) { + } else if (error == u"MESSAGE_NOT_MODIFIED"_q) { _composeControls->cancelEditMessage(); - } else if (err == u"MESSAGE_EMPTY"_q) { + } else if (error == u"MESSAGE_EMPTY"_q) { _composeControls->focus(); } else { controller()->show(Ui::MakeInformBox(tr::lng_edit_error()));