daydream

A small matrix web client written in rust
git clone git://archive.git.mtrnord.blog/daydream-mx/daydream.git
Log | Files | Refs | README | LICENSE

commit bef55d05908e354e725be784cb7b8c48a466f200
parent 5fb621b033eca5022ad2dc72069fd365763b7eab
Author: Marcel <mtrnord1@gmail.com>
Date:   Thu,  9 Jul 2020 16:36:46 +0200

Update sdk version

Took 1 hour 37 minutes

Diffstat:
Msrc/app/components/events/image.rs | 2+-
Msrc/app/components/events/mod.rs | 30+++++++++++++-----------------
Msrc/app/components/events/notice.rs | 2+-
Msrc/app/components/events/text.rs | 2+-
Msrc/app/components/events/video.rs | 2+-
Msrc/app/matrix/mod.rs | 77+++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/app/matrix/sync.rs | 13++++++-------
Msrc/app/matrix/types.rs | 8++++----
Msrc/utils/notifications.rs | 19+++++++++++--------
9 files changed, 73 insertions(+), 82 deletions(-)

diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs @@ -50,7 +50,7 @@ impl Component for Image { let sender_displayname = if new_user { get_sender_displayname(&self.props.room, &self.props.event) } else { - "".to_string() + "" }; if let Some(image_url) = &self.props.image_event.url { diff --git a/src/app/components/events/mod.rs b/src/app/components/events/mod.rs @@ -16,23 +16,19 @@ pub fn is_new_user(prev_event: Option<&MessageEvent>, event: &MessageEvent) -> b } } -pub fn get_sender_displayname(room: &Room, event: &MessageEvent) -> String { - match room.members.get(&event.sender) { - None => event.sender.to_string(), - Some(member) => member - .display_name - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(|| event.sender.to_string()), - } +pub fn get_sender_displayname<'a>(room: &'a Room, event: &'a MessageEvent) -> &'a str { + room.joined_members + .get(&event.sender) + .or_else(|| room.invited_members.get(&event.sender)) + .and_then(|member| member.display_name.as_deref()) + .unwrap_or_else(|| event.sender.as_ref()) } -pub fn get_sender_avatar(homeserver_url: Url, room: &Room, event: &MessageEvent) -> Option<String> { - room.members.get(&event.sender).and_then(|member| { - member - .avatar_url - .as_ref() - .map(ToString::to_string) - .map(|v| get_media_download_url(&homeserver_url, v)) - }) +pub fn get_sender_avatar<'a>(homeserver_url: &'a Url, room: &'a Room, event: &'a MessageEvent) -> Option<Url> { + let member = room + .joined_members + .get(&event.sender) + .or_else(|| room.invited_members.get(&event.sender))?; + + Some(get_media_download_url(homeserver_url, member.avatar_url.clone()?)) } diff --git a/src/app/components/events/notice.rs b/src/app/components/events/notice.rs @@ -53,7 +53,7 @@ impl Component for Notice { let sender_displayname = if new_user { get_sender_displayname(&self.props.room, &self.props.event) } else { - "".to_string() + "" }; let mut pure_content = self.props.notice_event.body.clone(); diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs @@ -52,7 +52,7 @@ impl Component for Text { let sender_displayname = if new_user { get_sender_displayname(&self.props.room, &self.props.event) } else { - "".to_string() + "" }; let mut pure_content = self.props.text_event.body.clone(); diff --git a/src/app/components/events/video.rs b/src/app/components/events/video.rs @@ -50,7 +50,7 @@ impl Component for Video { let sender_displayname = if new_user { get_sender_displayname(&self.props.room, &self.props.event) } else { - "".to_string() + "" }; let _caption = format!("{}: {}", sender_displayname, self.props.video_event.body); diff --git a/src/app/matrix/mod.rs b/src/app/matrix/mod.rs @@ -13,7 +13,6 @@ use matrix_sdk::{ EventJson, }, identifiers::RoomId, - js_int::UInt, locks::RwLock, Client, MessagesRequestBuilder, Room, }; @@ -255,29 +254,25 @@ impl Agent for MatrixAgent { Request::GetOldMessages((room_id, from)) => { let agent = self.clone(); spawn_local(async move { - let mut builder = &mut MessagesRequestBuilder::new(); - builder = builder.room_id(room_id.clone()); - if let Some(from) = from { - builder = builder.from(from); - } else { - builder = builder.from( - agent - .matrix_client - .clone() - .unwrap() - .sync_token() - .await - .unwrap(), - ); - } + let mut builder = match from { + Some(from) => MessagesRequestBuilder::new(room_id.clone(), from), + None => MessagesRequestBuilder::new(room_id.clone(), agent + .matrix_client + .as_ref() + .unwrap() + .sync_token() + .await + .unwrap()), + }; let filter = RoomEventFilter { types: Some(vec!["m.room.message".to_string()]), ..Default::default() }; - builder = builder + // TODO find better way than cloning + builder = (*builder .filter(filter) .direction(Direction::Backward) - .limit(UInt::new(30).unwrap()); + .limit(30)).clone(); // TODO handle error gracefully let messsages = agent @@ -303,44 +298,42 @@ impl Agent for MatrixAgent { // TODO deduplicate betweeen this and sync if let RoomEvent::RoomMessage(mut event) = event { if let MessageEventContent::Image(mut image_event) = - event.clone().content + event.clone().content { - if image_event.url.is_some() { - let new_url = Some(get_media_download_url( + if let Some(image_event_url) = image_event.url { + let new_url = get_media_download_url( agent.matrix_client.as_ref().unwrap().homeserver(), - image_event.url.unwrap(), - )); - image_event.url = new_url; + image_event_url, + ); + image_event.url = Some(new_url.to_string()); } - if image_event.info.is_some() { - let mut info = image_event.info.unwrap(); - if info.thumbnail_url.is_some() { - let new_url = Some(get_media_download_url( + if let Some(mut info) = image_event.info { + if let Some(thumbnail_url) = info.thumbnail_url.as_ref() { + let new_url = get_media_download_url( agent.matrix_client.as_ref().unwrap().homeserver(), - info.thumbnail_url.unwrap(), - )); - info.thumbnail_url = new_url; + (*thumbnail_url).clone(), + ); + info.thumbnail_url = Some(new_url.to_string()); } image_event.info = Some(info); } event.content = MessageEventContent::Image(image_event); } if let MessageEventContent::Video(mut video_event) = event.content { - if video_event.url.is_some() { - let new_url = Some(get_video_media_download_url( + if let Some(video_event_url) = video_event.url { + let new_url = get_video_media_download_url( agent.matrix_client.as_ref().unwrap().homeserver(), - video_event.url.unwrap(), - )); - video_event.url = new_url; + video_event_url, + ); + video_event.url = Some(new_url.to_string()); } - if video_event.info.is_some() { - let mut info = video_event.info.unwrap(); - if info.thumbnail_url.is_some() { + if let Some(mut info) = video_event.info { + if let Some(thumbnail_url) = info.thumbnail_url { let new_url = Some(get_media_download_url( agent.matrix_client.as_ref().unwrap().homeserver(), - info.thumbnail_url.unwrap(), - )); - info.thumbnail_url = new_url; + thumbnail_url, + )).unwrap(); + info.thumbnail_url = Some(new_url.to_string()); } video_event.info = Some(info); } diff --git a/src/app/matrix/sync.rs b/src/app/matrix/sync.rs @@ -106,11 +106,10 @@ impl Sync { let (avatar_url, room_name, displayname) = { let room = room.read().await; - ( - get_sender_avatar(homeserver_url, &room, &cloned_event), + get_sender_avatar(&homeserver_url, &room, &cloned_event), room.display_name(), - get_sender_displayname(&room, &cloned_event), + get_sender_displayname(&room, &cloned_event).to_string(), ) }; @@ -132,7 +131,7 @@ impl Sync { *image_url = get_media_download_url( self.matrix_client.clone().homeserver(), old_image_url, - ); + ).to_string(); } if let Some(info) = &mut image_event.info { @@ -141,7 +140,7 @@ impl Sync { *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), old_thumbnail_url, - ); + ).to_string(); } } } @@ -151,7 +150,7 @@ impl Sync { *video_url = get_video_media_download_url( self.matrix_client.clone().homeserver(), old_video_url, - ); + ).to_string(); } if let Some(info) = &mut video_event.info { @@ -160,7 +159,7 @@ impl Sync { *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), old_thumbnail_url, - ); + ).to_string(); } } } diff --git a/src/app/matrix/types.rs b/src/app/matrix/types.rs @@ -1,6 +1,6 @@ use url::Url; -pub fn get_media_download_url(homeserver: &Url, mxc_url: String) -> String { +pub fn get_media_download_url(homeserver: &Url, mxc_url: String) -> Url { let url_parts_raw = mxc_url.replace("mxc://", ""); let url_parts: Vec<&str> = url_parts_raw.split('/').collect(); let server_name = (*url_parts.first().unwrap()).to_string(); @@ -11,10 +11,10 @@ pub fn get_media_download_url(homeserver: &Url, mxc_url: String) -> String { ); let mut new_url = homeserver.clone(); new_url.set_path(new_path.as_str()); - new_url.to_string() + new_url } -pub fn get_video_media_download_url(homeserver: &Url, mxc_url: String) -> String { +pub fn get_video_media_download_url(homeserver: &Url, mxc_url: String) -> Url { let url_parts_raw = mxc_url.replace("mxc://", ""); let url_parts: Vec<&str> = url_parts_raw.split('/').collect(); let server_name = (*url_parts.first().unwrap()).to_string(); @@ -25,5 +25,5 @@ pub fn get_video_media_download_url(homeserver: &Url, mxc_url: String) -> String ); let mut new_url = homeserver.clone(); new_url.set_path(new_path.as_str()); - new_url.to_string() + new_url } diff --git a/src/utils/notifications.rs b/src/utils/notifications.rs @@ -1,16 +1,17 @@ use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use web_sys::{Notification, NotificationOptions, NotificationPermission}; +use url::Url; #[derive(Clone)] pub(crate) struct Notifications { - avatar: Option<String>, + avatar: Option<Url>, displayname: String, content: String, } impl Notifications { - pub fn new(avatar: Option<String>, displayname: String, content: String) -> Self { + pub fn new(avatar: Option<Url>, displayname: String, content: String) -> Self { Notifications { avatar, displayname, @@ -44,12 +45,14 @@ impl Notifications { } fn show_actual(&self) { - let mut options = NotificationOptions::new() as NotificationOptions; - let options = options.body(&self.content).tag("daydream") as &mut NotificationOptions; - let options = if self.avatar.is_some() { - options.icon(self.avatar.as_ref().unwrap()) - } else { - options + let mut options_0 = NotificationOptions::new() as NotificationOptions; + let options_1 = options_0.body(&self.content).tag("daydream") as &mut NotificationOptions; + let options = match self.clone().avatar { + None => options_1, + Some(avatar) => { + let url = avatar.to_string(); + options_1.icon(&url) + }, }; if let Err(_e) = Notification::new_with_options(&self.displayname, &options) { // Noop to please clippy/rust compiler