Fix creating a scheduled voice chat.

This commit is contained in:
John Preston 2021-04-12 15:36:19 +04:00
parent 99501d844d
commit e5ac7a1416
9 changed files with 55 additions and 34 deletions

View File

@ -406,13 +406,6 @@ void GroupCall::join(const MTPInputGroupCall &inputCall) {
_accessHash = data.vaccess_hash().v; _accessHash = data.vaccess_hash().v;
}); });
setState(_scheduleDate ? State::Waiting : State::Joining); 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) { if (_scheduleDate) {
return; return;
@ -835,7 +828,18 @@ void GroupCall::handlePossibleCreateOrJoinResponse(
} }
if (_acceptFields) { if (_acceptFields) {
if (!_instance && !_id) { 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; return;
} else if (_id != data.vid().v || !_instance) { } else if (_id != data.vid().v || !_instance) {

View File

@ -411,6 +411,14 @@ void Instance::handleCallUpdate(
void Instance::handleGroupCallUpdate( void Instance::handleGroupCallUpdate(
not_null<Main::Session*> session, not_null<Main::Session*> session,
const MTPUpdate &update) { 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) { const auto callId = update.match([](const MTPDupdateGroupCall &data) {
return data.vcall().match([](const auto &data) { return data.vcall().match([](const auto &data) {
return data.vid().v; return data.vid().v;
@ -427,14 +435,6 @@ void Instance::handleGroupCallUpdate(
} else { } else {
applyGroupCallUpdateChecked(session, update); applyGroupCallUpdateChecked(session, update);
} }
if (_currentGroupCall
&& (&_currentGroupCall->peer()->session() == session)) {
update.match([&](const MTPDupdateGroupCall &data) {
_currentGroupCall->handlePossibleCreateOrJoinResponse(data);
}, [](const auto &) {
});
}
} }
void Instance::applyGroupCallUpdateChecked( void Instance::applyGroupCallUpdateChecked(

View File

@ -697,7 +697,9 @@ void ChannelData::migrateCall(std::unique_ptr<Data::GroupCall> call) {
addFlags(MTPDchannel::Flag::f_call_active); 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) { call.match([&](const MTPDinputGroupCall &data) {
if (_call && _call->id() == data.vid().v) { if (_call && _call->id() == data.vid().v) {
return; return;
@ -714,7 +716,8 @@ void ChannelData::setGroupCall(const MTPInputGroupCall &call) {
_call = std::make_unique<Data::GroupCall>( _call = std::make_unique<Data::GroupCall>(
this, this,
data.vid().v, data.vid().v,
data.vaccess_hash().v); data.vaccess_hash().v,
scheduleDate);
owner().registerGroupCall(_call.get()); owner().registerGroupCall(_call.get());
session().changes().peerUpdated(this, UpdateFlag::GroupCall); session().changes().peerUpdated(this, UpdateFlag::GroupCall);
addFlags(MTPDchannel::Flag::f_call_active); addFlags(MTPDchannel::Flag::f_call_active);

View File

@ -410,7 +410,9 @@ public:
return _call.get(); return _call.get();
} }
void migrateCall(std::unique_ptr<Data::GroupCall> call); void migrateCall(std::unique_ptr<Data::GroupCall> call);
void setGroupCall(const MTPInputGroupCall &call); void setGroupCall(
const MTPInputGroupCall &call,
TimeId scheduleDate = 0);
void clearGroupCall(); void clearGroupCall();
void setGroupCallDefaultJoinAs(PeerId peerId); void setGroupCallDefaultJoinAs(PeerId peerId);
[[nodiscard]] PeerId groupCallDefaultJoinAs() const; [[nodiscard]] PeerId groupCallDefaultJoinAs() const;

View File

@ -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()) { if (migrateTo()) {
return; return;
} }
@ -214,7 +216,8 @@ void ChatData::setGroupCall(const MTPInputGroupCall &call) {
_call = std::make_unique<Data::GroupCall>( _call = std::make_unique<Data::GroupCall>(
this, this,
data.vid().v, data.vid().v,
data.vaccess_hash().v); data.vaccess_hash().v,
scheduleDate);
owner().registerGroupCall(_call.get()); owner().registerGroupCall(_call.get());
session().changes().peerUpdated(this, UpdateFlag::GroupCall); session().changes().peerUpdated(this, UpdateFlag::GroupCall);
addFlags(MTPDchat::Flag::f_call_active); addFlags(MTPDchat::Flag::f_call_active);

View File

@ -166,7 +166,9 @@ public:
[[nodiscard]] Data::GroupCall *groupCall() const { [[nodiscard]] Data::GroupCall *groupCall() const {
return _call.get(); return _call.get();
} }
void setGroupCall(const MTPInputGroupCall &call); void setGroupCall(
const MTPInputGroupCall &call,
TimeId scheduleDate = 0);
void clearGroupCall(); void clearGroupCall();
void setGroupCallDefaultJoinAs(PeerId peerId); void setGroupCallDefaultJoinAs(PeerId peerId);
[[nodiscard]] PeerId groupCallDefaultJoinAs() const; [[nodiscard]] PeerId groupCallDefaultJoinAs() const;

View File

@ -38,12 +38,14 @@ constexpr auto kWaitForUpdatesTimeout = 3 * crl::time(1000);
GroupCall::GroupCall( GroupCall::GroupCall(
not_null<PeerData*> peer, not_null<PeerData*> peer,
uint64 id, uint64 id,
uint64 accessHash) uint64 accessHash,
TimeId scheduleDate)
: _id(id) : _id(id)
, _accessHash(accessHash) , _accessHash(accessHash)
, _peer(peer) , _peer(peer)
, _reloadByQueuedUpdatesTimer([=] { reload(); }) , _reloadByQueuedUpdatesTimer([=] { reload(); })
, _speakingByActiveFinishTimer([=] { checkFinishSpeakingByActive(); }) { , _speakingByActiveFinishTimer([=] { checkFinishSpeakingByActive(); })
, _scheduleDate(scheduleDate) {
} }
GroupCall::~GroupCall() { GroupCall::~GroupCall() {

View File

@ -38,7 +38,11 @@ struct GroupCallParticipant {
class GroupCall final { class GroupCall final {
public: public:
GroupCall(not_null<PeerData*> peer, uint64 id, uint64 accessHash); GroupCall(
not_null<PeerData*> peer,
uint64 id,
uint64 accessHash,
TimeId scheduleDate);
~GroupCall(); ~GroupCall();
[[nodiscard]] uint64 id() const; [[nodiscard]] uint64 id() const;

View File

@ -856,13 +856,6 @@ void History::applyServiceChanges(
not_null<HistoryItem*> item, not_null<HistoryItem*> item,
const MTPDmessageService &data) { const MTPDmessageService &data) {
const auto replyTo = data.vreply_to(); 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) { data.vaction().match([&](const MTPDmessageActionChatAddUser &data) {
if (const auto megagroup = peer->asMegagroup()) { if (const auto megagroup = peer->asMegagroup()) {
const auto mgInfo = megagroup->mgInfo.get(); const auto mgInfo = megagroup->mgInfo.get();
@ -1015,9 +1008,17 @@ void History::applyServiceChanges(
}); });
} }
}, [&](const MTPDmessageActionGroupCall &data) { }, [&](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) { }, [&](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) { }, [&](const MTPDmessageActionPaymentSent &data) {
if (const auto payment = item->Get<HistoryServicePayment>()) { if (const auto payment = item->Get<HistoryServicePayment>()) {
if (const auto message = payment->msg) { if (const auto message = payment->msg) {