diff --git a/Telegram/SourceFiles/calls/calls_call.cpp b/Telegram/SourceFiles/calls/calls_call.cpp index 29dce419fa..3a5246fec7 100644 --- a/Telegram/SourceFiles/calls/calls_call.cpp +++ b/Telegram/SourceFiles/calls/calls_call.cpp @@ -427,6 +427,14 @@ void Call::answer() { }), video); } +StartConferenceInfo Call::migrateConferenceInfo(StartConferenceInfo extend) { + extend.migrating = true; + extend.muted = muted(); + extend.videoCapture = isSharingVideo() ? _videoCapture : nullptr; + extend.videoCaptureScreenId = screenSharingDeviceId(); + return extend; +} + void Call::acceptConferenceInvite() { Expects(conferenceInvite()); @@ -436,29 +444,24 @@ void Call::acceptConferenceInvite() { setState(State::ExchangingKeys); const auto limit = 5; const auto messageId = _conferenceInviteMsgId; - const auto session = &_user->session(); - auto info = StartConferenceInfo{ - .joinMessageId = messageId, - .migrating = true, - .muted = muted(), - .videoCapture = isSharingVideo() ? _videoCapture : nullptr, - .videoCaptureScreenId = screenSharingDeviceId(), - }; - session->api().request(MTPphone_GetGroupCall( + _api.request(MTPphone_GetGroupCall( MTP_inputGroupCallInviteMessage(MTP_int(messageId.bare)), MTP_int(limit) - )).done([session, messageId, info](const MTPphone_GroupCall &result) { + )).done([=](const MTPphone_GroupCall &result) { result.data().vcall().match([&](const auto &data) { - auto copy = info; - copy.call = session->data().sharedConferenceCall( + auto call = _user->owner().sharedConferenceCall( data.vid().v, data.vaccess_hash().v); - copy.call->processFullCall(result); - Core::App().calls().startOrJoinConferenceCall(std::move(copy)); + call->processFullCall(result); + Core::App().calls().startOrJoinConferenceCall( + migrateConferenceInfo({ + .call = std::move(call), + .joinMessageId = messageId, + })); }); - }).fail(crl::guard(this, [=](const MTP::Error &error) { + }).fail([=](const MTP::Error &error) { handleRequestError(error.type()); - })).send(); + }).send(); } void Call::actuallyAnswer() { @@ -892,10 +895,11 @@ void Call::finishByMigration(const QString &slug) { data.vid().v, data.vaccess_hash().v); call->processFullCall(result); - Core::App().calls().startOrJoinConferenceCall({ - .call = call, - .linkSlug = slug, - }); + Core::App().calls().startOrJoinConferenceCall( + migrateConferenceInfo({ + .call = call, + .linkSlug = slug, + })); }); }).fail(crl::guard(this, [=] { setState(State::Failed); diff --git a/Telegram/SourceFiles/calls/calls_call.h b/Telegram/SourceFiles/calls/calls_call.h index 8675d54338..3ba17518a2 100644 --- a/Telegram/SourceFiles/calls/calls_call.h +++ b/Telegram/SourceFiles/calls/calls_call.h @@ -40,6 +40,8 @@ struct DeviceResolvedId; namespace Calls { +struct StartConferenceInfo; + struct DhConfig { int32 version = 0; int32 g = 0; @@ -312,6 +314,9 @@ private: tgcalls::AudioState audio, tgcalls::VideoState video); + [[nodiscard]] StartConferenceInfo migrateConferenceInfo( + StartConferenceInfo extend); + const not_null _delegate; const not_null _user; MTP::Sender _api; diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index eb622b6bc3..daf06a64f5 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -254,7 +254,7 @@ void Instance::startOrJoinConferenceCall(StartConferenceInfo args) { _currentGroupCallChanges.fire_copy(raw); if (!args.invite.empty()) { _currentGroupCallPanel->migrationInviteUsers(std::move(args.invite)); - } else if (args.migrating && !args.linkSlug.isEmpty()) { + } else if (args.sharingLink && !args.linkSlug.isEmpty()) { _currentGroupCallPanel->migrationShowShareLink(); } } diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index ab2605faa9..6197ee5bec 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -474,12 +474,14 @@ void Panel::initControls() { return; } *creating = true; + const auto sharingLink = users.empty(); Group::MakeConferenceCall({ .show = uiShow(), .finished = finish, .joining = true, .info = { .invite = std::move(users), + .sharingLink = sharingLink, .migrating = true, .muted = call->muted(), .videoCapture = (call->isSharingVideo() diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.cpp b/Telegram/SourceFiles/calls/group/calls_group_common.cpp index 94c330e2d4..9eb576b52e 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_common.cpp @@ -406,7 +406,8 @@ void ExportConferenceCallLink( auto copy = info; copy.call = call; copy.linkSlug = std::move(slug); - Core::App().calls().startOrJoinConferenceCall(info); + Core::App().calls().startOrJoinConferenceCall( + std::move(copy)); } if (const auto onstack = finished) { finished(QString()); diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.h b/Telegram/SourceFiles/calls/group/calls_group_common.h index ed050f479c..6b8d5cedc2 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.h +++ b/Telegram/SourceFiles/calls/group/calls_group_common.h @@ -64,6 +64,7 @@ struct StartConferenceInfo { QString linkSlug; MsgId joinMessageId; std::vector invite; + bool sharingLink = false; bool migrating = false; bool muted = false; std::shared_ptr videoCapture;