mod.rs (1615B)
1 use matrix_sdk::events::AnySyncMessageEvent; 2 use matrix_sdk::Room; 3 use url::Url; 4 5 use crate::app::matrix::types::get_media_download_url; 6 7 pub mod image; 8 pub mod notice; 9 pub mod text; 10 pub mod video; 11 12 pub trait EventExt { 13 fn is_new_user(&self, prev_event: Option<&AnySyncMessageEvent>) -> bool; 14 } 15 16 impl EventExt for AnySyncMessageEvent { 17 fn is_new_user(&self, prev_event: Option<&AnySyncMessageEvent>) -> bool { 18 if let Some(prev_event) = prev_event { 19 prev_event.sender() != self.sender() 20 } else { 21 true 22 } 23 } 24 } 25 26 pub trait RoomExt { 27 fn get_sender_displayname<'a>(&'a self, event: &'a AnySyncMessageEvent) -> &'a str; 28 fn get_sender_avatar<'a>( 29 &'a self, 30 homeserver_url: &'a Url, 31 event: &'a AnySyncMessageEvent, 32 ) -> Option<Url>; 33 } 34 35 impl RoomExt for Room { 36 fn get_sender_displayname<'a>(&'a self, event: &'a AnySyncMessageEvent) -> &'a str { 37 self.joined_members 38 .get(&event.sender()) 39 .or_else(|| self.invited_members.get(&event.sender())) 40 .and_then(|member| member.display_name.as_deref()) 41 .unwrap_or_else(|| event.sender().as_str()) 42 } 43 44 fn get_sender_avatar<'a>( 45 &self, 46 homeserver_url: &'a Url, 47 event: &'a AnySyncMessageEvent, 48 ) -> Option<Url> { 49 let member = self 50 .joined_members 51 .get(&event.sender()) 52 .or_else(|| self.invited_members.get(&event.sender()))?; 53 54 Some(get_media_download_url( 55 homeserver_url, 56 member.avatar_url.as_deref()?, 57 )) 58 } 59 }