diff --git a/Telegram/SourceFiles/calls/calls_group_call.cpp b/Telegram/SourceFiles/calls/calls_group_call.cpp index 5f03074c1e..14bbe001d4 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/calls_group_call.cpp @@ -74,6 +74,28 @@ constexpr auto kPlayConnectingEach = crl::time(1056) + 2 * crl::time(1000); } // namespace +[[nodiscard]] bool IsGroupCallAdmin( + not_null peer, + not_null user) { + if (const auto chat = peer->asChat()) { + return chat->admins.contains(user) + || (chat->creator == user->bareId()); + } else if (const auto group = peer->asMegagroup()) { + if (const auto mgInfo = group->mgInfo.get()) { + if (mgInfo->creator == user) { + return true; + } + const auto i = mgInfo->lastAdmins.find(user); + if (i == mgInfo->lastAdmins.end()) { + return false; + } + const auto &rights = i->second.rights; + return rights.c_chatAdminRights().is_manage_call(); + } + } + return false; +} + GroupCall::GroupCall( not_null delegate, not_null peer, @@ -410,7 +432,12 @@ void GroupCall::applyParticipantLocally( if (!participant || !participant->ssrc) { return; } - const auto canSelfUnmute = participant->canSelfUnmute; + const auto canManageCall = _peer->canManageGroupCall(); + const auto isMuted = participant->muted || (mute && canManageCall); + const auto canSelfUnmute = !canManageCall + ? participant->canSelfUnmute + : (!mute || IsGroupCallAdmin(_peer, user)); + const auto isMutedByYou = mute && !canManageCall; const auto mutedCount = 0/*participant->mutedCount*/; using Flag = MTPDgroupCallParticipant::Flag; const auto flags = (canSelfUnmute ? Flag::f_can_self_unmute : Flag(0)) @@ -419,11 +446,8 @@ void GroupCall::applyParticipantLocally( ? Flag::f_volume_by_admin : Flag(0)) | (participant->lastActive ? Flag::f_active_date : Flag(0)) - | (!mute - ? Flag(0) - : _peer->canManageGroupCall() - ? Flag::f_muted - : Flag::f_muted_by_you); + | (isMuted ? Flag::f_muted : Flag(0)) + | (isMutedByYou ? Flag::f_muted_by_you : Flag(0)); _peer->groupCall()->applyUpdateChecked( MTP_updateGroupCallParticipants( inputCall(), diff --git a/Telegram/SourceFiles/calls/calls_group_call.h b/Telegram/SourceFiles/calls/calls_group_call.h index c038fd6c27..90d18839db 100644 --- a/Telegram/SourceFiles/calls/calls_group_call.h +++ b/Telegram/SourceFiles/calls/calls_group_call.h @@ -54,6 +54,10 @@ enum class MuteState { }); } +[[nodiscard]] bool IsGroupCallAdmin( + not_null peer, + not_null user); + struct LevelUpdate { uint32 ssrc = 0; float value = 0.; diff --git a/Telegram/SourceFiles/calls/calls_group_members.cpp b/Telegram/SourceFiles/calls/calls_group_members.cpp index 70939e9b0b..7229dad6a1 100644 --- a/Telegram/SourceFiles/calls/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/calls_group_members.cpp @@ -366,11 +366,7 @@ void Row::updateState(const Data::GroupCall::Participant *participant) { setSpeaking(false); } else if (!participant->muted || (participant->sounding && participant->ssrc != 0)) { - setState(participant->mutedByMe - ? State::MutedByMe - : (participant->sounding || participant->speaking) - ? State::Active - : State::Inactive); + setState(participant->mutedByMe ? State::MutedByMe : State::Active); setSounding(participant->sounding && participant->ssrc != 0); setSpeaking(participant->speaking && participant->ssrc != 0); } else if (participant->canSelfUnmute) { @@ -1287,26 +1283,7 @@ base::unique_qptr MembersController::createRowContextMenu( st::groupCallPopupMenu); const auto muteState = real->state(); - const auto admin = [&] { - if (const auto chat = _peer->asChat()) { - return chat->admins.contains(user) - || (chat->creator == user->bareId()); - } else if (const auto group = _peer->asMegagroup()) { - if (const auto mgInfo = group->mgInfo.get()) { - if (mgInfo->creator == user) { - return true; - } - const auto i = mgInfo->lastAdmins.find(user); - if (i == mgInfo->lastAdmins.end()) { - return false; - } - const auto &rights = i->second.rights; - return rights.c_chatAdminRights().is_manage_call(); - } - } - return false; - }(); - + const auto admin = IsGroupCallAdmin(_peer, user); const auto session = &user->session(); const auto getCurrentWindow = [=]() -> Window::SessionController* { if (const auto window = Core::App().activeWindow()) {