Automatically update order of inactive group call participants.
This commit is contained in:
parent
24535d2aba
commit
eb7a1286ab
@ -687,6 +687,9 @@ struct GroupCallManager::PendingJoinRequest {
|
|||||||
};
|
};
|
||||||
|
|
||||||
GroupCallManager::GroupCallManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
GroupCallManager::GroupCallManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) {
|
||||||
|
update_group_call_participant_order_timeout_.set_callback(on_update_group_call_participant_order_timeout_callback);
|
||||||
|
update_group_call_participant_order_timeout_.set_callback_data(static_cast<void *>(this));
|
||||||
|
|
||||||
check_group_call_is_joined_timeout_.set_callback(on_check_group_call_is_joined_timeout_callback);
|
check_group_call_is_joined_timeout_.set_callback(on_check_group_call_is_joined_timeout_callback);
|
||||||
check_group_call_is_joined_timeout_.set_callback_data(static_cast<void *>(this));
|
check_group_call_is_joined_timeout_.set_callback_data(static_cast<void *>(this));
|
||||||
|
|
||||||
@ -706,6 +709,43 @@ void GroupCallManager::tear_down() {
|
|||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GroupCallManager::on_update_group_call_participant_order_timeout_callback(void *group_call_manager_ptr,
|
||||||
|
int64 group_call_id_int) {
|
||||||
|
if (G()->close_flag()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto group_call_manager = static_cast<GroupCallManager *>(group_call_manager_ptr);
|
||||||
|
send_closure_later(group_call_manager->actor_id(group_call_manager),
|
||||||
|
&GroupCallManager::on_update_group_call_participant_order_timeout,
|
||||||
|
GroupCallId(narrow_cast<int32>(group_call_id_int)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroupCallManager::on_update_group_call_participant_order_timeout(GroupCallId group_call_id) {
|
||||||
|
if (G()->close_flag()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG(INFO) << "Receive update group call participant order timeout in " << group_call_id;
|
||||||
|
auto input_group_call_id = get_input_group_call_id(group_call_id).move_as_ok();
|
||||||
|
|
||||||
|
if (!need_group_call_participants(input_group_call_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool can_manage = can_manage_group_call(input_group_call_id);
|
||||||
|
auto *participants = add_group_call_participants(input_group_call_id);
|
||||||
|
for (auto &participant : participants->participants) {
|
||||||
|
auto new_order = get_real_participant_order(can_manage, participant, participants->min_order);
|
||||||
|
if (new_order != participant.order) {
|
||||||
|
participant.order = new_order;
|
||||||
|
send_update_group_call_participant(input_group_call_id, participant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_group_call_participant_order_timeout_.set_timeout_in(group_call_id.get(),
|
||||||
|
UPDATE_GROUP_CALL_PARTICIPANT_ORDER_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
||||||
void GroupCallManager::on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr,
|
void GroupCallManager::on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr,
|
||||||
int64 group_call_id_int) {
|
int64 group_call_id_int) {
|
||||||
if (G()->close_flag()) {
|
if (G()->close_flag()) {
|
||||||
@ -1650,6 +1690,11 @@ void GroupCallManager::process_group_call_participants(
|
|||||||
send_update_group_call_participant(input_group_call_id, participant);
|
send_update_group_call_participant(input_group_call_id, participant);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto *group_call = get_group_call(input_group_call_id);
|
||||||
|
CHECK(group_call != nullptr && group_call->is_inited);
|
||||||
|
update_group_call_participant_order_timeout_.add_timeout_in(group_call->group_call_id.get(),
|
||||||
|
UPDATE_GROUP_CALL_PARTICIPANT_ORDER_TIMEOUT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2931,6 +2976,10 @@ void GroupCallManager::try_clear_group_call_participants(InputGroupCallId input_
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto group_call = get_group_call(input_group_call_id);
|
||||||
|
if (group_call != nullptr) {
|
||||||
|
update_group_call_participant_order_timeout_.cancel_timeout(group_call->group_call_id.get());
|
||||||
|
}
|
||||||
remove_recent_group_call_speaker(input_group_call_id, DialogId(td_->contacts_manager_->get_my_id()));
|
remove_recent_group_call_speaker(input_group_call_id, DialogId(td_->contacts_manager_->get_my_id()));
|
||||||
|
|
||||||
auto participants_it = group_call_participants_.find(input_group_call_id);
|
auto participants_it = group_call_participants_.find(input_group_call_id);
|
||||||
@ -2942,7 +2991,6 @@ void GroupCallManager::try_clear_group_call_participants(InputGroupCallId input_
|
|||||||
CHECK(participants != nullptr);
|
CHECK(participants != nullptr);
|
||||||
group_call_participants_.erase(participants_it);
|
group_call_participants_.erase(participants_it);
|
||||||
|
|
||||||
auto group_call = get_group_call(input_group_call_id);
|
|
||||||
CHECK(group_call != nullptr && group_call->is_inited);
|
CHECK(group_call != nullptr && group_call->is_inited);
|
||||||
LOG(INFO) << "Clear participants in " << input_group_call_id << " from " << group_call->dialog_id;
|
LOG(INFO) << "Clear participants in " << input_group_call_id << " from " << group_call->dialog_id;
|
||||||
if (group_call->loaded_all_participants) {
|
if (group_call->loaded_all_participants) {
|
||||||
|
@ -119,12 +119,18 @@ class GroupCallManager : public Actor {
|
|||||||
struct PendingJoinRequest;
|
struct PendingJoinRequest;
|
||||||
|
|
||||||
static constexpr int32 RECENT_SPEAKER_TIMEOUT = 60 * 60;
|
static constexpr int32 RECENT_SPEAKER_TIMEOUT = 60 * 60;
|
||||||
|
static constexpr int32 UPDATE_GROUP_CALL_PARTICIPANT_ORDER_TIMEOUT = 10;
|
||||||
static constexpr int32 CHECK_GROUP_CALL_IS_JOINED_TIMEOUT = 10;
|
static constexpr int32 CHECK_GROUP_CALL_IS_JOINED_TIMEOUT = 10;
|
||||||
static constexpr size_t MAX_TITLE_LENGTH = 64; // server side limit for group call title length
|
static constexpr size_t MAX_TITLE_LENGTH = 64; // server side limit for group call title length
|
||||||
static constexpr size_t MAX_RECORD_TITLE_LENGTH = 128; // server side limit for group call record title length
|
static constexpr size_t MAX_RECORD_TITLE_LENGTH = 128; // server side limit for group call record title length
|
||||||
|
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
||||||
|
static void on_update_group_call_participant_order_timeout_callback(void *group_call_manager_ptr,
|
||||||
|
int64 group_call_id_int);
|
||||||
|
|
||||||
|
void on_update_group_call_participant_order_timeout(GroupCallId group_call_id);
|
||||||
|
|
||||||
static void on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr, int64 group_call_id_int);
|
static void on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr, int64 group_call_id_int);
|
||||||
|
|
||||||
void on_check_group_call_is_joined_timeout(GroupCallId group_call_id);
|
void on_check_group_call_is_joined_timeout(GroupCallId group_call_id);
|
||||||
@ -315,6 +321,7 @@ class GroupCallManager : public Actor {
|
|||||||
|
|
||||||
uint64 toggle_is_hand_raised_generation_ = 0;
|
uint64 toggle_is_hand_raised_generation_ = 0;
|
||||||
|
|
||||||
|
MultiTimeout update_group_call_participant_order_timeout_{"UpdateGroupCallParticipantOrderTimeout"};
|
||||||
MultiTimeout check_group_call_is_joined_timeout_{"CheckGroupCallIsJoinedTimeout"};
|
MultiTimeout check_group_call_is_joined_timeout_{"CheckGroupCallIsJoinedTimeout"};
|
||||||
MultiTimeout pending_send_speaking_action_timeout_{"PendingSendSpeakingActionTimeout"};
|
MultiTimeout pending_send_speaking_action_timeout_{"PendingSendSpeakingActionTimeout"};
|
||||||
MultiTimeout recent_speaker_update_timeout_{"RecentSpeakerUpdateTimeout"};
|
MultiTimeout recent_speaker_update_timeout_{"RecentSpeakerUpdateTimeout"};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user