diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 666223191..7c152ada8 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1141,10 +1141,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_action_invite_users_and_one" = "{accumulated}, {user}"; "lng_action_invite_users_and_last" = "{accumulated} and {user}"; "lng_action_group_call_started_group" = "{from} started a voice chat"; -"lng_action_group_call_started_channel" = "Voice chat started"; +"lng_action_group_call_started_channel" = "Live stream started"; "lng_action_group_call_scheduled_group" = "{from} scheduled a voice chat for {date}"; -"lng_action_group_call_scheduled_channel" = "Voice chat scheduled for {date}"; -"lng_action_group_call_finished" = "Voice chat finished ({duration})"; +"lng_action_group_call_scheduled_channel" = "Live stream scheduled for {date}"; +"lng_action_group_call_finished" = "Live stream finished ({duration})"; "lng_action_group_call_finished_group" = "{from} ended the voice chat ({duration})"; "lng_action_add_user" = "{from} added {user}"; "lng_action_add_users_many" = "{from} added {users}"; @@ -2004,6 +2004,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_call_bar_hangup" = "End call"; "lng_call_leave_to_other_sure" = "Do you want to end your active call and join a voice chat in this group?"; +"lng_call_leave_to_other_sure_channel" = "Do you want to end your active call and join a live stream in this channel?"; "lng_call_box_title" = "Calls"; "lng_call_box_about" = "You haven't made any Telegram calls yet."; @@ -2045,6 +2046,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_call_microphone_off" = "{user}'s microphone is off"; "lng_group_call_title" = "Voice Chat"; +"lng_group_call_title_channel" = "Live Stream"; "lng_group_call_active" = "speaking"; "lng_group_call_inactive" = "listening"; "lng_group_call_raised_hand_status" = "wants to speak"; @@ -2068,13 +2070,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_connecting" = "Connecting..."; "lng_group_call_leave" = "Leave"; "lng_group_call_leave_title" = "Leave voice chat"; +"lng_group_call_leave_title_channel" = "Leave live stream"; "lng_group_call_leave_sure" = "Are you sure you want to leave this voice chat?"; +"lng_group_call_leave_sure_channel" = "Are you sure you want to leave this live stream?"; "lng_group_call_close" = "Close"; "lng_group_call_close_sure" = "Voice chat is scheduled. You can abort it or just close this panel."; +"lng_group_call_close_sure_channel" = "Live stream is scheduled. You can abort it or just close this panel."; "lng_group_call_also_cancel" = "Abort voice chat"; +"lng_group_call_also_cancel_channel" = "Abort live stream"; "lng_group_call_leave_to_other_sure" = "Do you want to leave your active voice chat and join a voice chat in this group?"; +"lng_group_call_leave_to_other_sure_channel" = "Do you want to leave your active voice chat and join a live stream in this channel?"; +"lng_group_call_leave_channel_to_other_sure" = "Do you want to leave your active live stream and join a voice chat in this group?"; +"lng_group_call_leave_channel_to_other_sure_channel" = "Do you want to leave your active live stream and join a live stream in this channel?"; "lng_group_call_create_sure" = "Do you really want to start a voice chat in this group?"; -"lng_group_call_create_sure_channel" = "Are you sure you want to start a voice chat in this channel as your personal account?"; +"lng_group_call_create_sure_channel" = "Are you sure you want to start a live stream in this channel as your personal account?"; "lng_group_call_join_sure_personal" = "Are you sure you want to join this voice chat as your personal account?"; "lng_group_call_muted_no_camera" = "You can't turn on video while you're muted by admin."; "lng_group_call_muted_no_screen" = "You can't share your screen while you're muted by admin."; @@ -2089,6 +2098,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_tooltip_force_muted" = "Muted by admin. Click if you want to speak."; "lng_group_call_tooltip_raised_hand" = "You asked to speak. We let the speakers know."; "lng_group_call_also_end" = "End voice chat"; +"lng_group_call_also_end_channel" = "End live stream"; "lng_group_call_settings_title" = "Settings"; "lng_group_call_invite" = "Invite Member"; "lng_group_call_invited_status" = "invited"; @@ -2111,24 +2121,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_ptt_delay" = "Push to Talk release delay: {delay}"; "lng_group_call_share" = "Share Invite Link"; "lng_group_call_noise_suppression" = "Enable Noise Suppression"; -"lng_group_call_over_limit#one" = "The voice chat is over {count} member.\nNew participants only have access to audio stream."; -"lng_group_call_over_limit#other" = "The voice chat is over {count} members.\nNew participants only have access to audio stream."; "lng_group_call_video_paused" = "Video is paused"; "lng_group_call_share_speaker" = "Users with this link can speak"; "lng_group_call_copy_speaker_link" = "Copy Speaker Link"; "lng_group_call_copy_listener_link" = "Copy Listener Link"; "lng_group_call_end" = "End Voice Chat"; +"lng_group_call_end_channel" = "End Live Stream"; "lng_group_call_cancel" = "Abort Voice Chat"; +"lng_group_call_cancel_channel" = "Abort Live Stream"; "lng_group_call_join" = "Join"; "lng_group_call_join_confirm" = "Do you want to join the voice chat {chat}?"; +"lng_group_call_join_confirm_channel" = "Do you want to join the live stream {chat}?"; "lng_group_call_invite_done_user" = "You invited {user} to the voice chat."; "lng_group_call_invite_done_many#one" = "You invited **{count} member** to the voice chat."; "lng_group_call_invite_done_many#other" = "You invited **{count} members** to the voice chat."; "lng_group_call_no_members" = "click to join"; "lng_group_call_members#one" = "{count} participant"; "lng_group_call_members#other" = "{count} participants"; -"lng_group_call_no_anonymous" = "Sorry, anonymous group admins can't join voice chats."; -"lng_group_call_too_many" = "Sorry, there are too many members in this voice chat. Please try again later."; "lng_group_call_context_mute" = "Mute"; "lng_group_call_context_unmute" = "Allow to speak"; "lng_group_call_context_remove_hand" = "Cancel request to speak"; @@ -2140,6 +2149,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_context_unpin_screen" = "Unpin screencast"; "lng_group_call_context_remove" = "Remove"; "lng_group_call_remove_channel" = "Remove {channel} from the voice chat?"; +"lng_group_call_remove_channel_from_channel" = "Remove {channel} from the live stream?"; "lng_group_call_duration_days#one" = "{count} day"; "lng_group_call_duration_days#other" = "{count} days"; "lng_group_call_duration_hours#one" = "{count} hour"; @@ -2156,18 +2166,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_mac_settings" = "Open Settings"; "lng_group_call_start_as_header" = "Start Voice Chat as..."; +"lng_group_call_start_as_header_channel" = "Start Live Stream as..."; "lng_group_call_join_as_header" = "Join Voice Chat as..."; +"lng_group_call_join_as_header_channel" = "Join Live Stream as..."; "lng_group_call_display_as_header" = "Display me as..."; "lng_group_call_join_as_about" = "Choose whether you want to be displayed as your personal account or as your channel."; "lng_group_call_or_schedule" = "You can also {link}."; "lng_group_call_schedule" = "schedule a voice chat"; +"lng_group_call_schedule_channel" = "schedule a live stream"; "lng_group_call_schedule_title" = "Schedule Voice Chat"; +"lng_group_call_schedule_title_channel" = "Schedule Live Stream"; "lng_group_call_schedule_notified_group" = "The members of the group will be notified that the voice chat will start in {duration}."; -"lng_group_call_schedule_notified_channel" = "The subscribers of the channel will be notified that the voice chat will start in {duration}."; +"lng_group_call_schedule_notified_channel" = "The subscribers of the channel will be notified that the live stream will start in {duration}."; "lng_group_call_scheduled_status" = "Scheduled"; "lng_group_call_scheduled_title" = "Scheduled Voice Chat"; +"lng_group_call_scheduled_title_channel" = "Scheduled Live Stream"; "lng_group_call_starts_short" = "Starts {when}"; "lng_group_call_starts" = "Voice Chat starts {when}"; +"lng_group_call_starts_channel" = "Live Stream starts {when}"; "lng_group_call_starts_today" = "today at {time}"; "lng_group_call_starts_tomorrow" = "tomorrow at {time}"; "lng_group_call_starts_date" = "{date} at {time}"; @@ -2178,16 +2194,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_starts_short_date" = "{date}, {time}"; "lng_group_call_start_now" = "Start Now"; "lng_group_call_start_now_sure" = "Are you sure you want to start the voice chat now?"; +"lng_group_call_start_now_sure_channel" = "Are you sure you want to start the live stream now?"; "lng_group_call_set_reminder" = "Set Reminder"; "lng_group_call_cancel_reminder" = "Cancel Reminder"; "lng_group_call_join_as_personal" = "personal account"; "lng_group_call_edit_title" = "Edit voice chat title"; -"lng_group_call_switch_done" = "Members of this voice chat will now see you as **{user}**"; -"lng_group_call_edit_title_header" = "Voice chat title"; +"lng_group_call_edit_title_channel" = "Edit live stream title"; "lng_group_call_recording_start" = "Start recording"; "lng_group_call_recording_stop" = "Stop recording"; "lng_group_call_recording_started" = "Voice chat recording started."; +"lng_group_call_recording_started_channel" = "Live stream recording started."; "lng_group_call_recording_stopped" = "Voice chat recording stopped."; +"lng_group_call_recording_stopped_channel" = "Live stream recording stopped."; "lng_group_call_recording_saved" = "Audio saved to Saved Messages."; "lng_group_call_pinned_camera_me" = "Your video is pinned."; "lng_group_call_pinned_screen_me" = "Your screencast is pinned."; @@ -2203,18 +2221,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_group_call_recording_start_field" = "Recording Title"; "lng_group_call_recording_start_button" = "Start"; "lng_group_call_is_recorded" = "Voice chat is being recorded."; +"lng_group_call_is_recorded_channel" = "Live stream is being recorded."; "lng_group_call_can_speak_here" = "You can now speak."; "lng_group_call_can_speak" = "You can now speak in {chat}."; "lng_group_call_title_changed" = "Voice chat title changed to {title}"; +"lng_group_call_title_changed_channel" = "Live stream title changed to {title}"; "lng_group_call_join_as_changed" = "Members of this voice chat will now see you as {name}"; +"lng_group_call_join_as_changed_channel" = "Members of this live stream will now see you as {name}"; "lng_no_mic_permission" = "Telegram needs access to your microphone so that you can make calls and record voice messages."; "lng_player_message_today" = "Today at {time}"; "lng_player_message_yesterday" = "Yesterday at {time}"; "lng_player_message_date" = "{date} at {time}"; -//"lng_player_cant_stream" = "This file can't be played before it is fully downloaded.\n\nWould you like to download it?"; -//"lng_player_download" = "Download"; "lng_rights_edit_admin" = "Manage permissions"; "lng_rights_edit_admin_header" = "What can this admin do?"; @@ -2270,6 +2289,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_rights_channel_post" = "Post messages"; "lng_rights_channel_edit" = "Edit messages of others"; "lng_rights_channel_delete" = "Delete messages of others"; +"lng_rights_channel_manage_calls" = "Manage live streams"; "lng_rights_group_info" = "Change group info"; "lng_rights_group_ban" = "Ban users"; "lng_rights_group_invite_link" = "Invite users via link"; @@ -2359,6 +2379,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_filter_messages_edited" = "Edited messages"; "lng_admin_log_filter_messages_pinned" = "Pinned messages"; "lng_admin_log_filter_voice_chats" = "Voice chat"; +"lng_admin_log_filter_voice_chats_channel" = "Live stream"; "lng_admin_log_filter_invite_links" = "Invite links"; "lng_admin_log_filter_members_removed" = "Leaving members"; "lng_admin_log_filter_all_admins" = "All users and admins"; @@ -2431,12 +2452,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_changed_slow_mode" = "{from} changed slow mode to {duration}"; "lng_admin_log_removed_slow_mode" = "{from} disabled slow mode"; "lng_admin_log_started_group_call" = "{from} started a new voice chat"; +"lng_admin_log_started_group_call_channel" = "{from} started a new live stream"; "lng_admin_log_discarded_group_call" = "{from} discarded a voice chat"; +"lng_admin_log_discarded_group_call_channel" = "{from} discarded a live stream"; "lng_admin_log_muted_participant" = "{from} muted {user} in a voice chat"; +"lng_admin_log_muted_participant_channel" = "{from} muted {user} in a live stream"; "lng_admin_log_unmuted_participant" = "{from} unmuted {user} in a voice chat"; +"lng_admin_log_unmuted_participant_channel" = "{from} unmuted {user} in a live stream"; "lng_admin_log_allowed_unmute_self" = "{from} allowed new voice chat members to speak"; +"lng_admin_log_allowed_unmute_self_channel" = "{from} allowed new live stream members to speak"; "lng_admin_log_disallowed_unmute_self" = "{from} started muting new voice chat members"; +"lng_admin_log_disallowed_unmute_self_channel" = "{from} started muting new live stream members"; "lng_admin_log_participant_volume" = "{from} changed voice chat volume for {user} to {percent}"; +"lng_admin_log_participant_volume_channel" = "{from} changed live stream volume for {user} to {percent}"; "lng_admin_log_user_with_username" = "{name} ({mention})"; "lng_admin_log_messages_ttl_set" = "{from} enabled messages auto-delete after {duration}"; "lng_admin_log_messages_ttl_changed" = "{from} changed messages auto-delete period from {previous} to {duration}"; @@ -2461,6 +2489,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_admin_invite_link" = "Invite users via link"; "lng_admin_log_admin_pin_messages" = "Pin messages"; "lng_admin_log_admin_manage_calls" = "Manage voice chats"; +"lng_admin_log_admin_manage_calls_channel" = "Manage live streams"; "lng_admin_log_admin_add_admins" = "Add new admins"; "lng_terms_signup" = "By signing up,\nyou agree to the {link}."; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.cpp index 183d988b6..a83f24beb 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_permissions_box.cpp @@ -150,7 +150,7 @@ std::vector> AdminRightLabels( { Flag::EditMessages, tr::lng_rights_channel_edit(tr::now) }, { Flag::DeleteMessages, tr::lng_rights_channel_delete(tr::now) }, { Flag::InviteUsers, tr::lng_rights_group_invite(tr::now) }, - { Flag::ManageCall, tr::lng_rights_group_manage_calls(tr::now) }, + { Flag::ManageCall, tr::lng_rights_channel_manage_calls(tr::now) }, { Flag::AddAdmins, tr::lng_rights_add_admins(tr::now) } }; } diff --git a/Telegram/SourceFiles/calls/group/calls_choose_join_as.cpp b/Telegram/SourceFiles/calls/group/calls_choose_join_as.cpp index cefaca113..655f1165e 100644 --- a/Telegram/SourceFiles/calls/group/calls_choose_join_as.cpp +++ b/Telegram/SourceFiles/calls/group/calls_choose_join_as.cpp @@ -126,6 +126,7 @@ void ScheduleGroupCallBox( copy.scheduleDate = date; done(std::move(copy)); }; + const auto livestream = info.peer->isBroadcast(); const auto duration = box->lifetime().make_state< rpl::variable>(); auto description = (info.peer->isBroadcast() @@ -151,7 +152,9 @@ void ScheduleGroupCallBox( ).addSecs(60 * 60 * (now.time().minute() < 30 ? 1 : 2)); auto descriptor = Ui::ChooseDateTimeBox(box, { - .title = tr::lng_group_call_schedule_title(), + .title = (livestream + ? tr::lng_group_call_schedule_title_channel() + : tr::lng_group_call_schedule_title()), .submit = tr::lng_schedule_button(), .done = send, .min = min, @@ -194,11 +197,16 @@ void ChooseJoinAsBox( JoinInfo info, Fn done) { box->setWidth(st::groupCallJoinAsWidth); + const auto livestream = info.peer->isBroadcast(); box->setTitle([&] { switch (context) { - case Context::Create: return tr::lng_group_call_start_as_header(); + case Context::Create: return livestream + ? tr::lng_group_call_start_as_header_channel() + : tr::lng_group_call_start_as_header(); case Context::Join: - case Context::JoinWithConfirm: return tr::lng_group_call_join_as_header(); + case Context::JoinWithConfirm: return livestream + ? tr::lng_group_call_join_as_header_channel() + : tr::lng_group_call_join_as_header(); case Context::Switch: return tr::lng_group_call_display_as_header(); } Unexpected("Context in ChooseJoinAsBox."); @@ -243,7 +251,9 @@ void ChooseJoinAsBox( box, tr::lng_group_call_or_schedule( lt_link, - tr::lng_group_call_schedule(makeLink), + (livestream + ? tr::lng_group_call_schedule_channel + : tr::lng_group_call_schedule)(makeLink), Ui::Text::WithEntities), labelSt)); label->setClickHandlerFilter([=](const auto&...) { @@ -276,8 +286,7 @@ void ChooseJoinAsBox( const auto anonymouseAdmin = channel && ((channel->isMegagroup() && channel->amAnonymous()) || (channel->isBroadcast() - && (channel->amCreator() - || channel->hasAdminRights()))); + && (channel->amCreator() || channel->hasAdminRights()))); if (anonymouseAdmin && !joinAsAlreadyUsed) { return { tr::lng_group_call_join_sure_personal(tr::now) }; } else if (context != ChooseJoinAsProcess::Context::JoinWithConfirm) { @@ -286,7 +295,9 @@ void ChooseJoinAsBox( const auto name = !existing->title().isEmpty() ? existing->title() : peer->name; - return tr::lng_group_call_join_confirm( + return (peer->isBroadcast() + ? tr::lng_group_call_join_confirm_channel + : tr::lng_group_call_join_confirm)( tr::now, lt_chat, Ui::Text::Bold(name), @@ -402,6 +413,7 @@ void ChooseJoinAsProcess::start( finish(info); return; } + const auto livestream = peer->isBroadcast(); const auto creating = !peer->groupCall(); if (creating) { confirmation @@ -409,7 +421,9 @@ void ChooseJoinAsProcess::start( .append(tr::lng_group_call_or_schedule( tr::now, lt_link, - Ui::Text::Link(tr::lng_group_call_schedule(tr::now)), + Ui::Text::Link((livestream + ? tr::lng_group_call_schedule_channel + : tr::lng_group_call_schedule)(tr::now)), Ui::Text::WithEntities)); } const auto guard = base::make_weak(&_request->guard); diff --git a/Telegram/SourceFiles/calls/group/calls_group_call.cpp b/Telegram/SourceFiles/calls/group/calls_group_call.cpp index 73a7b0e0a..0c9e0ff09 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_call.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_call.cpp @@ -979,11 +979,6 @@ void GroupCall::start(TimeId scheduleDate) { LOG(("Call Error: Could not create, error: %1" ).arg(error.type())); hangup(); - if (error.type() == u"GROUPCALL_ANONYMOUS_FORBIDDEN"_q) { - Ui::ShowMultilineToast({ - .text = { tr::lng_group_call_no_anonymous(tr::now) }, - }); - } }).send(); } @@ -1313,11 +1308,7 @@ void GroupCall::rejoin(not_null as) { hangup(); Ui::ShowMultilineToast({ - .text = { type == u"GROUPCALL_ANONYMOUS_FORBIDDEN"_q - ? tr::lng_group_call_no_anonymous(tr::now) - : type == u"GROUPCALL_PARTICIPANTS_TOO_MUCH"_q - ? tr::lng_group_call_too_many(tr::now) - : type == u"GROUPCALL_FORBIDDEN"_q + .text = { type == u"GROUPCALL_FORBIDDEN"_q ? tr::lng_group_not_accessible(tr::now) : Lang::Hard::ServerError() }, }); diff --git a/Telegram/SourceFiles/calls/group/calls_group_menu.cpp b/Telegram/SourceFiles/calls/group/calls_group_menu.cpp index b523cc233..63344212a 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_menu.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_menu.cpp @@ -37,8 +37,11 @@ void EditGroupCallTitleBox( not_null box, const QString &placeholder, const QString &title, + bool livestream, Fn done) { - box->setTitle(tr::lng_group_call_edit_title()); + box->setTitle(livestream + ? tr::lng_group_call_edit_title_channel() + : tr::lng_group_call_edit_title()); const auto input = box->addRow(object_ptr( box, st::groupCallField, @@ -492,25 +495,36 @@ void LeaveBox( not_null call, bool discardChecked, BoxContext context) { + const auto livestream = call->peer()->isBroadcast(); const auto scheduled = (call->scheduleDate() != 0); if (!scheduled) { - box->setTitle(tr::lng_group_call_leave_title()); + box->setTitle(livestream + ? tr::lng_group_call_leave_title_channel() + : tr::lng_group_call_leave_title()); } const auto inCall = (context == BoxContext::GroupCallPanel); box->addRow( object_ptr( box.get(), (scheduled - ? tr::lng_group_call_close_sure() - : tr::lng_group_call_leave_sure()), + ? (livestream + ? tr::lng_group_call_close_sure_channel() + : tr::lng_group_call_close_sure()) + : (livestream + ? tr::lng_group_call_leave_sure_channel() + : tr::lng_group_call_leave_sure())), (inCall ? st::groupCallBoxLabel : st::boxLabel)), scheduled ? st::boxPadding : st::boxRowPadding); const auto discard = call->peer()->canManageGroupCall() ? box->addRow(object_ptr( box.get(), (scheduled - ? tr::lng_group_call_also_cancel() - : tr::lng_group_call_also_end()), + ? (livestream + ? tr::lng_group_call_also_cancel_channel() + : tr::lng_group_call_also_cancel()) + : (livestream + ? tr::lng_group_call_also_end_channel() + : tr::lng_group_call_also_end())), discardChecked, (inCall ? st::groupCallCheckbox : st::defaultBoxCheckbox), (inCall ? st::groupCallCheck : st::defaultCheck)), @@ -592,7 +606,11 @@ void FillMenu( menu->addSeparator(); } if (addEditTitle) { - menu->addAction(tr::lng_group_call_edit_title(tr::now), [=] { + const auto livestream = call->peer()->isBroadcast(); + const auto text = (livestream + ? tr::lng_group_call_edit_title_channel + : tr::lng_group_call_edit_title)(tr::now); + menu->addAction(text, [=] { const auto done = [=](const QString &title) { if (const auto strong = weak.get()) { strong->changeTitle(title); @@ -603,6 +621,7 @@ void FillMenu( EditGroupCallTitleBox, peer->name, real->title(), + livestream, done)); } }); @@ -666,15 +685,18 @@ void FillMenu( BoxContext::GroupCallPanel)); } }; + const auto livestream = real->peer()->isBroadcast(); menu->addAction(MakeAttentionAction( menu->menu(), - (real->scheduleDate() - ? (call->canManage() - ? tr::lng_group_call_cancel(tr::now) - : tr::lng_group_call_leave(tr::now)) - : (call->canManage() - ? tr::lng_group_call_end(tr::now) - : tr::lng_group_call_leave(tr::now))), + (!call->canManage() + ? tr::lng_group_call_leave + : real->scheduleDate() + ? (livestream + ? tr::lng_group_call_cancel_channel + : tr::lng_group_call_cancel) + : (livestream + ? tr::lng_group_call_end_channel + : tr::lng_group_call_end))(tr::now), finish)); } diff --git a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp index 1cc67c2a0..5fed7d911 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_panel.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_panel.cpp @@ -335,7 +335,9 @@ void Panel::startScheduledNow() { _call->startScheduledNow(); }; auto owned = ConfirmBox({ - .text = { tr::lng_group_call_start_now_sure(tr::now) }, + .text = { (_call->peer()->isBroadcast() + ? tr::lng_group_call_start_now_sure_channel + : tr::lng_group_call_start_now_sure)(tr::now) }, .button = tr::lng_group_call_start_now(), .callback = done, }); @@ -973,6 +975,7 @@ void Panel::updateWideControlsVisibility() { } void Panel::subscribeToChanges(not_null real) { + const auto livestream = real->peer()->isBroadcast(); const auto validateRecordingMark = [=](bool recording) { if (!recording && _recordingMark) { _recordingMark.destroy(); @@ -989,7 +992,9 @@ void Panel::subscribeToChanges(not_null real) { const auto skip = st::groupCallRecordingMarkSkip; _recordingMark->resize(size + 2 * skip, size + 2 * skip); _recordingMark->setClickedCallback([=] { - showToast({ tr::lng_group_call_is_recorded(tr::now) }); + showToast({ (livestream + ? tr::lng_group_call_is_recorded_channel + : tr::lng_group_call_is_recorded)(tr::now) }); }); const auto animate = [=] { const auto opaque = state->opaque; @@ -1024,12 +1029,17 @@ void Panel::subscribeToChanges(not_null real) { _1 != 0 ) | rpl::distinct_until_changed( ) | rpl::start_with_next([=](bool recorded) { + const auto livestream = _call->peer()->isBroadcast(); validateRecordingMark(recorded); showToast((recorded - ? tr::lng_group_call_recording_started + ? (livestream + ? tr::lng_group_call_recording_started_channel + : tr::lng_group_call_recording_started) : _call->recordingStoppedByMe() ? tr::lng_group_call_recording_saved - : tr::lng_group_call_recording_stopped)( + : (livestream + ? tr::lng_group_call_recording_stopped_channel + : tr::lng_group_call_recording_stopped))( tr::now, Ui::Text::RichLangValue)); }, lifetime()); @@ -1277,16 +1287,18 @@ void Panel::kickParticipant(not_null participantPeer) { object_ptr( box.get(), (!participantPeer->isUser() - ? tr::lng_group_call_remove_channel( - tr::now, - lt_channel, - participantPeer->name) + ? (_peer->isBroadcast() + ? tr::lng_group_call_remove_channel_from_channel + : tr::lng_group_call_remove_channel)( + tr::now, + lt_channel, + participantPeer->name) : (_peer->isBroadcast() ? tr::lng_profile_sure_kick_channel : tr::lng_profile_sure_kick)( - tr::now, - lt_user, - participantPeer->asUser()->firstName)), + tr::now, + lt_user, + participantPeer->asUser()->firstName)), st::groupCallBoxLabel), style::margins( st::boxRowPadding.left(), diff --git a/Telegram/SourceFiles/calls/group/calls_group_toasts.cpp b/Telegram/SourceFiles/calls/group/calls_group_toasts.cpp index cf27a9a81..c54b00266 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_toasts.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_toasts.cpp @@ -49,7 +49,9 @@ void Toasts::setupJoinAsChanged() { return (state == State::Joined); }) | rpl::take(1); }) | rpl::flatten_latest() | rpl::start_with_next([=] { - _panel->showToast(tr::lng_group_call_join_as_changed( + _panel->showToast((_call->peer()->isBroadcast() + ? tr::lng_group_call_join_as_changed_channel + : tr::lng_group_call_join_as_changed)( tr::now, lt_name, Ui::Text::Bold(_call->joinAs()->name), @@ -67,7 +69,9 @@ void Toasts::setupTitleChanged() { ? peer->name : peer->groupCall()->title(); }) | rpl::start_with_next([=](const QString &title) { - _panel->showToast(tr::lng_group_call_title_changed( + _panel->showToast((_call->peer()->isBroadcast() + ? tr::lng_group_call_title_changed_channel + : tr::lng_group_call_title_changed)( tr::now, lt_title, Ui::Text::Bold(title), diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp index 579b888c4..91b6a8ee1 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_filter.cpp @@ -271,8 +271,10 @@ void FilterBox::Inner::createActionsCheckboxes(const FilterValue &filter) { addFlag(Flag::f_edit, tr::lng_admin_log_filter_messages_edited(tr::now)); if (isGroup) { addFlag(Flag::f_pinned, tr::lng_admin_log_filter_messages_pinned(tr::now)); + addFlag(Flag::f_group_call, tr::lng_admin_log_filter_voice_chats(tr::now)); + } else { + addFlag(Flag::f_group_call, tr::lng_admin_log_filter_voice_chats_channel(tr::now)); } - addFlag(Flag::f_group_call, tr::lng_admin_log_filter_voice_chats(tr::now)); addFlag(Flag::f_invites, tr::lng_admin_log_filter_invite_links(tr::now)); addFlag(Flag::f_leave, tr::lng_admin_log_filter_members_removed(tr::now)); } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp index 532a45f3c..d36c9fb48 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp @@ -165,10 +165,14 @@ TextWithEntities GenerateAdminChangeText( auto result = tr::lng_admin_log_promoted(tr::now, lt_user, user, Ui::Text::WithEntities); - auto useInviteLinkPhrase = channel->isMegagroup() && channel->anyoneCanAddMembers(); - auto invitePhrase = useInviteLinkPhrase + const auto useInviteLinkPhrase = channel->isMegagroup() + && channel->anyoneCanAddMembers(); + const auto invitePhrase = useInviteLinkPhrase ? tr::lng_admin_log_admin_invite_link : tr::lng_admin_log_admin_invite_users; + const auto callPhrase = channel->isBroadcast() + ? tr::lng_admin_log_admin_manage_calls_channel + : tr::lng_admin_log_admin_manage_calls; static auto phraseMap = std::map> { { Flag::ChangeInfo, tr::lng_admin_log_admin_change_info }, { Flag::PostMessages, tr::lng_admin_log_admin_post_messages }, @@ -181,6 +185,7 @@ TextWithEntities GenerateAdminChangeText( { Flag::AddAdmins, tr::lng_admin_log_admin_add_admins }, }; phraseMap[Flag::InviteUsers] = invitePhrase; + phraseMap[Flag::ManageCall] = callPhrase; if (!channel->isMegagroup()) { // Don't display "Ban users" changes in channels. @@ -502,6 +507,7 @@ void GenerateItems( const auto id = event.vid().v; const auto from = history->owner().user(event.vuser_id().v); const auto channel = history->peer->asChannel(); + const auto broadcast = channel->isBroadcast(); const auto &action = event.vaction(); const auto date = event.vdate().v; const auto addPart = [&]( @@ -825,7 +831,6 @@ void GenerateItems( }; auto createChangeLinkedChat = [&](const MTPDchannelAdminLogEventActionChangeLinkedChat &action) { - const auto broadcast = channel->isBroadcast(); const auto now = history->owner().channelLoaded(action.vnew_value().v); if (!now) { auto text = (broadcast @@ -901,12 +906,16 @@ void GenerateItems( }; auto createStartGroupCall = [&](const MTPDchannelAdminLogEventActionStartGroupCall &data) { - const auto text = tr::lng_admin_log_started_group_call(tr::now, lt_from, fromLinkText); + const auto text = (broadcast + ? tr::lng_admin_log_started_group_call_channel + : tr::lng_admin_log_started_group_call)(tr::now, lt_from, fromLinkText); addSimpleServiceMessage(text); }; auto createDiscardGroupCall = [&](const MTPDchannelAdminLogEventActionDiscardGroupCall &data) { - const auto text = tr::lng_admin_log_discarded_group_call(tr::now, lt_from, fromLinkText); + const auto text = (broadcast + ? tr::lng_admin_log_discarded_group_call_channel + : tr::lng_admin_log_discarded_group_call)(tr::now, lt_from, fromLinkText); addSimpleServiceMessage(text); }; @@ -932,7 +941,9 @@ void GenerateItems( const auto participantPeer = groupCallParticipantPeer(data.vparticipant()); const auto participantPeerLink = participantPeer->createOpenLink(); const auto participantPeerLinkText = textcmdLink(2, participantPeer->name); - auto text = tr::lng_admin_log_muted_participant( + auto text = (broadcast + ? tr::lng_admin_log_muted_participant_channel + : tr::lng_admin_log_muted_participant)( tr::now, lt_from, fromLinkText, @@ -945,7 +956,9 @@ void GenerateItems( const auto participantPeer = groupCallParticipantPeer(data.vparticipant()); const auto participantPeerLink = participantPeer->createOpenLink(); const auto participantPeerLinkText = textcmdLink(2, participantPeer->name); - auto text = tr::lng_admin_log_unmuted_participant( + auto text = (broadcast + ? tr::lng_admin_log_unmuted_participant_channel + : tr::lng_admin_log_unmuted_participant)( tr::now, lt_from, fromLinkText, @@ -955,9 +968,13 @@ void GenerateItems( }; auto createToggleGroupCallSetting = [&](const MTPDchannelAdminLogEventActionToggleGroupCallSetting &data) { - const auto text = mtpIsTrue(data.vjoin_muted()) - ? tr::lng_admin_log_disallowed_unmute_self(tr::now, lt_from, fromLinkText) - : tr::lng_admin_log_allowed_unmute_self(tr::now, lt_from, fromLinkText); + const auto text = (mtpIsTrue(data.vjoin_muted()) + ? (broadcast + ? tr::lng_admin_log_disallowed_unmute_self_channel + : tr::lng_admin_log_disallowed_unmute_self) + : (broadcast + ? tr::lng_admin_log_allowed_unmute_self_channel + : tr::lng_admin_log_allowed_unmute_self))(tr::now, lt_from, fromLinkText); addSimpleServiceMessage(text); }; @@ -1026,7 +1043,9 @@ void GenerateItems( return data.vvolume().value_or(10000); }); const auto volumeText = QString::number(volume / 100) + '%'; - auto text = tr::lng_admin_log_participant_volume( + auto text = (broadcast + ? tr::lng_admin_log_participant_volume_channel + : tr::lng_admin_log_participant_volume)( tr::now, lt_from, fromLinkText, diff --git a/Telegram/SourceFiles/history/view/history_view_group_call_tracker.cpp b/Telegram/SourceFiles/history/view/history_view_group_call_tracker.cpp index a0feae26e..089c279bf 100644 --- a/Telegram/SourceFiles/history/view/history_view_group_call_tracker.cpp +++ b/Telegram/SourceFiles/history/view/history_view_group_call_tracker.cpp @@ -248,6 +248,7 @@ rpl::producer GroupCallTracker::ContentByCall( auto lifetime = rpl::lifetime(); auto state = lifetime.make_state(); state->current.shown = true; + state->current.livestream = call->peer()->isBroadcast(); const auto pushNext = [=] { if (state->scheduled) { diff --git a/Telegram/SourceFiles/ui/chat/group_call_bar.cpp b/Telegram/SourceFiles/ui/chat/group_call_bar.cpp index 72da22c02..6507cee17 100644 --- a/Telegram/SourceFiles/ui/chat/group_call_bar.cpp +++ b/Telegram/SourceFiles/ui/chat/group_call_bar.cpp @@ -275,9 +275,13 @@ void GroupCallBar::paint(Painter &p) { titleTop, width, (!_content.scheduleDate - ? tr::lng_group_call_title(tr::now) + ? (_content.livestream + ? tr::lng_group_call_title_channel + : tr::lng_group_call_title)(tr::now) : _content.title.isEmpty() - ? tr::lng_group_call_scheduled_title(tr::now) + ? (_content.livestream + ? tr::lng_group_call_scheduled_title_channel + : tr::lng_group_call_scheduled_title)(tr::now) : (titleWidth > available) ? font->elided(_content.title, available) : _content.title)); @@ -315,6 +319,8 @@ void GroupCallBar::paint(Painter &p) { (_content.scheduleDate ? (_content.title.isEmpty() ? tr::lng_group_call_starts_short + : _content.livestream + ? tr::lng_group_call_starts_channel : tr::lng_group_call_starts)(tr::now, lt_when, when) : _content.count > 0 ? tr::lng_group_call_members(tr::now, lt_count, _content.count) diff --git a/Telegram/SourceFiles/ui/chat/group_call_bar.h b/Telegram/SourceFiles/ui/chat/group_call_bar.h index 1b2d6fc92..d19a78a25 100644 --- a/Telegram/SourceFiles/ui/chat/group_call_bar.h +++ b/Telegram/SourceFiles/ui/chat/group_call_bar.h @@ -26,6 +26,7 @@ struct GroupCallBarContent { TimeId scheduleDate = 0; int count = 0; bool shown = false; + bool livestream = false; std::vector users; }; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index f7a9b26a8..2bab71a2f 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1066,17 +1066,26 @@ void SessionController::startOrJoinGroupCall( // Do you want to leave your active voice chat // to join a voice chat in this group? askConfirmation( - tr::lng_call_leave_to_other_sure(tr::now), + (peer->isBroadcast() + ? tr::lng_call_leave_to_other_sure_channel + : tr::lng_call_leave_to_other_sure)(tr::now), tr::lng_call_bar_hangup(tr::now)); } else if (confirm != GroupCallJoinConfirm::None && calls.inGroupCall()) { - if (calls.currentGroupCall()->peer() == peer) { + const auto now = calls.currentGroupCall()->peer(); + if (now == peer) { calls.activateCurrentCall(joinHash); } else if (calls.currentGroupCall()->scheduleDate()) { calls.startOrJoinGroupCall(peer, joinHash); } else { askConfirmation( - tr::lng_group_call_leave_to_other_sure(tr::now), + ((peer->isBroadcast() && now->isBroadcast()) + ? tr::lng_group_call_leave_channel_to_other_sure_channel + : now->isBroadcast() + ? tr::lng_group_call_leave_channel_to_other_sure + : peer->isBroadcast() + ? tr::lng_group_call_leave_to_other_sure_channel + : tr::lng_group_call_leave_to_other_sure)(tr::now), tr::lng_group_call_leave(tr::now)); } } else {