From e5ac7a141619f2b9d13831c293d3cf8153c7f265 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 12 Apr 2021 15:36:19 +0400 Subject: [PATCH] Fix creating a scheduled voice chat. --- .../SourceFiles/calls/calls_group_call.cpp | 20 +++++++++++-------- Telegram/SourceFiles/calls/calls_instance.cpp | 16 +++++++-------- Telegram/SourceFiles/data/data_channel.cpp | 7 +++++-- Telegram/SourceFiles/data/data_channel.h | 4 +++- Telegram/SourceFiles/data/data_chat.cpp | 7 +++++-- Telegram/SourceFiles/data/data_chat.h | 4 +++- Telegram/SourceFiles/data/data_group_call.cpp | 6 ++++-- Telegram/SourceFiles/data/data_group_call.h | 6 +++++- Telegram/SourceFiles/history/history.cpp | 19 +++++++++--------- 9 files changed, 55 insertions(+), 34 deletions(-) diff --git a/Telegram/SourceFiles/calls/calls_group_call.cpp b/Telegram/SourceFiles/calls/calls_group_call.cpp index c91a720b9c..050f2cc423 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/calls_group_call.cpp @@ -406,13 +406,6 @@ void GroupCall::join(const MTPInputGroupCall &inputCall) { _accessHash = data.vaccess_hash().v; }); setState(_scheduleDate ? State::Waiting : State::Joining); - if (const auto chat = _peer->asChat()) { - chat->setGroupCall(inputCall); - } else if (const auto group = _peer->asChannel()) { - group->setGroupCall(inputCall); - } else { - Unexpected("Peer type in GroupCall::join."); - } if (_scheduleDate) { return; @@ -835,7 +828,18 @@ void GroupCall::handlePossibleCreateOrJoinResponse( } if (_acceptFields) { if (!_instance && !_id) { - join(MTP_inputGroupCall(data.vid(), data.vaccess_hash())); + const auto input = MTP_inputGroupCall( + data.vid(), + data.vaccess_hash()); + const auto scheduleDate = data.vschedule_date().value_or_empty(); + if (const auto chat = _peer->asChat()) { + chat->setGroupCall(input, scheduleDate); + } else if (const auto group = _peer->asChannel()) { + group->setGroupCall(input, scheduleDate); + } else { + Unexpected("Peer type in GroupCall::join."); + } + join(input); } return; } else if (_id != data.vid().v || !_instance) { diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index 014e3763ff..af869bd63f 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -411,6 +411,14 @@ void Instance::handleCallUpdate( void Instance::handleGroupCallUpdate( not_null session, const MTPUpdate &update) { + if (_currentGroupCall + && (&_currentGroupCall->peer()->session() == session)) { + update.match([&](const MTPDupdateGroupCall &data) { + _currentGroupCall->handlePossibleCreateOrJoinResponse(data); + }, [](const auto &) { + }); + } + const auto callId = update.match([](const MTPDupdateGroupCall &data) { return data.vcall().match([](const auto &data) { return data.vid().v; @@ -427,14 +435,6 @@ void Instance::handleGroupCallUpdate( } else { applyGroupCallUpdateChecked(session, update); } - - if (_currentGroupCall - && (&_currentGroupCall->peer()->session() == session)) { - update.match([&](const MTPDupdateGroupCall &data) { - _currentGroupCall->handlePossibleCreateOrJoinResponse(data); - }, [](const auto &) { - }); - } } void Instance::applyGroupCallUpdateChecked( diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index 09a07acde6..8fbd8460e6 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -697,7 +697,9 @@ void ChannelData::migrateCall(std::unique_ptr call) { addFlags(MTPDchannel::Flag::f_call_active); } -void ChannelData::setGroupCall(const MTPInputGroupCall &call) { +void ChannelData::setGroupCall( + const MTPInputGroupCall &call, + TimeId scheduleDate) { call.match([&](const MTPDinputGroupCall &data) { if (_call && _call->id() == data.vid().v) { return; @@ -714,7 +716,8 @@ void ChannelData::setGroupCall(const MTPInputGroupCall &call) { _call = std::make_unique( this, data.vid().v, - data.vaccess_hash().v); + data.vaccess_hash().v, + scheduleDate); owner().registerGroupCall(_call.get()); session().changes().peerUpdated(this, UpdateFlag::GroupCall); addFlags(MTPDchannel::Flag::f_call_active); diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index 5047e223d8..5987ef7a4f 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -410,7 +410,9 @@ public: return _call.get(); } void migrateCall(std::unique_ptr call); - void setGroupCall(const MTPInputGroupCall &call); + void setGroupCall( + const MTPInputGroupCall &call, + TimeId scheduleDate = 0); void clearGroupCall(); void setGroupCallDefaultJoinAs(PeerId peerId); [[nodiscard]] PeerId groupCallDefaultJoinAs() const; diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index 05770570ca..e01bc6ed5d 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -194,7 +194,9 @@ void ChatData::setMigrateToChannel(ChannelData *channel) { } } -void ChatData::setGroupCall(const MTPInputGroupCall &call) { +void ChatData::setGroupCall( + const MTPInputGroupCall &call, + TimeId scheduleDate) { if (migrateTo()) { return; } @@ -214,7 +216,8 @@ void ChatData::setGroupCall(const MTPInputGroupCall &call) { _call = std::make_unique( this, data.vid().v, - data.vaccess_hash().v); + data.vaccess_hash().v, + scheduleDate); owner().registerGroupCall(_call.get()); session().changes().peerUpdated(this, UpdateFlag::GroupCall); addFlags(MTPDchat::Flag::f_call_active); diff --git a/Telegram/SourceFiles/data/data_chat.h b/Telegram/SourceFiles/data/data_chat.h index 35ba2b0896..0c7df890d1 100644 --- a/Telegram/SourceFiles/data/data_chat.h +++ b/Telegram/SourceFiles/data/data_chat.h @@ -166,7 +166,9 @@ public: [[nodiscard]] Data::GroupCall *groupCall() const { return _call.get(); } - void setGroupCall(const MTPInputGroupCall &call); + void setGroupCall( + const MTPInputGroupCall &call, + TimeId scheduleDate = 0); void clearGroupCall(); void setGroupCallDefaultJoinAs(PeerId peerId); [[nodiscard]] PeerId groupCallDefaultJoinAs() const; diff --git a/Telegram/SourceFiles/data/data_group_call.cpp b/Telegram/SourceFiles/data/data_group_call.cpp index b920a31d75..1ec22213c6 100644 --- a/Telegram/SourceFiles/data/data_group_call.cpp +++ b/Telegram/SourceFiles/data/data_group_call.cpp @@ -38,12 +38,14 @@ constexpr auto kWaitForUpdatesTimeout = 3 * crl::time(1000); GroupCall::GroupCall( not_null peer, uint64 id, - uint64 accessHash) + uint64 accessHash, + TimeId scheduleDate) : _id(id) , _accessHash(accessHash) , _peer(peer) , _reloadByQueuedUpdatesTimer([=] { reload(); }) -, _speakingByActiveFinishTimer([=] { checkFinishSpeakingByActive(); }) { +, _speakingByActiveFinishTimer([=] { checkFinishSpeakingByActive(); }) +, _scheduleDate(scheduleDate) { } GroupCall::~GroupCall() { diff --git a/Telegram/SourceFiles/data/data_group_call.h b/Telegram/SourceFiles/data/data_group_call.h index 3742ddedc6..078f5634e0 100644 --- a/Telegram/SourceFiles/data/data_group_call.h +++ b/Telegram/SourceFiles/data/data_group_call.h @@ -38,7 +38,11 @@ struct GroupCallParticipant { class GroupCall final { public: - GroupCall(not_null peer, uint64 id, uint64 accessHash); + GroupCall( + not_null peer, + uint64 id, + uint64 accessHash, + TimeId scheduleDate); ~GroupCall(); [[nodiscard]] uint64 id() const; diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index fe4a62a982..ff82aab2d6 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -856,13 +856,6 @@ void History::applyServiceChanges( not_null item, const MTPDmessageService &data) { const auto replyTo = data.vreply_to(); - const auto setGroupCallFrom = [&](const auto &data) { - if (const auto channel = peer->asChannel()) { - channel->setGroupCall(data.vcall()); - } else if (const auto chat = peer->asChat()) { - chat->setGroupCall(data.vcall()); - } - }; data.vaction().match([&](const MTPDmessageActionChatAddUser &data) { if (const auto megagroup = peer->asMegagroup()) { const auto mgInfo = megagroup->mgInfo.get(); @@ -1015,9 +1008,17 @@ void History::applyServiceChanges( }); } }, [&](const MTPDmessageActionGroupCall &data) { - setGroupCallFrom(data); + if (const auto channel = peer->asChannel()) { + channel->setGroupCall(data.vcall()); + } else if (const auto chat = peer->asChat()) { + chat->setGroupCall(data.vcall()); + } }, [&](const MTPDmessageActionGroupCallScheduled &data) { - setGroupCallFrom(data); + if (const auto channel = peer->asChannel()) { + channel->setGroupCall(data.vcall(), data.vschedule_date().v); + } else if (const auto chat = peer->asChat()) { + chat->setGroupCall(data.vcall(), data.vschedule_date().v); + } }, [&](const MTPDmessageActionPaymentSent &data) { if (const auto payment = item->Get()) { if (const auto message = payment->msg) {