Fix discarded group call handle.

This commit is contained in:
John Preston 2021-03-19 00:57:16 +04:00
parent 9cfbccf9e7
commit ba41da7b28
4 changed files with 27 additions and 11 deletions

View file

@ -722,7 +722,8 @@ void GroupCall::handlePossibleCreateOrJoinResponse(
const MTPDupdateGroupCall &data) {
data.vcall().match([&](const MTPDgroupCall &data) {
handlePossibleCreateOrJoinResponse(data);
}, [](const MTPDgroupCallDiscarded &data) {
}, [&](const MTPDgroupCallDiscarded &data) {
handlePossibleDiscarded(data);
});
}
@ -815,6 +816,14 @@ void GroupCall::handlePossibleCreateOrJoinResponse(
});
}
void GroupCall::handlePossibleDiscarded(const MTPDgroupCallDiscarded &data) {
if (data.vid().v == _id) {
LOG(("Call Info: Hangup after groupCallDiscarded."));
_mySsrc = 0;
hangup();
}
}
void GroupCall::addParticipantsToInstance() {
const auto real = _peer->groupCall();
if (!real
@ -869,10 +878,7 @@ void GroupCall::handleUpdate(const MTPUpdate &update) {
void GroupCall::handleUpdate(const MTPDupdateGroupCall &data) {
data.vcall().match([](const MTPDgroupCall &) {
}, [&](const MTPDgroupCallDiscarded &data) {
if (data.vid().v == _id) {
_mySsrc = 0;
hangup();
}
handlePossibleDiscarded(data);
});
}
@ -1129,7 +1135,8 @@ void GroupCall::broadcastPartStart(std::shared_ptr<LoadPartTask> task) {
});
});
}).fail([=](const MTP::Error &error, const MTP::Response &response) {
if (error.type() == u"GROUPCALL_JOIN_MISSING"_q) {
if (error.type() == u"GROUPCALL_JOIN_MISSING"_q
|| error.type() == u"GROUPCALL_FORBIDDEN"_q) {
for (const auto &[task, part] : _broadcastParts) {
_api.request(part.requestId).cancel();
}

View file

@ -228,6 +228,7 @@ private:
};
void handlePossibleCreateOrJoinResponse(const MTPDgroupCall &data);
void handlePossibleDiscarded(const MTPDgroupCallDiscarded &data);
void handleUpdate(const MTPDupdateGroupCall &data);
void handleUpdate(const MTPDupdateGroupCallParticipants &data);
void handleRequestError(const MTP::Error &error);

View file

@ -218,7 +218,7 @@ void GroupCall::enqueueUpdate(const MTPUpdate &update) {
_queuedUpdates.emplace(std::pair{ version, type }, update);
}
}, [&](const MTPDgroupCallDiscarded &data) {
discard();
discard(data);
});
}, [&](const MTPDupdateGroupCallParticipants &updateData) {
const auto version = updateData.vversion().v;
@ -255,7 +255,7 @@ void GroupCall::enqueueUpdate(const MTPUpdate &update) {
processQueuedUpdates();
}
void GroupCall::discard() {
void GroupCall::discard(const MTPDgroupCallDiscarded &data) {
const auto id = _id;
const auto peer = _peer;
crl::on_main(&peer->session(), [=] {
@ -267,6 +267,14 @@ void GroupCall::discard() {
}
}
});
Core::App().calls().applyGroupCallUpdateChecked(
&peer->session(),
MTP_updateGroupCall(
MTP_int(peer->bareId()),
MTP_groupCallDiscarded(
data.vid(),
data.vaccess_hash(),
data.vduration())));
}
void GroupCall::processFullCallUsersChats(const MTPphone_GroupCall &call) {
@ -293,7 +301,7 @@ void GroupCall::processFullCallFields(const MTPphone_GroupCall &call) {
applyCallFields(data);
}, [&](const MTPDgroupCallDiscarded &data) {
discard();
discard(data);
});
});
}
@ -343,7 +351,7 @@ void GroupCall::applyEnqueuedUpdate(const MTPUpdate &update) {
applyCallFields(data);
computeParticipantsCount();
}, [&](const MTPDgroupCallDiscarded &data) {
discard();
discard(data);
});
}, [&](const MTPDupdateGroupCallParticipants &data) {
DEBUG_LOG(("Group Call Participants: "

View file

@ -120,7 +120,7 @@ private:
};
[[nodiscard]] ApiWrap &api() const;
void discard();
void discard(const MTPDgroupCallDiscarded &data);
[[nodiscard]] bool inCall() const;
void applyParticipantsSlice(
const QVector<MTPGroupCallParticipant> &list,