From 2a7aac76d965ce52536edb86e21558297860aa0e Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 9 Apr 2025 10:28:21 +0400 Subject: [PATCH] Update API scheme on layer 202. --- Telegram/SourceFiles/calls/calls_panel.cpp | 7 +- .../calls/group/calls_group_call.cpp | 11 -- .../calls/group/calls_group_call.h | 1 - .../calls/group/calls_group_common.cpp | 160 +++++++++--------- .../calls/group/calls_group_common.h | 15 +- .../group/calls_group_invite_controller.cpp | 8 +- .../group/calls_group_invite_controller.h | 2 +- .../calls/group/calls_group_panel.cpp | 23 +-- .../calls/group/calls_group_panel.h | 3 +- Telegram/SourceFiles/data/data_group_call.cpp | 5 + Telegram/SourceFiles/data/data_group_call.h | 2 + Telegram/SourceFiles/main/main_app_config.cpp | 2 +- Telegram/SourceFiles/mtproto/scheme/api.tl | 6 +- .../SourceFiles/window/window_main_menu.cpp | 4 +- 14 files changed, 104 insertions(+), 145 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_panel.cpp b/Telegram/SourceFiles/calls/calls_panel.cpp index 5a95153d36..7abf76b029 100644 --- a/Telegram/SourceFiles/calls/calls_panel.cpp +++ b/Telegram/SourceFiles/calls/calls_panel.cpp @@ -353,11 +353,6 @@ void Panel::initControls() { } const auto call = _call; const auto creating = std::make_shared(); - const auto finish = [=](QString link) { - if (link.isEmpty()) { - *creating = false; - } - }; const auto create = [=](std::vector users) { if (*creating) { return; @@ -366,7 +361,7 @@ void Panel::initControls() { const auto sharingLink = users.empty(); Group::MakeConferenceCall({ .show = sessionShow(), - .finished = finish, + .finished = [=](bool) { *creating = false; }, .joining = true, .info = { .invite = std::move(users), diff --git a/Telegram/SourceFiles/calls/group/calls_group_call.cpp b/Telegram/SourceFiles/calls/group/calls_group_call.cpp index c8399d35c9..5f27e80ca5 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_call.cpp @@ -1211,15 +1211,6 @@ std::shared_ptr GroupCall::conferenceCall() const { return _conferenceCall; } -QString GroupCall::existingConferenceLink() const { - Expects(!_conferenceLinkSlug.isEmpty()); - - const auto session = &_peer->session(); - return !_conferenceLinkSlug.isEmpty() - ? session->createInternalLinkFull("call/" + _conferenceLinkSlug) - : QString(); -} - rpl::producer> GroupCall::real() const { if (const auto real = lookupReal()) { return rpl::single(not_null{ real }); @@ -1569,7 +1560,6 @@ void GroupCall::sendJoinRequest() { | (wasVideoStopped ? Flag::f_video_stopped : Flag(0)) - | (_conferenceJoinMessageId ? Flag::f_invite_msg_id : Flag()) | (_e2e ? (Flag::f_public_key | Flag::f_block) : Flag()); _api.request(MTPphone_JoinGroupCall( MTP_flags(flags), @@ -1578,7 +1568,6 @@ void GroupCall::sendJoinRequest() { MTP_string(_joinHash), (_e2e ? TdE2E::PublicKeyToMTP(_e2e->myKey()) : MTPint256()), MTP_bytes(joinBlock), - MTP_int(_conferenceJoinMessageId.bare), MTP_dataJSON(MTP_bytes(_joinState.payload.json)) )).done([=]( const MTPUpdates &updates, diff --git a/Telegram/SourceFiles/calls/group/calls_group_call.h b/Telegram/SourceFiles/calls/group/calls_group_call.h index c7f8368061..7b29f357c3 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_call.h +++ b/Telegram/SourceFiles/calls/group/calls_group_call.h @@ -260,7 +260,6 @@ public: [[nodiscard]] Data::GroupCall *lookupReal() const; [[nodiscard]] std::shared_ptr conferenceCall() const; - [[nodiscard]] QString existingConferenceLink() const; [[nodiscard]] rpl::producer> real() const; [[nodiscard]] rpl::producer emojiHashValue() const; diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.cpp b/Telegram/SourceFiles/calls/group/calls_group_common.cpp index d313a030b0..a1db17f0a7 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_common.cpp @@ -253,10 +253,10 @@ ConferenceCallLinkStyleOverrides DarkConferenceCallLinkStyle() { void ShowConferenceCallLinkBox( std::shared_ptr show, std::shared_ptr call, - const QString &link, - ConferenceCallLinkArgs &&args) { + const ConferenceCallLinkArgs &args) { const auto st = args.st; const auto initial = args.initial; + const auto link = call->conferenceInviteLink(); show->showBox(Box([=](not_null box) { struct State { base::unique_qptr menu; @@ -285,30 +285,25 @@ void ShowConferenceCallLinkBox( } state->resetting = true; using Flag = MTPphone_ToggleGroupCallSettings::Flag; + const auto weak = Ui::MakeWeak(box); call->session().api().request( MTPphone_ToggleGroupCallSettings( MTP_flags(Flag::f_reset_invite_hash), call->input(), MTPbool()) // join_muted - ).done([=] { - auto copy = args; - const auto weak = Ui::MakeWeak(box); - copy.finished = [=](QString link) { - if (const auto strong = weak.data()) { - strong->closeBox(); - } - show->showToast({ - .title = tr::lng_confcall_link_revoked_title( - tr::now), - .text = { - tr::lng_confcall_link_revoked_text(tr::now), - }, - }); - }; - ExportConferenceCallLink( - show, - call, - std::move(copy)); + ).done([=](const MTPUpdates &result) { + call->session().api().applyUpdates(result); + ShowConferenceCallLinkBox(show, call, args); + if (const auto strong = weak.data()) { + strong->closeBox(); + } + show->showToast({ + .title = tr::lng_confcall_link_revoked_title( + tr::now), + .text = { + tr::lng_confcall_link_revoked_text(tr::now), + }, + }); }).send(); }; toggle->setClickedCallback([=] { @@ -355,10 +350,7 @@ void ShowConferenceCallLinkBox( Ui::AddSkip(box->verticalLayout(), st::defaultVerticalListSkip * 2); const auto preview = box->addRow( - Info::BotStarRef::MakeLinkLabel( - box, - link, - st.linkPreview)); + Info::BotStarRef::MakeLinkLabel(box, link, st.linkPreview)); Ui::AddSkip(box->verticalLayout()); const auto copyCallback = [=] { @@ -372,11 +364,11 @@ void ShowConferenceCallLinkBox( st.shareBox ? *st.shareBox : ShareBoxStyleOverrides()); }; preview->setClickedCallback(copyCallback); - [[maybe_unused]] const auto share = box->addButton( + const auto share = box->addButton( tr::lng_group_invite_share(), shareCallback, st::confcallLinkShareButton); - [[maybe_unused]] const auto copy = box->addButton( + const auto copy = box->addButton( tr::lng_group_invite_copy(), copyCallback, st::confcallLinkCopyButton); @@ -457,21 +449,57 @@ void ShowConferenceCallLinkBox( })); } -void ExportConferenceCallLink( - std::shared_ptr show, - std::shared_ptr call, - ConferenceCallLinkArgs &&args) { - const auto session = &show->session(); - const auto info = std::move(args.info); +void MakeConferenceCall(ConferenceFactoryArgs &&args) { + const auto show = std::move(args.show); const auto finished = std::move(args.finished); - - using Flag = MTPphone_ExportGroupCallInvite::Flag; - session->api().request(MTPphone_ExportGroupCallInvite( - MTP_flags(Flag::f_can_self_unmute), - call->input() - )).done([=](const MTPphone_ExportedGroupCallInvite &result) { - const auto link = qs(result.data().vlink()); - if (args.joining) { + const auto joining = args.joining; + const auto info = std::move(args.info); + const auto session = &show->session(); + const auto fail = [=](QString error) { + show->showToast(error); + if (const auto onstack = finished) { + onstack(false); + } + }; + session->api().request(MTPphone_CreateConferenceCall( + MTP_flags(0), + MTP_int(base::RandomValue()), + MTPint256(), // public_key + MTPbytes(), // block + MTPDataJSON() // params + )).done([=](const MTPUpdates &result) { + session->api().applyUpdates(result); + const auto updates = result.match([&](const MTPDupdates &data) { + return &data.vupdates().v; + }, [&](const MTPDupdatesCombined &data) { + return &data.vupdates().v; + }, [](const auto &) { + return (const QVector*)nullptr; + }); + if (!updates) { + fail(u"Call not found!"_q); + return; + } + auto call = std::shared_ptr(); + for (const auto &update : *updates) { + update.match([&](const MTPDupdateGroupCall &data) { + data.vcall().match([&](const auto &data) { + call = session->data().sharedConferenceCall( + data.vid().v, + data.vaccess_hash().v); + call->enqueueUpdate(update); + }); + }, [](const auto &) {}); + if (call) { + break; + } + } + const auto link = call ? call->conferenceInviteLink() : QString(); + if (link.isEmpty()) { + fail(u"Call link not found!"_q); + return; + } + if (joining) { if (auto slug = ExtractConferenceSlug(link); !slug.isEmpty()) { auto copy = info; copy.call = call; @@ -479,53 +507,17 @@ void ExportConferenceCallLink( Core::App().calls().startOrJoinConferenceCall( std::move(copy)); } - if (const auto onstack = finished) { - finished(QString()); - } - return; + } else { + Calls::Group::ShowConferenceCallLinkBox( + show, + call, + { .initial = true }); } - Calls::Group::ShowConferenceCallLinkBox( - show, - call, - link, - base::duplicate(args)); if (const auto onstack = finished) { - finished(link); + finished(true); } }).fail([=](const MTP::Error &error) { - show->showToast(error.type()); - if (const auto onstack = finished) { - finished(QString()); - } - }).send(); -} - -void MakeConferenceCall(ConferenceFactoryArgs &&args) { - const auto show = std::move(args.show); - const auto finished = std::move(args.finished); - const auto joining = args.joining; - const auto info = std::move(args.info); - const auto session = &show->session(); - session->api().request(MTPphone_CreateConferenceCall( - MTP_int(base::RandomValue()) - )).done([=](const MTPphone_GroupCall &result) { - result.data().vcall().match([&](const auto &data) { - const auto call = session->data().sharedConferenceCall( - data.vid().v, - data.vaccess_hash().v); - call->processFullCall(result); - Calls::Group::ExportConferenceCallLink(show, call, { - .initial = true, - .joining = joining, - .finished = finished, - .info = info, - }); - }); - }).fail([=](const MTP::Error &error) { - show->showToast(error.type()); - if (const auto onstack = finished) { - onstack(QString()); - } + fail(error.type()); }).send(); } diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.h b/Telegram/SourceFiles/calls/group/calls_group_common.h index 57b160c8c3..8407791535 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.h +++ b/Telegram/SourceFiles/calls/group/calls_group_common.h @@ -179,26 +179,17 @@ struct ConferenceCallLinkStyleOverrides { [[nodiscard]] ConferenceCallLinkStyleOverrides DarkConferenceCallLinkStyle(); struct ConferenceCallLinkArgs { - bool initial = false; - bool joining = false; - Fn finished; - StartConferenceInfo info; ConferenceCallLinkStyleOverrides st; + bool initial = false; }; void ShowConferenceCallLinkBox( std::shared_ptr show, std::shared_ptr call, - const QString &link, - ConferenceCallLinkArgs &&args); - -void ExportConferenceCallLink( - std::shared_ptr show, - std::shared_ptr call, - ConferenceCallLinkArgs &&args); + const ConferenceCallLinkArgs &args); struct ConferenceFactoryArgs { std::shared_ptr show; - Fn finished; + Fn finished; bool joining = false; StartConferenceInfo info; }; diff --git a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp index 1523857d56..d3313b10b0 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp @@ -472,7 +472,7 @@ std::unique_ptr InviteContactsController::createRow( object_ptr PrepareInviteBox( not_null call, Fn showToast, - Fn finished)> shareConferenceLink) { + Fn shareConferenceLink) { const auto real = call->lookupReal(); if (!real) { return nullptr; @@ -497,8 +497,10 @@ object_ptr PrepareInviteBox( if (conference) { const auto close = std::make_shared>(); const auto shareLink = [=] { - Assert(shareConferenceLink != nullptr); - shareConferenceLink([=](bool ok) { if (ok) (*close)(); }); + Expects(shareConferenceLink != nullptr); + + shareConferenceLink(); + (*close)(); }; auto controller = std::make_unique( &real->session(), diff --git a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.h b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.h index 8c136d19f7..4c1ba17d6f 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.h +++ b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.h @@ -80,7 +80,7 @@ private: [[nodiscard]] object_ptr PrepareInviteBox( not_null call, Fn showToast, - Fn finished)> shareConferenceLink = nullptr); + Fn shareConferenceLink = nullptr); [[nodiscard]] object_ptr PrepareInviteBox( not_null call, diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index d22dc923f5..b55e375891 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -905,9 +905,7 @@ void Panel::setupMembers() { }, _callLifetime); _members->shareLinkRequests( - ) | rpl::start_with_next([cb = shareConferenceLinkCallback()] { - cb(nullptr); - }, _callLifetime); + ) | rpl::start_with_next(shareConferenceLinkCallback(), _callLifetime); _call->videoEndpointLargeValue( ) | rpl::start_with_next([=](const VideoEndpoint &large) { @@ -918,23 +916,11 @@ void Panel::setupMembers() { }, _callLifetime); } -Fn finished)> Panel::shareConferenceLinkCallback() { - const auto exporting = std::make_shared(); - return [=](Fn finished) { +Fn Panel::shareConferenceLinkCallback() { + return [=] { Expects(_call->conference()); - if (*exporting) { - return; - } - *exporting = true; - const auto done = [=](QString link) { - *exporting = false; - if (const auto onstack = finished) { - onstack(!link.isEmpty()); - } - }; - ExportConferenceCallLink(sessionShow(), _call->conferenceCall(), { - .finished = done, + ShowConferenceCallLinkBox(sessionShow(), _call->conferenceCall(), { .st = DarkConferenceCallLinkStyle(), }); }; @@ -945,7 +931,6 @@ void Panel::migrationShowShareLink() { ShowConferenceCallLinkBox( sessionShow(), _call->conferenceCall(), - _call->existingConferenceLink(), { .st = DarkConferenceCallLinkStyle() }); } diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.h b/Telegram/SourceFiles/calls/group/calls_group_panel.h index 9110c495e9..94519c9a99 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.h +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.h @@ -170,8 +170,7 @@ private: void toggleWideControls(bool shown); void updateWideControlsVisibility(); [[nodiscard]] bool videoButtonInNarrowMode() const; - [[nodiscard]] auto shareConferenceLinkCallback() - -> Fn finished)>; + [[nodiscard]] Fn shareConferenceLinkCallback(); void endCall(); diff --git a/Telegram/SourceFiles/data/data_group_call.cpp b/Telegram/SourceFiles/data/data_group_call.cpp index 6747b01b98..cb4b06cb32 100644 --- a/Telegram/SourceFiles/data/data_group_call.cpp +++ b/Telegram/SourceFiles/data/data_group_call.cpp @@ -295,6 +295,10 @@ rpl::producer GroupCall::fullCountValue() const { return _fullCount.value(); } +QString GroupCall::conferenceInviteLink() const { + return _conferenceInviteLink; +} + bool GroupCall::participantsLoaded() const { return _allParticipantsLoaded; } @@ -515,6 +519,7 @@ void GroupCall::applyCallFields(const MTPDgroupCall &data) { _unmutedVideoLimit = data.vunmuted_video_limit().v; _allParticipantsLoaded = (_serverParticipantsCount == _participants.size()); + _conferenceInviteLink = qs(data.vinvite_link().value_or_empty()); } void GroupCall::applyLocalUpdate( diff --git a/Telegram/SourceFiles/data/data_group_call.h b/Telegram/SourceFiles/data/data_group_call.h index dfce953e3f..f335e84680 100644 --- a/Telegram/SourceFiles/data/data_group_call.h +++ b/Telegram/SourceFiles/data/data_group_call.h @@ -176,6 +176,7 @@ public: [[nodiscard]] int fullCount() const; [[nodiscard]] rpl::producer fullCountValue() const; + [[nodiscard]] QString conferenceInviteLink() const; void setInCall(); void reload(); @@ -232,6 +233,7 @@ private: mtpRequestId _reloadRequestId = 0; crl::time _reloadLastFinished = 0; rpl::variable _title; + QString _conferenceInviteLink; base::flat_multi_map< std::pair, diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index a24382b82e..d925d12787 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -116,7 +116,7 @@ int AppConfig::confcallSizeLimit() const { bool AppConfig::confcallPrioritizeVP8() const { AssertIsDebug(); - return true; + return false; return get(u"confcall_use_vp8"_q, false); } diff --git a/Telegram/SourceFiles/mtproto/scheme/api.tl b/Telegram/SourceFiles/mtproto/scheme/api.tl index 9b1250e1b7..af06c44507 100644 --- a/Telegram/SourceFiles/mtproto/scheme/api.tl +++ b/Telegram/SourceFiles/mtproto/scheme/api.tl @@ -1342,7 +1342,7 @@ peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats; groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall; -groupCall#d597650c flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int = GroupCall; +groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall; inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall; inputGroupCallSlug#fe06823f slug:string = InputGroupCall; @@ -2587,7 +2587,7 @@ phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhon phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool; phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool; phone.createGroupCall#48cdc6d8 flags:# rtmp_stream:flags.2?true peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates; -phone.joinGroupCall#dac17b9e flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string public_key:flags.3?int256 block:flags.3?bytes invite_msg_id:flags.4?int params:DataJSON = Updates; +phone.joinGroupCall#8fb53057 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string public_key:flags.3?int256 block:flags.3?bytes params:DataJSON = Updates; phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates; phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector = Updates; phone.discardGroupCall#7a777135 call:InputGroupCall = Updates; @@ -2608,7 +2608,7 @@ phone.leaveGroupCallPresentation#1c50d144 call:InputGroupCall = Updates; phone.getGroupCallStreamChannels#1ab21940 call:InputGroupCall = phone.GroupCallStreamChannels; phone.getGroupCallStreamRtmpUrl#deb3abbf peer:InputPeer revoke:Bool = phone.GroupCallStreamRtmpUrl; phone.saveCallLog#41248786 peer:InputPhoneCall file:InputFile = Bool; -phone.createConferenceCall#fbcefee6 random_id:int = phone.GroupCall; +phone.createConferenceCall#7d0444bb flags:# muted:flags.0?true video_stopped:flags.2?true join:flags.3?true random_id:int public_key:flags.3?int256 block:flags.3?bytes params:flags.3?DataJSON = Updates; phone.deleteConferenceCallParticipants#8ca60525 flags:# only_left:flags.0?true kick:flags.1?true call:InputGroupCall ids:Vector block:bytes = Updates; phone.sendConferenceCallBroadcast#c6701900 call:InputGroupCall block:bytes = Updates; phone.inviteConferenceCallParticipant#bcf22685 flags:# video:flags.0?true call:InputGroupCall user_id:InputUser = Updates; diff --git a/Telegram/SourceFiles/window/window_main_menu.cpp b/Telegram/SourceFiles/window/window_main_menu.cpp index 189adccc03..97256293bb 100644 --- a/Telegram/SourceFiles/window/window_main_menu.cpp +++ b/Telegram/SourceFiles/window/window_main_menu.cpp @@ -128,8 +128,8 @@ constexpr auto kPlayStatusLimit = 2; return; } *creating = true; - const auto finished = [=](QString link) { - if (link.isEmpty()) { + const auto finished = [=](bool ok) { + if (!ok) { *creating = false; } else if (const auto onstack = done) { onstack();