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 d820a910e7c91180c225b097d4c237c751063384
parent 7b90ee745d7d2805c7edcd9eb408b8043dfdde33
Author: Marcel <mtrnord1@gmail.com>
Date:   Fri, 10 Jul 2020 18:20:53 +0200

Some more migration to the monorepo

Took 26 minutes

Diffstat:
Msrc/app/components/event_list.rs | 5++++-
Msrc/app/components/events/image.rs | 11++++-------
Msrc/app/components/events/mod.rs | 69++++++++++++++++++++++++++++++++++++++++++++-------------------------
Msrc/app/components/events/notice.rs | 11++++-------
Msrc/app/components/events/text.rs | 11++++-------
Msrc/app/components/events/video.rs | 11++++-------
Msrc/app/matrix/mod.rs | 12+++++++-----
Msrc/app/matrix/sync.rs | 6+++---
8 files changed, 74 insertions(+), 62 deletions(-)

diff --git a/src/app/components/event_list.rs b/src/app/components/event_list.rs @@ -2,7 +2,10 @@ use std::{collections::HashMap, rc::Rc}; use log::*; use matrix_sdk::{ - events::{room::message::MessageEventContent, AnyMessageEventContent, AnyMessageEventStub}, + events::{ + room::message::MessageEventContent, AnyMessageEventContent, AnyMessageEventStub, + MessageEvent + }, identifiers::RoomId, Room, }; diff --git a/src/app/components/events/image.rs b/src/app/components/events/image.rs @@ -1,11 +1,8 @@ use std::rc::Rc; -use crate::app::components::events::{get_sender_displayname, is_new_user}; +use crate::app::components::events::{RoomExt, EventExt}; use matrix_sdk::{ - events::{ - room::message::{ImageMessageEventContent, MessageEvent}, - AnyMessageEventStub, - }, + events::{room::message::ImageMessageEventContent, AnyMessageEventStub}, Room, }; use rand::random; @@ -49,9 +46,9 @@ impl Component for Image { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); + let new_user = self.props.event.is_new_user(self.props.prev_event.as_ref()); let sender_displayname = if new_user { - get_sender_displayname(&self.props.room, &self.props.event) + self.props.room.get_sender_displayname(&self.props.event) } else { "" }; diff --git a/src/app/components/events/mod.rs b/src/app/components/events/mod.rs @@ -9,34 +9,53 @@ pub mod notice; pub mod text; pub mod video; -pub fn is_new_user(prev_event: Option<&AnyMessageEventStub>, event: &AnyMessageEventStub) -> bool { - if let Some(prev_event) = prev_event { - prev_event.sender() != event.sender() - } else { - true +pub trait EventExt { + fn is_new_user(&self, prev_event: Option<&AnyMessageEventStub>) -> bool; +} + +impl EventExt for AnyMessageEventStub { + fn is_new_user(&self, prev_event: Option<&AnyMessageEventStub>) -> bool { + if let Some(prev_event) = prev_event { + prev_event.sender() != self.sender() + } else { + true + } } } -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())) - .and_then(|member| member.display_name.as_deref()) - .unwrap_or_else(|| event.sender().as_str()) +pub trait RoomExt { + fn get_sender_displayname<'a>(&self, event: &'a AnyMessageEventStub) -> &'a str; + fn get_sender_avatar<'a>( + &self, + homeserver_url: &'a Url, + event: &'a AnyMessageEventStub, + ) -> 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()))?; - - Some(get_media_download_url( - homeserver_url, - member.avatar_url.as_deref()?, - )) +impl RoomExt for Room { + fn get_sender_displayname<'a>(&self, event: &'a AnyMessageEventStub) -> &'a str { + self.joined_members + .get(&event.sender()) + .or_else(|| self.invited_members.get(&event.sender())) + .and_then(|member| member.display_name.as_deref()) + .unwrap_or_else(|| event.sender().as_str()) + } + + fn get_sender_avatar<'a>( + &self, + homeserver_url: &'a Url, + event: &'a AnyMessageEventStub, + ) -> Option<Url> { + let member = self + .joined_members + .get(&event.sender()) + .or_else(|| self.invited_members.get(&event.sender()))?; + + 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,17 +2,14 @@ use std::rc::Rc; use linkify::LinkFinder; use matrix_sdk::{ - events::{ - room::message::{MessageEvent, NoticeMessageEventContent}, - AnyMessageEventStub, - }, + events::{room::message::NoticeMessageEventContent, AnyMessageEventStub}, Room, }; use web_sys::Node; use yew::prelude::*; use yew::virtual_dom::VNode; -use crate::app::components::events::{get_sender_displayname, is_new_user}; +use crate::app::components::events::{RoomExt, EventExt}; pub(crate) struct Notice { props: Props, @@ -52,9 +49,9 @@ impl Component for Notice { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); + let new_user = self.props.event.is_new_user(self.props.prev_event.as_ref()); let sender_displayname = if new_user { - get_sender_displayname(&self.props.room, &self.props.event) + self.props.room.get_sender_displayname(&self.props.event) } else { "" }; diff --git a/src/app/components/events/text.rs b/src/app/components/events/text.rs @@ -1,12 +1,9 @@ use std::rc::Rc; -use crate::app::components::events::{get_sender_displayname, is_new_user}; +use crate::app::components::events::{RoomExt, EventExt}; use linkify::LinkFinder; use matrix_sdk::{ - events::{ - room::message::{MessageEvent, TextMessageEventContent}, - AnyMessageEventStub, - }, + events::{room::message::TextMessageEventContent, AnyMessageEventStub}, Room, }; use web_sys::Node; @@ -51,9 +48,9 @@ impl Component for Text { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); + let new_user = self.props.event.is_new_user(self.props.prev_event.as_ref()); let sender_displayname = if new_user { - get_sender_displayname(&self.props.room, &self.props.event) + self.props.room.get_sender_displayname(&self.props.event) } else { "" }; diff --git a/src/app/components/events/video.rs b/src/app/components/events/video.rs @@ -1,11 +1,8 @@ use std::rc::Rc; -use crate::app::components::events::{get_sender_displayname, is_new_user}; +use crate::app::components::events::{RoomExt, EventExt}; use matrix_sdk::{ - events::{ - room::message::{MessageEvent, VideoMessageEventContent}, - AnyMessageEventStub, - }, + events::{room::message::VideoMessageEventContent, AnyMessageEventStub}, Room, }; use rand::random; @@ -49,9 +46,9 @@ impl Component for Video { //noinspection RsTypeCheck fn view(&self) -> Html { - let new_user = is_new_user(self.props.prev_event.as_ref(), &self.props.event); + let new_user = self.props.event.is_new_user(self.props.prev_event.as_ref()); let sender_displayname = if new_user { - get_sender_displayname(&self.props.room, &self.props.event) + self.props.room.get_sender_displayname(&self.props.event) } else { "" }; diff --git a/src/app/matrix/mod.rs b/src/app/matrix/mod.rs @@ -9,7 +9,7 @@ use matrix_sdk::{ FormattedBody, MessageEvent, MessageEventContent, MessageFormat, TextMessageEventContent, }, - AnyMessageEventStub, AnyRoomEvent, EventJson, AnyMessageEvent, + AnyMessageEvent, AnyMessageEventStub, AnyRoomEvent, EventJson, }, identifiers::RoomId, locks::RwLock, @@ -275,7 +275,7 @@ impl Agent for MatrixAgent { .filter(filter) .direction(Direction::Backward) .limit(30)) - .clone(); + .clone(); // TODO handle error gracefully let messsages = agent @@ -299,9 +299,11 @@ impl Agent for MatrixAgent { for event in deserialized_events.into_iter().rev() { // TODO deduplicate betweeen this and sync - if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(mut event)) = event { + if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(mut event)) = + event + { if let MessageEventContent::Image(mut image_event) = - event.clone().content + event.clone().content { if let Some(image_event_url) = image_event.url { let new_url = get_media_download_url( @@ -336,7 +338,7 @@ impl Agent for MatrixAgent { 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 @@ -19,7 +19,7 @@ use yew::Callback; use lazy_static::lazy_static; -use crate::app::components::events::{get_sender_avatar, get_sender_displayname}; +use crate::app::components::events::{RoomExt}; use crate::app::matrix::types::{get_media_download_url, get_video_media_download_url}; use crate::app::matrix::Response; use crate::utils::notifications::Notifications; @@ -107,9 +107,9 @@ impl Sync { let (avatar_url, room_name, displayname) = { let room = room.read().await; ( - get_sender_avatar(&homeserver_url, &room, &cloned_event), + room.get_sender_avatar(&homeserver_url, &AnyMessageEventStub::RoomMessage(cloned_event)), room.display_name(), - get_sender_displayname(&room, &cloned_event).to_string(), + room.get_sender_displayname(&AnyMessageEventStub::RoomMessage(cloned_event)).to_string(), ) };