Recent speakers fixes.
This commit is contained in:
parent
8dff5ed65b
commit
562742095d
|
@ -381,7 +381,7 @@ struct GroupCallManager::GroupCall {
|
||||||
|
|
||||||
struct GroupCallManager::GroupCallRecentSpeakers {
|
struct GroupCallManager::GroupCallRecentSpeakers {
|
||||||
vector<std::pair<UserId, int32>> users; // user + time; sorted by time
|
vector<std::pair<UserId, int32>> users; // user + time; sorted by time
|
||||||
bool is_changed = true;
|
bool is_changed = false;
|
||||||
vector<int32> last_sent_user_ids;
|
vector<int32> last_sent_user_ids;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -989,9 +989,9 @@ InputGroupCallId GroupCallManager::update_group_call(const tl_object_ptr<telegra
|
||||||
|
|
||||||
bool need_update = false;
|
bool need_update = false;
|
||||||
auto *group_call = add_group_call(call_id, channel_id);
|
auto *group_call = add_group_call(call_id, channel_id);
|
||||||
|
call.group_call_id = group_call->group_call_id;
|
||||||
call.channel_id = channel_id.is_valid() ? channel_id : group_call->channel_id;
|
call.channel_id = channel_id.is_valid() ? channel_id : group_call->channel_id;
|
||||||
if (!group_call->is_inited) {
|
if (!group_call->is_inited) {
|
||||||
call.group_call_id = group_call->group_call_id;
|
|
||||||
*group_call = std::move(call);
|
*group_call = std::move(call);
|
||||||
need_update = true;
|
need_update = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1070,6 +1070,8 @@ void GroupCallManager::on_user_speaking_in_group_call(GroupCallId group_call_id,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG(INFO) << "Add " << user_id << " as recent speaker at " << date << " in " << input_group_call_id << " from "
|
||||||
|
<< group_call->channel_id;
|
||||||
auto &recent_speakers = group_call_recent_speakers_[group_call_id];
|
auto &recent_speakers = group_call_recent_speakers_[group_call_id];
|
||||||
if (recent_speakers == nullptr) {
|
if (recent_speakers == nullptr) {
|
||||||
recent_speakers = make_unique<GroupCallRecentSpeakers>();
|
recent_speakers = make_unique<GroupCallRecentSpeakers>();
|
||||||
|
@ -1078,6 +1080,7 @@ void GroupCallManager::on_user_speaking_in_group_call(GroupCallId group_call_id,
|
||||||
for (size_t i = 0; i < recent_speakers->users.size(); i++) {
|
for (size_t i = 0; i < recent_speakers->users.size(); i++) {
|
||||||
if (recent_speakers->users[i].first == user_id) {
|
if (recent_speakers->users[i].first == user_id) {
|
||||||
if (recent_speakers->users[i].second >= date) {
|
if (recent_speakers->users[i].second >= date) {
|
||||||
|
LOG(INFO) << "Ignore outdated speaking information";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
recent_speakers->users[i].second = date;
|
recent_speakers->users[i].second = date;
|
||||||
|
@ -1089,14 +1092,17 @@ void GroupCallManager::on_user_speaking_in_group_call(GroupCallId group_call_id,
|
||||||
}
|
}
|
||||||
if (is_updated) {
|
if (is_updated) {
|
||||||
on_group_call_recent_speakers_updated(group_call, recent_speakers.get());
|
on_group_call_recent_speakers_updated(group_call, recent_speakers.get());
|
||||||
|
} else {
|
||||||
|
LOG(INFO) << "Position of " << user_id << " in recent speakers list didn't change";
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < recent_speakers->users.size(); i++) {
|
for (size_t i = 0; i <= recent_speakers->users.size(); i++) {
|
||||||
if (recent_speakers->users[i].second <= date) {
|
if (i == recent_speakers->users.size() || recent_speakers->users[i].second <= date) {
|
||||||
recent_speakers->users.insert(recent_speakers->users.begin() + i, {user_id, date});
|
recent_speakers->users.insert(recent_speakers->users.begin() + i, {user_id, date});
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static constexpr size_t MAX_RECENT_SPEAKERS = 3;
|
static constexpr size_t MAX_RECENT_SPEAKERS = 3;
|
||||||
|
@ -1110,11 +1116,13 @@ void GroupCallManager::on_user_speaking_in_group_call(GroupCallId group_call_id,
|
||||||
void GroupCallManager::on_group_call_recent_speakers_updated(const GroupCall *group_call,
|
void GroupCallManager::on_group_call_recent_speakers_updated(const GroupCall *group_call,
|
||||||
GroupCallRecentSpeakers *recent_speakers) {
|
GroupCallRecentSpeakers *recent_speakers) {
|
||||||
if (group_call == nullptr || !group_call->is_inited || recent_speakers->is_changed) {
|
if (group_call == nullptr || !group_call->is_inited || recent_speakers->is_changed) {
|
||||||
|
LOG(INFO) << "Don't need to send update of recent speakers in " << group_call->group_call_id;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
recent_speakers->is_changed = true;
|
recent_speakers->is_changed = true;
|
||||||
|
|
||||||
|
LOG(INFO) << "Schedule update of recent speakers in " << group_call->group_call_id;
|
||||||
const double MAX_RECENT_SPEAKER_UPDATE_DELAY = 0.5;
|
const double MAX_RECENT_SPEAKER_UPDATE_DELAY = 0.5;
|
||||||
recent_speaker_update_timeout_.set_timeout_in(group_call->group_call_id.get(), MAX_RECENT_SPEAKER_UPDATE_DELAY);
|
recent_speaker_update_timeout_.set_timeout_in(group_call->group_call_id.get(), MAX_RECENT_SPEAKER_UPDATE_DELAY);
|
||||||
}
|
}
|
||||||
|
@ -1130,6 +1138,7 @@ vector<int32> GroupCallManager::get_recent_speaker_user_ids(const GroupCall *gro
|
||||||
|
|
||||||
auto *recent_speakers = recent_speakers_it->second.get();
|
auto *recent_speakers = recent_speakers_it->second.get();
|
||||||
CHECK(recent_speakers != nullptr);
|
CHECK(recent_speakers != nullptr);
|
||||||
|
LOG(INFO) << "Found " << recent_speakers->users.size() << " recent speakers in " << group_call->group_call_id;
|
||||||
while (!recent_speakers->users.empty() &&
|
while (!recent_speakers->users.empty() &&
|
||||||
recent_speakers->users.back().second < G()->unix_time() - RECENT_SPEAKER_TIMEOUT) {
|
recent_speakers->users.back().second < G()->unix_time() - RECENT_SPEAKER_TIMEOUT) {
|
||||||
recent_speakers->users.pop_back();
|
recent_speakers->users.pop_back();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user