From d50fad615f93f310c1387449d8be5418fd7de3de Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 7 Apr 2025 13:30:58 +0400 Subject: [PATCH] Check confcall size limit. --- Telegram/Resources/langs/lang.strings | 1 + .../calls/group/calls_group_common.cpp | 12 ++++++------ .../calls/group/calls_group_common.h | 2 +- .../group/calls_group_invite_controller.cpp | 7 ++++--- .../calls/group/calls_group_panel.cpp | 5 ++++- Telegram/SourceFiles/data/data_group_call.h | 2 -- Telegram/SourceFiles/main/main_app_config.cpp | 7 +++++++ Telegram/SourceFiles/main/main_app_config.h | 1 + .../window/window_session_controller.cpp | 19 +++++++++++++------ 9 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 1c234f6755..173c80b597 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4959,6 +4959,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_confcall_invite_kicked_many#one" = "**{count} person** was removed from the call."; "lng_confcall_invite_kicked_many#other" = "**{count} people** were removed from the call."; "lng_confcall_not_accessible" = "This call is no longer accessible."; +"lng_confcall_participants_limit" = "This call reached the participants limit."; "lng_no_mic_permission" = "Telegram needs microphone access so that you can make calls and record voice messages."; diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.cpp b/Telegram/SourceFiles/calls/group/calls_group_common.cpp index f0e09c6f03..d313a030b0 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_common.cpp @@ -97,7 +97,7 @@ void ConferenceCallJoinConfirm( not_null box, std::shared_ptr call, UserData *maybeInviter, - Fn join) { + Fn close)> join) { box->setStyle(st::confcallJoinBox); box->setWidth(st::boxWideWidth); box->setNoContentMargin(true); @@ -223,11 +223,11 @@ void ConferenceCallJoinConfirm( )->setTryMakeSimilarLines(true); } const auto joinAndClose = [=] { - const auto weak = Ui::MakeWeak(box); - join(); - if (const auto strong = weak.data()) { - strong->closeBox(); - } + join([weak = Ui::MakeWeak(box)] { + if (const auto strong = weak.data()) { + strong->closeBox(); + } + }); }; Info::BotStarRef::AddFullWidthButton( box, diff --git a/Telegram/SourceFiles/calls/group/calls_group_common.h b/Telegram/SourceFiles/calls/group/calls_group_common.h index 93412787c0..ce06d3223c 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_common.h +++ b/Telegram/SourceFiles/calls/group/calls_group_common.h @@ -163,7 +163,7 @@ void ConferenceCallJoinConfirm( not_null box, std::shared_ptr call, UserData *maybeInviter, - Fn join); + Fn close)> join); struct ConferenceCallLinkStyleOverrides { const style::Box *box = nullptr; diff --git a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp index 876e24de95..1523857d56 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_invite_controller.cpp @@ -18,8 +18,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_group_call.h" #include "info/profile/info_profile_icon.h" -#include "main/main_session.h" #include "main/session/session_show.h" +#include "main/main_app_config.h" +#include "main/main_session.h" #include "ui/effects/ripple_animation.h" #include "ui/text/text_utilities.h" #include "ui/layers/generic_box.h" @@ -306,8 +307,8 @@ void ConfInviteController::toggleRowSelected( not_null row, bool video) { auto count = fullCount(); - auto limit = Data::kMaxConferenceMembers; - if (count < limit || row->checked()) { + const auto conferenceLimit = session().appConfig().confcallSizeLimit(); + if (count < conferenceLimit || row->checked()) { const auto real = static_cast(row.get()); if (!row->checked()) { real->setVideo(video); diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 138c92d06e..748438bb49 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -48,6 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_changes.h" #include "main/session/session_show.h" +#include "main/main_app_config.h" #include "main/main_session.h" #include "base/event_filter.h" #include "base/unixtime.h" @@ -1569,8 +1570,10 @@ void Panel::showMainMenu() { } void Panel::addMembers() { + const auto &appConfig = _call->peer()->session().appConfig(); + const auto conferenceLimit = appConfig.confcallSizeLimit(); if (_call->conference() - && _call->conferenceCall()->fullCount() >= Data::kMaxConferenceMembers) { + && _call->conferenceCall()->fullCount() >= conferenceLimit) { showToast({ tr::lng_group_call_invite_limit(tr::now) }); } const auto showToastCallback = [=](TextWithEntities &&text) { diff --git a/Telegram/SourceFiles/data/data_group_call.h b/Telegram/SourceFiles/data/data_group_call.h index da804a442a..dfce953e3f 100644 --- a/Telegram/SourceFiles/data/data_group_call.h +++ b/Telegram/SourceFiles/data/data_group_call.h @@ -30,8 +30,6 @@ namespace Data { [[nodiscard]] const std::string &RtmpEndpointId(); -inline constexpr auto kMaxConferenceMembers = 200; - struct LastSpokeTimes { crl::time anything = 0; crl::time voice = 0; diff --git a/Telegram/SourceFiles/main/main_app_config.cpp b/Telegram/SourceFiles/main/main_app_config.cpp index 26d4aecfb0..a24382b82e 100644 --- a/Telegram/SourceFiles/main/main_app_config.cpp +++ b/Telegram/SourceFiles/main/main_app_config.cpp @@ -108,9 +108,16 @@ int AppConfig::pinnedGiftsLimit() const { return get(u"stargifts_pinned_to_top_limit"_q, 6); } +int AppConfig::confcallSizeLimit() const { + return get( + u"conference_call_size_limit"_q, + _account->mtp().isTestMode() ? 5 : 100); +} + bool AppConfig::confcallPrioritizeVP8() const { AssertIsDebug(); return true; + return get(u"confcall_use_vp8"_q, false); } void AppConfig::refresh(bool force) { diff --git a/Telegram/SourceFiles/main/main_app_config.h b/Telegram/SourceFiles/main/main_app_config.h index a5a804cdcc..eac50671e0 100644 --- a/Telegram/SourceFiles/main/main_app_config.h +++ b/Telegram/SourceFiles/main/main_app_config.h @@ -79,6 +79,7 @@ public: [[nodiscard]] int pinnedGiftsLimit() const; + [[nodiscard]] int confcallSizeLimit() const; [[nodiscard]] bool confcallPrioritizeVP8() const; void refresh(bool force = false); diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 342313b3b6..d35e50f0b4 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -881,12 +881,19 @@ void SessionNavigation::resolveConferenceCall( data.vid().v, data.vaccess_hash().v); call->processFullCall(result); - const auto join = [=] { - Core::App().calls().startOrJoinConferenceCall({ - .call = call, - .linkSlug = slug, - .joinMessageId = inviteMsgId, - }); + const auto join = [=](Fn close) { + const auto &appConfig = call->peer()->session().appConfig(); + const auto conferenceLimit = appConfig.confcallSizeLimit(); + if (call->fullCount() >= conferenceLimit) { + showToast(tr::lng_confcall_participants_limit(tr::now)); + } else { + Core::App().calls().startOrJoinConferenceCall({ + .call = call, + .linkSlug = slug, + .joinMessageId = inviteMsgId, + }); + close(); + } }; const auto context = session().data().message(contextId); const auto inviter = context