diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 598aa4ed6..7031d5d51 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -7579,6 +7579,19 @@ void dc_event_unref(dc_event_t* event); /// `%1$s` and `%2$s` will both be replaced by the name of the inviter. #define DC_STR_SECURE_JOIN_CHANNEL_STARTED 203 +/// "Channel name changed from %1$s to %2$s." +/// +/// Used in status messages. +/// +/// `%1$s` will be replaced by the old channel name. +/// `%2$s` will be replaced by the new channel name. +#define DC_STR_CHANNEL_NAME_CHANGED 204 + +/// "Channel image changed." +/// +/// Used in status messages. +#define DC_STR_CHANNEL_IMAGE_CHANGED 205 + /// "The attachment contains anonymous usage statistics, which help us improve Delta Chat. Thank you!" /// /// Used as the message body for statistics sent out. diff --git a/src/chat.rs b/src/chat.rs index e71845531..99ca8696b 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -4322,8 +4322,11 @@ async fn rename_ex( && sanitize_single_line(&chat.name) != new_name { msg.viewtype = Viewtype::Text; - msg.text = - stock_str::msg_grp_name(context, &chat.name, &new_name, ContactId::SELF).await; + msg.text = if chat.typ == Chattype::OutBroadcast { + stock_str::msg_broadcast_name_changed(context, &chat.name, &new_name).await + } else { + stock_str::msg_grp_name(context, &chat.name, &new_name, ContactId::SELF).await + }; msg.param.set_cmd(SystemMessage::GroupNameChanged); if !chat.name.is_empty() { msg.param.set(Param::Arg, &chat.name); @@ -4384,7 +4387,11 @@ pub async fn set_chat_profile_image( if new_image.is_empty() { chat.param.remove(Param::ProfileImage); msg.param.remove(Param::Arg); - msg.text = stock_str::msg_grp_img_deleted(context, ContactId::SELF).await; + msg.text = if chat.typ == Chattype::OutBroadcast { + stock_str::msg_broadcast_img_changed(context).await + } else { + stock_str::msg_grp_img_deleted(context, ContactId::SELF).await + }; } else { let mut image_blob = BlobObject::create_and_deduplicate( context, @@ -4394,7 +4401,11 @@ pub async fn set_chat_profile_image( image_blob.recode_to_avatar_size(context).await?; chat.param.set(Param::ProfileImage, image_blob.as_name()); msg.param.set(Param::Arg, image_blob.as_name()); - msg.text = stock_str::msg_grp_img_changed(context, ContactId::SELF).await; + msg.text = if chat.typ == Chattype::OutBroadcast { + stock_str::msg_broadcast_img_changed(context).await + } else { + stock_str::msg_grp_img_changed(context, ContactId::SELF).await + }; } chat.update_param(context).await?; if chat.is_promoted() { diff --git a/src/chat/chat_tests.rs b/src/chat/chat_tests.rs index ead38e747..1cb10db3e 100644 --- a/src/chat/chat_tests.rs +++ b/src/chat/chat_tests.rs @@ -3137,7 +3137,7 @@ async fn test_broadcasts_name_and_avatar() -> Result<()> { assert_eq!(rcvd.get_info_type(), SystemMessage::GroupNameChanged); assert_eq!( rcvd.text, - r#"Group name changed from "My Channel" to "New Channel name" by Alice."# + r#"Channel name changed from "My Channel" to "New Channel name"."# ); let bob_chat = Chat::load_from_db(bob, bob_chat.id).await?; assert_eq!(bob_chat.name, "New Channel name"); @@ -3154,7 +3154,7 @@ async fn test_broadcasts_name_and_avatar() -> Result<()> { let rcvd = bob.recv_msg(&sent).await; assert!(rcvd.get_override_sender_name().is_none()); assert_eq!(rcvd.get_info_type(), SystemMessage::GroupImageChanged); - assert_eq!(rcvd.text, "Group image changed by Alice."); + assert_eq!(rcvd.text, "Channel image changed."); assert_eq!(rcvd.chat_id, bob_chat.id); let bob_chat = Chat::load_from_db(bob, bob_chat.id).await?; @@ -3908,7 +3908,7 @@ async fn test_sync_broadcast_avatar_and_name() -> Result<()> { assert_eq!(rcvd.param.get_cmd(), SystemMessage::GroupNameChanged); assert_eq!( rcvd.text, - r#"You changed group name from "foo" to "New name"."# + r#"Channel name changed from "foo" to "New name"."# ); let a2_broadcast_chat = Chat::load_from_db(alice2, a2_broadcast_id).await?; @@ -3922,7 +3922,7 @@ async fn test_sync_broadcast_avatar_and_name() -> Result<()> { let rcvd = alice1.recv_msg(&sent).await; assert_eq!(rcvd.chat_id, a1_broadcast_id); assert_eq!(rcvd.param.get_cmd(), SystemMessage::GroupImageChanged); - assert_eq!(rcvd.text, "You changed the group image."); + assert_eq!(rcvd.text, "Channel image changed."); let a1_broadcast_chat = Chat::load_from_db(alice1, a1_broadcast_id).await?; let avatar = a1_broadcast_chat.get_profile_image(alice1).await?.unwrap(); @@ -4791,7 +4791,7 @@ async fn test_sync_name() -> Result<()> { assert_eq!(rcvd.to_id, ContactId::SELF); assert_eq!( rcvd.text, - "You changed group name from \"Channel\" to \"Broadcast channel 42\"." + "Channel name changed from \"Channel\" to \"Broadcast channel 42\"." ); assert_eq!(rcvd.param.get_cmd(), SystemMessage::GroupNameChanged); let a1_broadcast_id = get_chat_id_by_grpid(alice1, &a0_broadcast_chat.grpid) diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 8c5d06038..235f12631 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -1466,7 +1466,7 @@ impl MimeFactory { } } SystemMessage::GroupNameChanged => { - placeholdertext = Some("Group name changed.".to_string()); + placeholdertext = Some("Chat name changed.".to_string()); let old_name = msg.param.get(Param::Arg).unwrap_or_default().to_string(); headers.push(( "Chat-Group-Name-Changed", @@ -1483,7 +1483,7 @@ impl MimeFactory { )); } SystemMessage::GroupImageChanged => { - placeholdertext = Some("Group image changed.".to_string()); + placeholdertext = Some("Chat image changed.".to_string()); headers.push(( "Chat-Content", mail_builder::headers::text::Text::new("group-avatar-changed").into(), diff --git a/src/receive_imf.rs b/src/receive_imf.rs index a38217251..b049e60de 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -3332,8 +3332,13 @@ async fn apply_chat_name_avatar_and_description_changes( .is_some() { let old_name = &sanitize_single_line(old_name); - better_msg - .get_or_insert(stock_str::msg_grp_name(context, old_name, grpname, from_id).await); + better_msg.get_or_insert( + if matches!(chat.typ, Chattype::InBroadcast | Chattype::OutBroadcast) { + stock_str::msg_broadcast_name_changed(context, old_name, grpname).await + } else { + stock_str::msg_grp_name(context, old_name, grpname, from_id).await + }, + ); } } @@ -3390,10 +3395,18 @@ async fn apply_chat_name_avatar_and_description_changes( { // this is just an explicit message containing the group-avatar, // apart from that, the group-avatar is send along with various other messages - better_msg.get_or_insert(match avatar_action { - AvatarAction::Delete => stock_str::msg_grp_img_deleted(context, from_id).await, - AvatarAction::Change(_) => stock_str::msg_grp_img_changed(context, from_id).await, - }); + better_msg.get_or_insert( + if matches!(chat.typ, Chattype::InBroadcast | Chattype::OutBroadcast) { + stock_str::msg_broadcast_img_changed(context).await + } else { + match avatar_action { + AvatarAction::Delete => stock_str::msg_grp_img_deleted(context, from_id).await, + AvatarAction::Change(_) => { + stock_str::msg_grp_img_changed(context, from_id).await + } + } + }, + ); } if let Some(avatar_action) = &mime_parser.group_avatar { diff --git a/src/stock_str.rs b/src/stock_str.rs index 198835210..c9f3d2d4a 100644 --- a/src/stock_str.rs +++ b/src/stock_str.rs @@ -391,6 +391,12 @@ https://delta.chat/donate"))] Waiting for the device of %2$s to reply…"))] SecureJoinBroadcastStarted = 203, + #[strum(props(fallback = "Channel name changed from \"%1$s\" to \"%2$s\"."))] + MsgBroadcastNameChanged = 204, + + #[strum(props(fallback = "Channel image changed."))] + MsgBroadcastImgChanged = 205, + #[strum(props( fallback = "The attachment contains anonymous usage statistics, which helps us improve Delta Chat. Thank you!" ))] @@ -708,6 +714,19 @@ pub(crate) async fn secure_join_broadcast_started( } } +/// Stock string: `Channel name changed from "1%s" to "2$s".` +pub(crate) async fn msg_broadcast_name_changed(context: &Context, from: &str, to: &str) -> String { + translated(context, StockMessage::MsgBroadcastNameChanged) + .await + .replace1(from) + .replace2(to) +} + +/// Stock string `Channel image changed.` +pub(crate) async fn msg_broadcast_img_changed(context: &Context) -> String { + translated(context, StockMessage::MsgBroadcastImgChanged).await +} + /// Stock string: `You reacted %1$s to "%2$s"` or `%1$s reacted %2$s to "%3$s"`. pub(crate) async fn msg_reacted( context: &Context, diff --git a/test-data/golden/test_broadcast_joining_golden_alice b/test-data/golden/test_broadcast_joining_golden_alice index 2aaf2fdbc..84602fc4c 100644 --- a/test-data/golden/test_broadcast_joining_golden_alice +++ b/test-data/golden/test_broadcast_joining_golden_alice @@ -1,6 +1,6 @@ OutBroadcast#Chat#1001: My Channel [1 member(s)] Icon: e9b6c7a78aa2e4f415644f55a553e73.png -------------------------------------------------------------------------------- Msg#1001: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO] -Msg#1002πŸ”’: Me (Contact#Contact#Self): You changed the group image. [INFO] √ +Msg#1002πŸ”’: Me (Contact#Contact#Self): Channel image changed. [INFO] √ Msg#1005πŸ”’: Me (Contact#Contact#Self): Member bob@example.net added. [INFO] √ --------------------------------------------------------------------------------