mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 17:06:35 +03:00
nicer summaries: prefer emoji over names
This commit is contained in:
213
src/summary.rs
213
src/summary.rs
@@ -120,70 +120,120 @@ impl Summary {
|
|||||||
impl Message {
|
impl Message {
|
||||||
/// Returns a summary text.
|
/// Returns a summary text.
|
||||||
async fn get_summary_text(&self, context: &Context) -> String {
|
async fn get_summary_text(&self, context: &Context) -> String {
|
||||||
let mut append_text = true;
|
let (emoji, type_name, type_file, append_text);
|
||||||
let prefix = match self.viewtype {
|
match self.viewtype {
|
||||||
Viewtype::Image => stock_str::image(context).await,
|
Viewtype::Image => {
|
||||||
Viewtype::Gif => stock_str::gif(context).await,
|
emoji = Some("📷");
|
||||||
Viewtype::Sticker => stock_str::sticker(context).await,
|
type_name = Some(stock_str::image(context).await);
|
||||||
Viewtype::Video => stock_str::video(context).await,
|
type_file = None;
|
||||||
Viewtype::Voice => stock_str::voice_message(context).await,
|
append_text = true;
|
||||||
Viewtype::Audio | Viewtype::File => {
|
}
|
||||||
|
Viewtype::Gif => {
|
||||||
|
emoji = None;
|
||||||
|
type_name = Some(stock_str::gif(context).await);
|
||||||
|
type_file = None;
|
||||||
|
append_text = true;
|
||||||
|
}
|
||||||
|
Viewtype::Sticker => {
|
||||||
|
emoji = None;
|
||||||
|
type_name = Some(stock_str::sticker(context).await);
|
||||||
|
type_file = None;
|
||||||
|
append_text = true;
|
||||||
|
}
|
||||||
|
Viewtype::Video => {
|
||||||
|
emoji = Some("🎥");
|
||||||
|
type_name = Some(stock_str::video(context).await);
|
||||||
|
type_file = None;
|
||||||
|
append_text = true;
|
||||||
|
}
|
||||||
|
Viewtype::Voice => {
|
||||||
|
emoji = Some("🎤");
|
||||||
|
type_name = Some(stock_str::voice_message(context).await);
|
||||||
|
type_file = None;
|
||||||
|
append_text = true;
|
||||||
|
}
|
||||||
|
Viewtype::Audio => {
|
||||||
|
emoji = Some("🎵");
|
||||||
|
type_name = Some(stock_str::audio(context).await);
|
||||||
|
type_file = self.get_filename();
|
||||||
|
append_text = true
|
||||||
|
}
|
||||||
|
Viewtype::File => {
|
||||||
if self.param.get_cmd() == SystemMessage::AutocryptSetupMessage {
|
if self.param.get_cmd() == SystemMessage::AutocryptSetupMessage {
|
||||||
|
emoji = None;
|
||||||
|
type_name = Some(stock_str::ac_setup_msg_subject(context).await);
|
||||||
|
type_file = None;
|
||||||
append_text = false;
|
append_text = false;
|
||||||
stock_str::ac_setup_msg_subject(context).await
|
|
||||||
} else {
|
} else {
|
||||||
let file_name = self
|
emoji = Some("📎");
|
||||||
.get_filename()
|
type_name = Some(stock_str::file(context).await);
|
||||||
.unwrap_or_else(|| String::from("ErrFileName"));
|
type_file = self.get_filename();
|
||||||
let label = if self.viewtype == Viewtype::Audio {
|
append_text = true
|
||||||
stock_str::audio(context).await
|
|
||||||
} else {
|
|
||||||
stock_str::file(context).await
|
|
||||||
};
|
|
||||||
format!("{label} – {file_name}")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Viewtype::VideochatInvitation => {
|
Viewtype::VideochatInvitation => {
|
||||||
|
emoji = None;
|
||||||
|
type_name = Some(stock_str::videochat_invitation(context).await);
|
||||||
|
type_file = None;
|
||||||
append_text = false;
|
append_text = false;
|
||||||
stock_str::videochat_invitation(context).await
|
|
||||||
}
|
}
|
||||||
Viewtype::Webxdc => {
|
Viewtype::Webxdc => {
|
||||||
|
emoji = None;
|
||||||
|
type_name = None;
|
||||||
|
type_file = Some(
|
||||||
|
self.get_webxdc_info(context)
|
||||||
|
.await
|
||||||
|
.map(|info| info.name)
|
||||||
|
.unwrap_or_else(|_| "ErrWebxdcName".to_string()),
|
||||||
|
);
|
||||||
append_text = true;
|
append_text = true;
|
||||||
self.get_webxdc_info(context)
|
|
||||||
.await
|
|
||||||
.map(|info| info.name)
|
|
||||||
.unwrap_or_else(|_| "ErrWebxdcName".to_string())
|
|
||||||
}
|
}
|
||||||
Viewtype::Text | Viewtype::Unknown => {
|
Viewtype::Text | Viewtype::Unknown => {
|
||||||
if self.param.get_cmd() != SystemMessage::LocationOnly {
|
emoji = None;
|
||||||
"".to_string()
|
if self.param.get_cmd() == SystemMessage::LocationOnly {
|
||||||
} else {
|
type_name = Some(stock_str::location(context).await);
|
||||||
|
type_file = None;
|
||||||
append_text = false;
|
append_text = false;
|
||||||
stock_str::location(context).await
|
} else {
|
||||||
|
type_name = None;
|
||||||
|
type_file = None;
|
||||||
|
append_text = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if !append_text {
|
let text = self.text.clone();
|
||||||
return prefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
let summary_content = if self.text.is_empty() {
|
let summary = if let Some(type_file) = type_file {
|
||||||
prefix
|
if append_text && !text.is_empty() {
|
||||||
} else if prefix.is_empty() {
|
format!("{type_file} – {text}")
|
||||||
self.text.to_string()
|
} else {
|
||||||
|
type_file
|
||||||
|
}
|
||||||
|
} else if append_text && !text.is_empty() {
|
||||||
|
if emoji.is_some() {
|
||||||
|
text
|
||||||
|
} else if let Some(type_name) = type_name {
|
||||||
|
format!("{type_name} – {text}")
|
||||||
|
} else {
|
||||||
|
text
|
||||||
|
}
|
||||||
|
} else if let Some(type_name) = type_name {
|
||||||
|
type_name
|
||||||
} else {
|
} else {
|
||||||
format!("{prefix} – {}", self.text)
|
"".to_string()
|
||||||
|
};
|
||||||
|
|
||||||
|
let summary = if let Some(emoji) = emoji {
|
||||||
|
format!("{emoji} {summary}")
|
||||||
|
} else {
|
||||||
|
summary
|
||||||
};
|
};
|
||||||
|
|
||||||
let summary = if self.is_forwarded() {
|
let summary = if self.is_forwarded() {
|
||||||
format!(
|
format!("{}: {}", stock_str::forwarded(context).await, summary)
|
||||||
"{}: {}",
|
|
||||||
stock_str::forwarded(context).await,
|
|
||||||
summary_content
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
summary_content
|
summary
|
||||||
};
|
};
|
||||||
|
|
||||||
summary.split_whitespace().collect::<Vec<&str>>().join(" ")
|
summary.split_whitespace().collect::<Vec<&str>>().join(" ")
|
||||||
@@ -211,75 +261,99 @@ mod tests {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Image);
|
let mut msg = Message::new(Viewtype::Image);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.jpg", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Image" // file names are not added for images
|
"📷 Image" // file names are not added for images
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut msg = Message::new(Viewtype::Image);
|
||||||
|
msg.set_text(some_text.to_string());
|
||||||
|
msg.set_file("foo.jpg", None);
|
||||||
|
assert_eq!(
|
||||||
|
msg.get_summary_text(ctx).await,
|
||||||
|
"📷 bla bla" // type is visible by emoji if text is set
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Video);
|
let mut msg = Message::new(Viewtype::Video);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.mp4", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Video" // file names are not added for videos
|
"🎥 Video" // file names are not added for videos
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut msg = Message::new(Viewtype::Video);
|
||||||
|
msg.set_text(some_text.to_string());
|
||||||
|
msg.set_file("foo.mp4", None);
|
||||||
|
assert_eq!(
|
||||||
|
msg.get_summary_text(ctx).await,
|
||||||
|
"🎥 bla bla" // type is visible by emoji if text is set
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Gif);
|
let mut msg = Message::new(Viewtype::Gif);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.gif", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"GIF" // file names are not added for GIFs
|
"GIF" // file names are not added for GIFs
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let mut msg = Message::new(Viewtype::Gif);
|
||||||
|
msg.set_text(some_text.to_string());
|
||||||
|
msg.set_file("foo.gif", None);
|
||||||
|
assert_eq!(
|
||||||
|
msg.get_summary_text(ctx).await,
|
||||||
|
"GIF \u{2013} bla bla" // file names are not added for GIFs
|
||||||
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Sticker);
|
let mut msg = Message::new(Viewtype::Sticker);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.png", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Sticker" // file names are not added for stickers
|
"Sticker" // file names are not added for stickers
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Voice);
|
let mut msg = Message::new(Viewtype::Voice);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.mp3", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Voice message" // file names are not added for voice messages, empty text is skipped
|
"🎤 Voice message" // file names are not added for voice messages
|
||||||
);
|
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Voice);
|
|
||||||
msg.set_file("foo.bar", None);
|
|
||||||
assert_eq!(
|
|
||||||
msg.get_summary_text(ctx).await,
|
|
||||||
"Voice message" // file names are not added for voice messages
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Voice);
|
let mut msg = Message::new(Viewtype::Voice);
|
||||||
msg.set_text(some_text.clone());
|
msg.set_text(some_text.clone());
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.mp3", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Voice message \u{2013} bla bla" // `\u{2013}` explicitly checks for "EN DASH"
|
"🎤 bla bla" // `\u{2013}` explicitly checks for "EN DASH"
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Audio);
|
let mut msg = Message::new(Viewtype::Audio);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.mp3", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Audio \u{2013} foo.bar" // file name is added for audio
|
"🎵 foo.mp3" // file name is added for audio
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Audio);
|
let mut msg = Message::new(Viewtype::Audio);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.mp3", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Audio \u{2013} foo.bar" // file name is added for audio, empty text is not added
|
"🎵 foo.mp3" // file name is added for audio, empty text is not added
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Audio);
|
let mut msg = Message::new(Viewtype::Audio);
|
||||||
msg.set_text(some_text.clone());
|
msg.set_text(some_text.clone());
|
||||||
|
msg.set_file("foo.mp3", None);
|
||||||
|
assert_eq!(
|
||||||
|
msg.get_summary_text(ctx).await,
|
||||||
|
"🎵 foo.mp3 \u{2013} bla bla" // file name and text added for audio
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut msg = Message::new(Viewtype::File);
|
||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.bar", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Audio \u{2013} foo.bar \u{2013} bla bla" // file name and text added for audio
|
"📎 foo.bar" // file name is added for files
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::File);
|
let mut msg = Message::new(Viewtype::File);
|
||||||
@@ -287,7 +361,15 @@ mod tests {
|
|||||||
msg.set_file("foo.bar", None);
|
msg.set_file("foo.bar", None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"File \u{2013} foo.bar \u{2013} bla bla" // file name is added for files
|
"📎 foo.bar \u{2013} bla bla" // file name is added for files
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut msg = Message::new(Viewtype::VideochatInvitation);
|
||||||
|
msg.set_text(some_text.clone());
|
||||||
|
msg.set_file("foo.bar", None);
|
||||||
|
assert_eq!(
|
||||||
|
msg.get_summary_text(ctx).await,
|
||||||
|
"Video chat invitation" // text is not added for videochat invitations
|
||||||
);
|
);
|
||||||
|
|
||||||
// Forwarded
|
// Forwarded
|
||||||
@@ -305,10 +387,11 @@ mod tests {
|
|||||||
msg.param.set_int(Param::Forwarded, 1);
|
msg.param.set_int(Param::Forwarded, 1);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.get_summary_text(ctx).await,
|
msg.get_summary_text(ctx).await,
|
||||||
"Forwarded: File \u{2013} foo.bar \u{2013} bla bla"
|
"Forwarded: 📎 foo.bar \u{2013} bla bla"
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::File);
|
let mut msg = Message::new(Viewtype::File);
|
||||||
|
msg.set_text(some_text.clone());
|
||||||
msg.param.set(Param::File, "foo.bar");
|
msg.param.set(Param::File, "foo.bar");
|
||||||
msg.param.set_cmd(SystemMessage::AutocryptSetupMessage);
|
msg.param.set_cmd(SystemMessage::AutocryptSetupMessage);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|||||||
Reference in New Issue
Block a user