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 7b90ee745d7d2805c7edcd9eb408b8043dfdde33
parent 6dcaaa1d8a153712aab188d11dea80885bca358d
Author: Marcel <mtrnord1@gmail.com>
Date:   Fri, 10 Jul 2020 17:31:40 +0200

Some more migration to the monorepo

Took 39 minutes

Diffstat:
Msrc/app/components/event_list.rs | 95++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/app/components/events/image.rs | 9++++++---
Msrc/app/components/events/mod.rs | 32++++++++++++++++++++------------
Msrc/app/components/events/notice.rs | 9++++++---
Msrc/app/components/events/text.rs | 9++++++---
Msrc/app/components/events/video.rs | 9++++++---
Msrc/app/components/room_list/item.rs | 10++++++++--
Msrc/app/matrix/mod.rs | 30+++++++++++++++++-------------
Msrc/app/matrix/sync.rs | 22++++++++++++----------
Msrc/utils/notifications.rs | 8+++++---
10 files changed, 136 insertions(+), 97 deletions(-)

diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, rc::Rc}; use log::*; use matrix_sdk::{ - events::room::message::{MessageEvent, MessageEventContent}, + events::{room::message::MessageEventContent, AnyMessageEventContent, AnyMessageEventStub}, identifiers::RoomId, Room, }; @@ -24,7 +24,7 @@ pub struct EventList { #[derive(Default)] pub struct State { // TODO handle all events - pub events: HashMap<RoomId, Vec<MessageEvent>>, + pub events: HashMap<RoomId, Vec<AnyMessageEventStub>>, } #[allow(clippy::large_enum_variant)] @@ -74,7 +74,7 @@ impl Component for EventList { if self.state.events.contains_key(&room_id) { if !(self.state.events[&room_id] .iter() - .any(|x| x.event_id == msg.event_id)) + .any(|x| x.event_id() == msg.event_id())) { self.state.events.get_mut(&room_id).unwrap().push(msg); room_id == self.props.current_room.room_id @@ -91,7 +91,7 @@ impl Component for EventList { } } Response::OldMessages((room_id, messages)) => { - let mut deserialized_messages: Vec<MessageEvent> = messages + let mut deserialized_messages: Vec<AnyMessageEventStub> = messages .iter() .map(|x| x.deserialize()) .filter_map(Result::ok) @@ -175,53 +175,58 @@ impl Component for EventList { impl EventList { // Typeinspection of IDEA breaks with this :D //noinspection RsTypeCheck - fn get_event(&self, prev_event: Option<MessageEvent>, event: &MessageEvent) -> Html { + fn get_event( + &self, + prev_event: Option<AnyMessageEventStub>, + event: &AnyMessageEventStub, + ) -> Html { // TODO make encryption supported - match &event.content { - MessageEventContent::Text(text_event) => { - html! { - <Text - prev_event=prev_event.clone() - event=event.clone() - room=self.props.current_room.clone() - text_event=text_event.clone() - /> + match &event.content() { + AnyMessageEventContent::RoomMessage(room_message) => match room_message { + MessageEventContent::Text(text_event) => { + html! { + <Text + prev_event=prev_event.clone() + event=event.clone() + room=self.props.current_room.clone() + text_event=text_event.clone() + /> + } } - } - MessageEventContent::Notice(notice_event) => { - html! { - <Notice - prev_event=prev_event.clone() - event=event.clone() - room=self.props.current_room.clone() - notice_event=notice_event.clone() - /> + MessageEventContent::Notice(notice_event) => { + html! { + <Notice + prev_event=prev_event.clone() + event=event.clone() + room=self.props.current_room.clone() + notice_event=notice_event.clone() + /> + } } - } - MessageEventContent::Image(image_event) => { - html! { - <Image - prev_event=prev_event.clone() - event=event.clone() - room=self.props.current_room.clone() - image_event=image_event.clone() - /> + MessageEventContent::Image(image_event) => { + html! { + <Image + prev_event=prev_event.clone() + event=event.clone() + room=self.props.current_room.clone() + image_event=image_event.clone() + /> + } } - } - MessageEventContent::Video(video_event) => { - html! { - <Video - prev_event=prev_event.clone() - event=event.clone() - room=self.props.current_room.clone() - video_event=video_event.clone() - /> + MessageEventContent::Video(video_event) => { + html! { + <Video + prev_event=prev_event.clone() + event=event.clone() + room=self.props.current_room.clone() + video_event=video_event.clone() + /> + } } - } - _ => { - html! {} - } + _ => html! {}, + }, + _ => html! {}, } } } diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs @@ -2,7 +2,10 @@ use std::rc::Rc; use crate::app::components::events::{get_sender_displayname, is_new_user}; use matrix_sdk::{ - events::room::message::{ImageMessageEventContent, MessageEvent}, + events::{ + room::message::{ImageMessageEventContent, MessageEvent}, + AnyMessageEventStub, + }, Room, }; use rand::random; @@ -15,8 +18,8 @@ pub(crate) struct Image { #[derive(Clone, Properties, Debug)] pub struct Props { #[prop_or_default] - pub prev_event: Option<MessageEvent>, - pub event: MessageEvent, + pub prev_event: Option<AnyMessageEventStub>, + pub event: AnyMessageEventStub, pub image_event: ImageMessageEventContent, pub room: Rc<Room>, } diff --git a/src/app/components/events/mod.rs b/src/app/components/events/mod.rs @@ -1,34 +1,42 @@ -use crate::app::matrix::types::get_media_download_url; -use matrix_sdk::events::{MessageEventStub, MessageEventContent}; +use matrix_sdk::events::AnyMessageEventStub; use matrix_sdk::Room; use url::Url; +use crate::app::matrix::types::get_media_download_url; + pub mod image; pub mod notice; pub mod text; pub mod video; -pub fn is_new_user<C: MessageEventContent>(prev_event: Option<&MessageEventStub<C>>, event: &MessageEventStub<C>) -> bool { +pub fn is_new_user(prev_event: Option<&AnyMessageEventStub>, event: &AnyMessageEventStub) -> bool { if let Some(prev_event) = prev_event { - prev_event.sender != event.sender + prev_event.sender() != event.sender() } else { true } } -pub fn get_sender_displayname<'a, C: MessageEventContent>(room: &'a Room, event: &'a MessageEventStub<C>) -> &'a str { +pub fn get_sender_displayname<'a>(room: &'a Room, event: &'a AnyMessageEventStub) -> &'a str { room.joined_members - .get(&event.sender) - .or_else(|| room.invited_members.get(&event.sender)) + .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_deref()) + .unwrap_or_else(|| event.sender().as_str()) } -pub fn get_sender_avatar<'a, C: MessageEventContent>(homeserver_url: &'a Url, room: &'a Room, event: &'a MessageEventStub<C>) -> Option<Url> { +pub fn get_sender_avatar<'a>( + homeserver_url: &'a Url, + room: &'a Room, + event: &'a AnyMessageEventStub, +) -> Option<Url> { let member = room .joined_members - .get(&event.sender) - .or_else(|| room.invited_members.get(&event.sender))?; + .get(&event.sender()) + .or_else(|| room.invited_members.get(&event.sender()))?; - Some(get_media_download_url(homeserver_url, member.avatar_url.as_deref()?)) + Some(get_media_download_url( + homeserver_url, + member.avatar_url.as_deref()?, + )) } diff --git a/src/app/components/events/notice.rs b/src/app/components/events/notice.rs @@ -2,7 +2,10 @@ use std::rc::Rc; use linkify::LinkFinder; use matrix_sdk::{ - events::room::message::{MessageEvent, NoticeMessageEventContent}, + events::{ + room::message::{MessageEvent, NoticeMessageEventContent}, + AnyMessageEventStub, + }, Room, }; use web_sys::Node; @@ -18,8 +21,8 @@ pub(crate) struct Notice { #[derive(Clone, Properties, Debug)] pub struct Props { #[prop_or_default] - pub prev_event: Option<MessageEvent>, - pub event: MessageEvent, + pub prev_event: Option<AnyMessageEventStub>, + pub event: AnyMessageEventStub, pub notice_event: NoticeMessageEventContent, pub room: Rc<Room>, } diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs @@ -3,7 +3,10 @@ use std::rc::Rc; use crate::app::components::events::{get_sender_displayname, is_new_user}; use linkify::LinkFinder; use matrix_sdk::{ - events::room::message::{MessageEvent, TextMessageEventContent}, + events::{ + room::message::{MessageEvent, TextMessageEventContent}, + AnyMessageEventStub, + }, Room, }; use web_sys::Node; @@ -17,8 +20,8 @@ pub struct Text { #[derive(Clone, Properties, Debug)] pub struct Props { #[prop_or_default] - pub prev_event: Option<MessageEvent>, - pub event: MessageEvent, + pub prev_event: Option<AnyMessageEventStub>, + pub event: AnyMessageEventStub, pub text_event: TextMessageEventContent, pub room: Rc<Room>, } diff --git a/src/app/components/events/video.rs b/src/app/components/events/video.rs @@ -2,7 +2,10 @@ use std::rc::Rc; use crate::app::components::events::{get_sender_displayname, is_new_user}; use matrix_sdk::{ - events::room::message::{MessageEvent, VideoMessageEventContent}, + events::{ + room::message::{MessageEvent, VideoMessageEventContent}, + AnyMessageEventStub, + }, Room, }; use rand::random; @@ -15,8 +18,8 @@ pub(crate) struct Video { #[derive(Clone, Properties, Debug)] pub struct Props { #[prop_or_default] - pub prev_event: Option<MessageEvent>, - pub event: MessageEvent, + pub prev_event: Option<AnyMessageEventStub>, + pub event: AnyMessageEventStub, pub video_event: VideoMessageEventContent, pub room: Rc<Room>, } diff --git a/src/app/components/room_list/item.rs b/src/app/components/room_list/item.rs @@ -1,6 +1,10 @@ use std::rc::Rc; -use matrix_sdk::{events::room::message::MessageEventContent, identifiers::RoomId, Room}; +use matrix_sdk::{ + events::{room::message::MessageEventContent, AnyMessageEventContent}, + identifiers::RoomId, + Room, +}; use yew::prelude::*; use yewtil::NeqAssign; @@ -50,7 +54,9 @@ impl Component for RoomItem { let last_message = match room.messages.iter().last() { None => "".to_string(), Some(m) => { - if let MessageEventContent::Text(text_event) = m.content.clone() { + if let AnyMessageEventContent::RoomMessage(MessageEventContent::Text(text_event)) = + m.content.clone() + { text_event.body.clone() } else { "".to_string() diff --git a/src/app/matrix/mod.rs b/src/app/matrix/mod.rs @@ -5,12 +5,11 @@ use log::*; use matrix_sdk::{ api::r0::{filter::RoomEventFilter, message::get_message_events::Direction}, events::{ - AnyRoomEvent, room::message::{ FormattedBody, MessageEvent, MessageEventContent, MessageFormat, TextMessageEventContent, }, - EventJson, + AnyMessageEventStub, AnyRoomEvent, EventJson, AnyMessageEvent, }, identifiers::RoomId, locks::RwLock, @@ -66,7 +65,7 @@ pub enum Response { Error(MatrixError), LoggedIn(bool), // TODO properly handle sync events - Sync((RoomId, EventJson<MessageEvent>)), + Sync((RoomId, EventJson<AnyMessageEventStub>)), JoinedRoomSync(RoomId), SyncPing, OldMessages((RoomId, Vec<EventJson<MessageEvent>>)), @@ -256,13 +255,16 @@ impl Agent for MatrixAgent { spawn_local(async move { 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()), + 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()]), @@ -272,7 +274,8 @@ impl Agent for MatrixAgent { builder = (*builder .filter(filter) .direction(Direction::Backward) - .limit(30)).clone(); + .limit(30)) + .clone(); // TODO handle error gracefully let messsages = agent @@ -296,7 +299,7 @@ impl Agent for MatrixAgent { for event in deserialized_events.into_iter().rev() { // TODO deduplicate betweeen this and sync - if let AnyRoomEvent::RoomMessage(mut event) = event { + if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(mut event)) = event { if let MessageEventContent::Image(mut image_event) = event.clone().content { @@ -332,7 +335,8 @@ impl Agent for MatrixAgent { let new_url = Some(get_media_download_url( agent.matrix_client.as_ref().unwrap().homeserver(), &thumbnail_url, - )).unwrap(); + )) + .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 @@ -7,11 +7,8 @@ use log::*; use matrix_sdk::{ api::r0::sync::sync_events::Response as SyncResponse, events::{ - AnyRoomEventStub, - AnyStateEventStub, - AnyMessageEventStub, - room::message::MessageEventContent, - EventJson, + room::message::MessageEventContent, AnyMessageEventStub, AnyRoomEventStub, + AnyStateEventStub, EventJson, }, identifiers::RoomId, locks::RwLock, @@ -84,7 +81,8 @@ impl Sync { async fn on_room_message(&self, room_id: &RoomId, event: AnyRoomEventStub) { // TODO handle all messages... - if let AnyRoomEventStub::State(AnyStateEventStub::RoomCreate(_create_event)) = event.clone() { + if let AnyRoomEventStub::State(AnyStateEventStub::RoomCreate(_create_event)) = event.clone() + { info!("Sent JoinedRoomSync Timeline"); let resp = Response::JoinedRoomSync(room_id.clone()); self.callback.emit(resp); @@ -133,7 +131,8 @@ impl Sync { *image_url = get_media_download_url( self.matrix_client.clone().homeserver(), &old_image_url, - ).to_string(); + ) + .to_string(); } if let Some(info) = &mut image_event.info { @@ -142,7 +141,8 @@ impl Sync { *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), &old_thumbnail_url, - ).to_string(); + ) + .to_string(); } } } @@ -152,7 +152,8 @@ impl Sync { *video_url = get_video_media_download_url( self.matrix_client.clone().homeserver(), old_video_url, - ).to_string(); + ) + .to_string(); } if let Some(info) = &mut video_event.info { @@ -161,7 +162,8 @@ impl Sync { *thumbnail_url = get_media_download_url( self.matrix_client.clone().homeserver(), &old_thumbnail_url, - ).to_string(); + ) + .to_string(); } } } diff --git a/src/utils/notifications.rs b/src/utils/notifications.rs @@ -1,7 +1,7 @@ +use url::Url; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use web_sys::{Notification, NotificationOptions, NotificationPermission}; -use url::Url; #[derive(Clone)] pub(crate) struct Notifications { @@ -35,7 +35,9 @@ impl Notifications { } }) as Box<dyn FnMut()>); - if let Err(_e) = Notification::request_permission_with_permission_callback(cb.as_ref().unchecked_ref()) { + if let Err(_e) = Notification::request_permission_with_permission_callback( + cb.as_ref().unchecked_ref(), + ) { // Noop to please clippy/rust compiler } cb.forget(); @@ -52,7 +54,7 @@ impl Notifications { 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