mirror of
https://github.com/chatmail/core.git
synced 2026-05-21 07:46:31 +03:00
fix: Never change Viewtype::Sticker to Image if file has non-image extension (#6352)
Even if UIs don't call `Message::force_sticker()`, they don't want conversions of `Sticker` to `Image` if it's obviously not an image, particularly, has non-image extension. Also UIs don't want conversions of `Sticker` to anything other than `Image`, so let's keep the `Sticker` viewtype in this case.
This commit is contained in:
19
src/blob.rs
19
src/blob.rs
@@ -1461,4 +1461,23 @@ mod tests {
|
|||||||
check_image_size(file_saved, width, height);
|
check_image_size(file_saved, width, height);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_send_gif_as_sticker() -> Result<()> {
|
||||||
|
let bytes = include_bytes!("../test-data/image/image100x50.gif");
|
||||||
|
let alice = &TestContext::new_alice().await;
|
||||||
|
let file = alice.get_blobdir().join("file").with_extension("gif");
|
||||||
|
fs::write(&file, &bytes)
|
||||||
|
.await
|
||||||
|
.context("failed to write file")?;
|
||||||
|
let mut msg = Message::new(Viewtype::Sticker);
|
||||||
|
msg.set_file(file.to_str().unwrap(), None);
|
||||||
|
let chat = alice.get_self_chat().await;
|
||||||
|
let sent = alice.send_msg(chat.id, &mut msg).await;
|
||||||
|
let msg = Message::load_from_db(alice, sent.sender_msg_id).await?;
|
||||||
|
// Message::force_sticker() wasn't used, still Viewtype::Sticker is preserved because of the
|
||||||
|
// extension.
|
||||||
|
assert_eq!(msg.get_viewtype(), Viewtype::Sticker);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/chat.rs
12
src/chat.rs
@@ -2692,7 +2692,10 @@ async fn prepare_msg_blob(context: &Context, msg: &mut Message) -> Result<()> {
|
|||||||
.with_context(|| format!("attachment missing for message of type #{}", msg.viewtype))?;
|
.with_context(|| format!("attachment missing for message of type #{}", msg.viewtype))?;
|
||||||
let send_as_is = msg.viewtype == Viewtype::File;
|
let send_as_is = msg.viewtype == Viewtype::File;
|
||||||
|
|
||||||
if msg.viewtype == Viewtype::File || msg.viewtype == Viewtype::Image {
|
if msg.viewtype == Viewtype::File
|
||||||
|
|| msg.viewtype == Viewtype::Image
|
||||||
|
|| msg.viewtype == Viewtype::Sticker && !msg.param.exists(Param::ForceSticker)
|
||||||
|
{
|
||||||
// Correct the type, take care not to correct already very special
|
// Correct the type, take care not to correct already very special
|
||||||
// formats as GIF or VOICE.
|
// formats as GIF or VOICE.
|
||||||
//
|
//
|
||||||
@@ -2701,7 +2704,12 @@ async fn prepare_msg_blob(context: &Context, msg: &mut Message) -> Result<()> {
|
|||||||
// - from FILE/IMAGE to GIF */
|
// - from FILE/IMAGE to GIF */
|
||||||
if let Some((better_type, _)) = message::guess_msgtype_from_suffix(&blob.to_abs_path())
|
if let Some((better_type, _)) = message::guess_msgtype_from_suffix(&blob.to_abs_path())
|
||||||
{
|
{
|
||||||
if better_type != Viewtype::Webxdc
|
if msg.viewtype == Viewtype::Sticker {
|
||||||
|
if better_type != Viewtype::Image {
|
||||||
|
// UIs don't want conversions of `Sticker` to anything other than `Image`.
|
||||||
|
msg.param.set_int(Param::ForceSticker, 1);
|
||||||
|
}
|
||||||
|
} else if better_type != Viewtype::Webxdc
|
||||||
|| context
|
|| context
|
||||||
.ensure_sendable_webxdc_file(&blob.to_abs_path())
|
.ensure_sendable_webxdc_file(&blob.to_abs_path())
|
||||||
.await
|
.await
|
||||||
|
|||||||
Reference in New Issue
Block a user