diff --git a/td/telegram/GroupCallManager.cpp b/td/telegram/GroupCallManager.cpp index 904b6c504..2cb0b371d 100644 --- a/td/telegram/GroupCallManager.cpp +++ b/td/telegram/GroupCallManager.cpp @@ -1079,6 +1079,7 @@ int GroupCallManager::process_group_call_participant(InputGroupCallId input_grou if (old_participant.order != 0) { send_update_group_call_participant(input_group_call_id, participant); } + remove_recent_group_call_speaker(input_group_call_id, participant.user_id); participants->participants.erase(participants->participants.begin() + i); return -1; } @@ -1112,6 +1113,7 @@ int GroupCallManager::process_group_call_participant(InputGroupCallId input_grou if (participant.joined_date == 0) { // unknown removed participant + remove_recent_group_call_speaker(input_group_call_id, participant.user_id); return -1; } @@ -1768,6 +1770,29 @@ void GroupCallManager::on_user_speaking_in_group_call(GroupCallId group_call_id, on_group_call_recent_speakers_updated(group_call, recent_speakers.get()); } +void GroupCallManager::remove_recent_group_call_speaker(InputGroupCallId input_group_call_id, UserId user_id) { + auto *group_call = get_group_call(input_group_call_id); + if (group_call != nullptr && group_call->is_inited && !group_call->is_active) { + return; + } + + auto recent_speakers_it = group_call_recent_speakers_.find(group_call->group_call_id); + if (recent_speakers_it == group_call_recent_speakers_.end()) { + return; + } + auto &recent_speakers = recent_speakers_it->second; + CHECK(recent_speakers != nullptr); + for (size_t i = 0; i < recent_speakers->users.size(); i++) { + if (recent_speakers->users[i].first == user_id) { + LOG(INFO) << "Remove " << user_id << " from recent speakers in " << input_group_call_id << " from " + << group_call->dialog_id; + recent_speakers->users.erase(recent_speakers->users.begin() + i); + on_group_call_recent_speakers_updated(group_call, recent_speakers.get()); + return; + } + } +} + void GroupCallManager::on_group_call_recent_speakers_updated(const GroupCall *group_call, GroupCallRecentSpeakers *recent_speakers) { if (group_call == nullptr || !group_call->is_inited || recent_speakers->is_changed) { diff --git a/td/telegram/GroupCallManager.h b/td/telegram/GroupCallManager.h index e3b27b61e..fee2e18a2 100644 --- a/td/telegram/GroupCallManager.h +++ b/td/telegram/GroupCallManager.h @@ -144,6 +144,8 @@ class GroupCallManager : public Actor { void on_receive_group_call_version(InputGroupCallId input_group_call_id, int32 version); + void remove_recent_group_call_speaker(InputGroupCallId input_group_call_id, UserId user_id); + void on_group_call_recent_speakers_updated(const GroupCall *group_call, GroupCallRecentSpeakers *recent_speakers); UserId set_group_call_participant_is_speaking_by_source(InputGroupCallId input_group_call_id, int32 source,