From c0ae4b86a6433faee4a32b7bcdcb1e6cf5e63e16 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 23 Feb 2022 09:59:51 +0300 Subject: [PATCH] Provided Window::SessionController to ShareGameScoreByHash. --- Telegram/SourceFiles/boxes/share_box.cpp | 54 ++++++++++++------- Telegram/SourceFiles/boxes/share_box.h | 3 +- .../SourceFiles/core/local_url_handlers.cpp | 2 +- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/Telegram/SourceFiles/boxes/share_box.cpp b/Telegram/SourceFiles/boxes/share_box.cpp index 8769f16fb3..cea7aa99bb 100644 --- a/Telegram/SourceFiles/boxes/share_box.cpp +++ b/Telegram/SourceFiles/boxes/share_box.cpp @@ -1249,20 +1249,22 @@ QString AppendShareGameScoreUrl( } void ShareGameScoreByHash( - not_null session, + not_null controller, const QString &hash) { + auto &session = controller->session(); auto key128Size = 0x10; auto hashEncrypted = QByteArray::fromBase64(hash.toLatin1(), QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); if (hashEncrypted.size() <= key128Size || (hashEncrypted.size() != key128Size + 0x20)) { - Ui::show(Box( - tr::lng_confirm_phone_link_invalid(tr::now))); + controller->show( + Box(tr::lng_confirm_phone_link_invalid(tr::now)), + Ui::LayerOption::CloseOther); return; } // Decrypt data. auto hashData = QByteArray(hashEncrypted.size() - key128Size, Qt::Uninitialized); - if (!session->local().decrypt(hashEncrypted.constData() + key128Size, hashData.data(), hashEncrypted.size() - key128Size, hashEncrypted.constData())) { + if (!session.local().decrypt(hashEncrypted.constData() + key128Size, hashData.data(), hashEncrypted.size() - key128Size, hashEncrypted.constData())) { return; } @@ -1282,13 +1284,17 @@ void ShareGameScoreByHash( // Check 128 bits of SHA1() of data. if (memcmp(dataSha1, hashEncrypted.constData(), key128Size) != 0) { - Ui::show(Box(tr::lng_share_wrong_user(tr::now))); + controller->show( + Box(tr::lng_share_wrong_user(tr::now)), + Ui::LayerOption::CloseOther); return; } auto hashDataInts = reinterpret_cast(hashData.data()); - if (hashDataInts[0] != session->userId().bare) { - Ui::show(Box(tr::lng_share_wrong_user(tr::now))); + if (hashDataInts[0] != session.userId().bare) { + controller->show( + Box(tr::lng_share_wrong_user(tr::now)), + Ui::LayerOption::CloseOther); return; } @@ -1296,33 +1302,43 @@ void ShareGameScoreByHash( const auto channelAccessHash = hashDataInts[3]; if (!peerIsChannel(peerId) && channelAccessHash) { // If there is no channel id, there should be no channel access_hash. - Ui::show(Box(tr::lng_share_wrong_user(tr::now))); + controller->show( + Box(tr::lng_share_wrong_user(tr::now)), + Ui::LayerOption::CloseOther); return; } const auto msgId = MsgId(int64(hashDataInts[2])); - if (const auto item = session->data().message(peerId, msgId)) { + if (const auto item = session.data().message(peerId, msgId)) { FastShareMessage(item); } else { - auto resolveMessageAndShareScore = [=](PeerData *peer) { - session->api().requestMessageData(peer, msgId, [=] { - const auto item = session->data().message(peerId, msgId); + const auto weak = base::make_weak(controller.get()); + const auto resolveMessageAndShareScore = crl::guard(weak, [=]( + PeerData *peer) { + auto done = crl::guard(weak, [=] { + const auto item = weak->session().data().message( + peerId, + msgId); if (item) { FastShareMessage(item); } else { - Ui::show(Box( - tr::lng_edit_deleted(tr::now))); + weak->show( + Box(tr::lng_edit_deleted(tr::now)), + Ui::LayerOption::CloseOther); } }); - }; + auto &api = weak->session().api(); + api.requestMessageData(peer, msgId, std::move(done)); + }); const auto peer = peerIsChannel(peerId) - ? session->data().peerLoaded(peerId) + ? controller->session().data().peerLoaded(peerId) : nullptr; if (peer || !peerIsChannel(peerId)) { resolveMessageAndShareScore(peer); } else { - session->api().request(MTPchannels_GetChannels( + const auto owner = &controller->session().data(); + controller->session().api().request(MTPchannels_GetChannels( MTP_vector( 1, MTP_inputChannel( @@ -1330,9 +1346,9 @@ void ShareGameScoreByHash( MTP_long(channelAccessHash))) )).done([=](const MTPmessages_Chats &result) { result.match([&](const auto &data) { - session->data().processChats(data.vchats()); + owner->processChats(data.vchats()); }); - if (const auto peer = session->data().peerLoaded(peerId)) { + if (const auto peer = owner->peerLoaded(peerId)) { resolveMessageAndShareScore(peer); } }).send(); diff --git a/Telegram/SourceFiles/boxes/share_box.h b/Telegram/SourceFiles/boxes/share_box.h index 83a360964e..a53ba321fa 100644 --- a/Telegram/SourceFiles/boxes/share_box.h +++ b/Telegram/SourceFiles/boxes/share_box.h @@ -26,6 +26,7 @@ enum class Type; } // namespace SendMenu namespace Window { +class SessionController; class SessionNavigation; } // namespace Window @@ -60,7 +61,7 @@ QString AppendShareGameScoreUrl( const QString &url, const FullMsgId &fullId); void ShareGameScoreByHash( - not_null session, + not_null controller, const QString &hash); class ShareBox final : public Ui::BoxContent { diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index c7615a5b82..b80a169231 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -163,7 +163,7 @@ bool ShareGameScore( const auto params = url_parse_params( match->captured(1), qthelp::UrlParamNameTransform::ToLower); - ShareGameScoreByHash(&controller->session(), params.value(qsl("hash"))); + ShareGameScoreByHash(controller, params.value(qsl("hash"))); return true; }