Support different order of group call participants for administrators.

This commit is contained in:
levlam 2021-03-15 19:32:33 +03:00
parent 0a4f1c15b8
commit 24535d2aba
4 changed files with 18 additions and 11 deletions

View File

@ -1537,8 +1537,8 @@ void GroupCallManager::on_sync_group_call_participants_failed(InputGroupCallId i
}
GroupCallParticipantOrder GroupCallManager::get_real_participant_order(
const GroupCallParticipant &participant, const GroupCallParticipantOrder &min_order) const {
auto real_order = participant.get_real_order();
bool can_manage, const GroupCallParticipant &participant, const GroupCallParticipantOrder &min_order) const {
auto real_order = participant.get_real_order(can_manage);
if (real_order >= min_order) {
return real_order;
}
@ -1576,6 +1576,7 @@ void GroupCallManager::process_group_call_participants(
}
auto min_order = GroupCallParticipantOrder::max();
bool can_manage = can_manage_group_call(input_group_call_id);
for (auto &participant : participants) {
GroupCallParticipant group_call_participant(participant);
if (!group_call_participant.is_valid()) {
@ -1587,7 +1588,7 @@ void GroupCallManager::process_group_call_participants(
continue;
}
auto real_order = group_call_participant.get_real_order();
auto real_order = group_call_participant.get_real_order(can_manage);
if (real_order > min_order) {
LOG(ERROR) << "Receive call participant with order " << real_order << " after call participant with order "
<< min_order;
@ -1642,7 +1643,7 @@ void GroupCallManager::process_group_call_participants(
participants_it->second->min_order = min_order;
for (auto &participant : participants_it->second->participants) {
auto real_order = get_real_participant_order(participant, min_order);
auto real_order = get_real_participant_order(can_manage, participant, min_order);
if (old_min_order > real_order && real_order >= min_order) {
CHECK(!participant.order.is_valid() || participant.order == old_min_order);
participant.order = real_order;
@ -1718,7 +1719,7 @@ int GroupCallManager::process_group_call_participant(InputGroupCallId input_grou
participant.update_from(old_participant);
participant.is_just_joined = false;
participant.order = get_real_participant_order(participant, participants->min_order);
participant.order = get_real_participant_order(can_manage, participant, participants->min_order);
update_group_call_participant_can_be_muted(can_manage, participants, participant);
LOG(INFO) << "Edit " << old_participant << " to " << participant;
@ -1744,7 +1745,7 @@ int GroupCallManager::process_group_call_participant(InputGroupCallId input_grou
} else {
LOG(INFO) << "Receive new " << participant;
}
participant.order = get_real_participant_order(participant, participants->min_order);
participant.order = get_real_participant_order(can_manage, participant, participants->min_order);
participant.is_just_joined = false;
update_group_call_participant_can_be_muted(can_manage, participants, participant);
participants->participants.push_back(std::move(participant));
@ -3315,7 +3316,8 @@ DialogId GroupCallManager::set_group_call_participant_is_speaking_by_source(Inpu
if (is_speaking) {
participant.local_active_date = max(participant.local_active_date, date);
}
participant.order = get_real_participant_order(participant, participants_it->second->min_order);
bool can_manage = can_manage_group_call(input_group_call_id);
participant.order = get_real_participant_order(can_manage, participant, participants_it->second->min_order);
if (participant.order.is_valid()) {
send_update_group_call_participant(input_group_call_id, participant);
}

View File

@ -180,7 +180,7 @@ class GroupCallManager : public Actor {
void on_sync_group_call_participants_failed(InputGroupCallId input_group_call_id);
GroupCallParticipantOrder get_real_participant_order(const GroupCallParticipant &participant,
GroupCallParticipantOrder get_real_participant_order(bool can_manage, const GroupCallParticipant &participant,
const GroupCallParticipantOrder &min_order) const;
void process_group_call_participants(InputGroupCallId group_call_id,

View File

@ -6,6 +6,7 @@
//
#include "td/telegram/GroupCallParticipant.h"
#include "td/telegram/Global.h"
#include "td/telegram/MessagesManager.h"
#include "td/telegram/Td.h"
@ -56,8 +57,12 @@ bool GroupCallParticipant::is_versioned_update(const tl_object_ptr<telegram_api:
return participant->just_joined_ || participant->left_ || participant->versioned_;
}
GroupCallParticipantOrder GroupCallParticipant::get_real_order() const {
return GroupCallParticipantOrder(max(active_date, local_active_date), 0, joined_date);
GroupCallParticipantOrder GroupCallParticipant::get_real_order(bool can_manage) const {
auto date = td::max(active_date, local_active_date);
if (date < G()->unix_time() - 300) {
date = 0;
}
return GroupCallParticipantOrder(date, can_manage ? raise_hand_rating : 0, joined_date);
}
bool GroupCallParticipant::get_is_muted_by_themselves() const {

View File

@ -72,7 +72,7 @@ struct GroupCallParticipant {
bool set_pending_is_muted(bool is_muted, bool can_manage, bool is_admin);
GroupCallParticipantOrder get_real_order() const;
GroupCallParticipantOrder get_real_order(bool can_manage) const;
bool is_valid() const {
return dialog_id.is_valid();