From 3abe88cd128b249f2038e13dbedcbd8341830126 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Tue, 8 Apr 2025 13:21:35 +0100 Subject: fix(filamento): use jpeg for user avatar on avatar:data node --- filamento/examples/example.rs | 10 ++++++++-- filamento/src/lib.rs | 9 +++++++++ filamento/src/logic/online.rs | 7 ++++--- 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'filamento') diff --git a/filamento/examples/example.rs b/filamento/examples/example.rs index d7c03e4..8119743 100644 --- a/filamento/examples/example.rs +++ b/filamento/examples/example.rs @@ -2,10 +2,10 @@ use std::{path::Path, str::FromStr, sync::Arc, time::Duration}; use filamento::{Client, db::Db, files::FileStore}; use jid::JID; -use tokio::io; +use tokio::io::{self, AsyncReadExt}; use tracing::info; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Files; impl FileStore for Files { @@ -65,6 +65,12 @@ async fn main() { .change_nick(Some("britney".to_string())) .await .unwrap(); + let mut profile_pic = tokio::fs::File::open("files/britney_starbies.jpg") + .await + .unwrap(); + let mut data = Vec::new(); + profile_pic.read_to_end(&mut data).await.unwrap(); + client.change_avatar(Some(data)).await.unwrap(); info!("sending message"); client .send_message( diff --git a/filamento/src/lib.rs b/filamento/src/lib.rs index 42646be..7946241 100644 --- a/filamento/src/lib.rs +++ b/filamento/src/lib.rs @@ -191,6 +191,15 @@ pub struct Client { timeout: Duration, } +impl Client { + pub fn with_timeout(&self, timeout: Duration) -> Self { + Self { + sender: self.sender.clone(), + timeout, + } + } +} + impl Clone for Client { fn clone(&self) -> Self { Self { diff --git a/filamento/src/logic/online.rs b/filamento/src/logic/online.rs index 5b57f84..d9441d7 100644 --- a/filamento/src/logic/online.rs +++ b/filamento/src/logic/online.rs @@ -1,4 +1,4 @@ -use std::io::Cursor; +use std::{io::Cursor, time::Duration}; use base64::{prelude::BASE64_STANDARD, Engine}; use chrono::Utc; @@ -897,7 +897,8 @@ pub async fn handle_change_avatar(logic: &ClientLogic // convert the image to png; let mut data_png = Vec::new(); - image.write_to(&mut Cursor::new(&mut data_png), image::ImageFormat::Png)?; + let image = image.resize(192, 192, image::imageops::FilterType::Nearest); + image.write_to(&mut Cursor::new(&mut data_png), image::ImageFormat::Jpeg)?; // calculate the length of the data in bytes. let bytes = data_png.len().try_into()?; @@ -915,7 +916,7 @@ pub async fn handle_change_avatar(logic: &ClientLogic logic.client().publish(pep::Item::AvatarData(Some(avatar::Data { hash: hash.clone(), data_b64 })), "urn:xmpp:avatar:data".to_string()).await?; // publish the metadata to the metadata node - logic.client().publish(pep::Item::AvatarMetadata(Some(avatar::Metadata { bytes, hash: hash.clone(), r#type: "image/png".to_string() })), "urn:xmpp:avatar:metadata".to_string()).await?; + logic.client().publish(pep::Item::AvatarMetadata(Some(avatar::Metadata { bytes, hash: hash.clone(), r#type: "image/jpeg".to_string() })), "urn:xmpp:avatar:metadata".to_string()).await?; // if everything went well, save the data to the disk. -- cgit