mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-15 21:57:10 +02:00
Provided Window::SessionController to ShareGameScoreByHash.
This commit is contained in:
parent
ca7f4ffed9
commit
c0ae4b86a6
3 changed files with 38 additions and 21 deletions
|
@ -1249,20 +1249,22 @@ QString AppendShareGameScoreUrl(
|
|||
}
|
||||
|
||||
void ShareGameScoreByHash(
|
||||
not_null<Main::Session*> session,
|
||||
not_null<Window::SessionController*> 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<Ui::InformBox>(
|
||||
tr::lng_confirm_phone_link_invalid(tr::now)));
|
||||
controller->show(
|
||||
Box<Ui::InformBox>(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<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
|
||||
controller->show(
|
||||
Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)),
|
||||
Ui::LayerOption::CloseOther);
|
||||
return;
|
||||
}
|
||||
|
||||
auto hashDataInts = reinterpret_cast<uint64*>(hashData.data());
|
||||
if (hashDataInts[0] != session->userId().bare) {
|
||||
Ui::show(Box<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
|
||||
if (hashDataInts[0] != session.userId().bare) {
|
||||
controller->show(
|
||||
Box<Ui::InformBox>(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<Ui::InformBox>(tr::lng_share_wrong_user(tr::now)));
|
||||
controller->show(
|
||||
Box<Ui::InformBox>(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<Ui::InformBox>(
|
||||
tr::lng_edit_deleted(tr::now)));
|
||||
weak->show(
|
||||
Box<Ui::InformBox>(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<MTPInputChannel>(
|
||||
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();
|
||||
|
|
|
@ -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<Main::Session*> session,
|
||||
not_null<Window::SessionController*> controller,
|
||||
const QString &hash);
|
||||
|
||||
class ShareBox final : public Ui::BoxContent {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue