[fractal] Get room avatars through matrix-sdk



commit ce44018adc42cebaf88cd39e541fa3155c247ab1
Author: Alejandro Domínguez <adomu net-c com>
Date:   Mon Sep 7 05:33:53 2020 +0200

    Get room avatars through matrix-sdk

 fractal-gtk/src/appop/room.rs                      | 25 +++++------
 fractal-gtk/src/backend/room.rs                    | 51 ++++++++++++++--------
 fractal-gtk/src/widgets/room_settings.rs           |  9 ++--
 fractal-matrix-api/src/meson.build                 |  2 -
 fractal-matrix-api/src/r0.rs                       |  1 -
 fractal-matrix-api/src/r0/state.rs                 |  1 -
 .../src/r0/state/get_state_events_for_key.rs       | 29 ------------
 7 files changed, 48 insertions(+), 70 deletions(-)
---
diff --git a/fractal-gtk/src/appop/room.rs b/fractal-gtk/src/appop/room.rs
index a0034eb2..7a2c9929 100644
--- a/fractal-gtk/src/appop/room.rs
+++ b/fractal-gtk/src/appop/room.rs
@@ -96,10 +96,9 @@ impl AppOp {
                 // Download the room avatar
                 // TODO: Use the avatar url returned by sync
                 let session_client = login_data.session_client.clone();
-                let access_token = login_data.access_token.clone();
                 let room_id = room.id.clone();
-                thread::spawn(move || {
-                    match room::get_room_avatar(session_client, access_token, room_id) {
+                RUNTIME.spawn(async move {
+                    match room::get_room_avatar(session_client, room_id).await {
                         Ok((room, avatar)) => {
                             APPOP!(set_room_avatar, (room, avatar));
                         }
@@ -247,18 +246,17 @@ impl AppOp {
 
         // getting room details
         let session_client = login_data.session_client.clone();
-        let access_token = login_data.access_token.clone();
         let a_room = active_room.clone();
-        thread::spawn(
-            move || match room::get_room_avatar(session_client, access_token, a_room) {
+        RUNTIME.spawn(async move {
+            match room::get_room_avatar(session_client, a_room).await {
                 Ok((room, avatar)) => {
                     APPOP!(set_room_avatar, (room, avatar));
                 }
                 Err(err) => {
                     err.handle_error();
                 }
-            },
-        );
+            }
+        });
 
         let session_client = login_data.session_client.clone();
         let a_room = active_room.clone();
@@ -684,17 +682,14 @@ impl AppOp {
     }
 
     pub fn new_room_avatar(&self, room_id: RoomId) {
-        let login_data = unwrap_or_unit_return!(self.login_data.clone());
+        let session_client =
+            unwrap_or_unit_return!(self.login_data.as_ref().map(|ld| ld.session_client.clone()));
         if !self.rooms.contains_key(&room_id) {
             return;
         }
 
-        thread::spawn(move || {
-            match room::get_room_avatar(
-                login_data.session_client.clone(),
-                login_data.access_token,
-                room_id,
-            ) {
+        RUNTIME.spawn(async move {
+            match room::get_room_avatar(session_client, room_id).await {
                 Ok((room, avatar)) => {
                     APPOP!(set_room_avatar, (room, avatar));
                 }
diff --git a/fractal-gtk/src/backend/room.rs b/fractal-gtk/src/backend/room.rs
index ff0ae865..66c2ef35 100644
--- a/fractal-gtk/src/backend/room.rs
+++ b/fractal-gtk/src/backend/room.rs
@@ -19,7 +19,6 @@ use std::time::Duration;
 use crate::globals;
 
 use crate::actions::AppState;
-use crate::app::RUNTIME;
 use crate::backend::{MediaError, HTTP_CLIENT};
 use crate::util::cache_dir_path;
 
@@ -66,8 +65,6 @@ use fractal_api::r0::pushrules::get_room_rules::request as get_room_rules;
 use fractal_api::r0::pushrules::get_room_rules::Parameters as GetRoomRulesParams;
 use fractal_api::r0::pushrules::set_room_rules::request as set_room_rules;
 use fractal_api::r0::pushrules::set_room_rules::Parameters as SetRoomRulesParams;
-use fractal_api::r0::state::get_state_events_for_key::request as get_state_events_for_key;
-use fractal_api::r0::state::get_state_events_for_key::Parameters as GetStateEventsForKeyParameters;
 use fractal_api::r0::sync::get_joined_members::request as get_joined_members;
 use fractal_api::r0::sync::get_joined_members::Parameters as JoinedMembersParameters;
 use fractal_api::r0::sync::get_joined_members::Response as JoinedMembersResponse;
@@ -141,13 +138,13 @@ pub async fn get_room_detail(
 
 #[derive(Debug)]
 pub enum RoomAvatarError {
-    Reqwest(ReqwestError),
+    Matrix(MatrixError),
     Download(MediaError),
 }
 
-impl From<ReqwestError> for RoomAvatarError {
-    fn from(err: ReqwestError) -> Self {
-        Self::Reqwest(err)
+impl From<MatrixError> for RoomAvatarError {
+    fn from(err: MatrixError) -> Self {
+        Self::Matrix(err)
     }
 }
 
@@ -157,29 +154,49 @@ impl From<MediaError> for RoomAvatarError {
     }
 }
 
+impl From<ParseJsonError> for RoomAvatarError {
+    fn from(err: ParseJsonError) -> Self {
+        Self::Matrix(err.into())
+    }
+}
+
 impl HandleError for RoomAvatarError {}
 
-pub fn get_room_avatar(
+pub async fn get_room_avatar(
     session_client: MatrixClient,
-    access_token: AccessToken,
     room_id: RoomId,
 ) -> Result<(RoomId, Option<Url>), RoomAvatarError> {
-    let base = session_client.homeserver().clone();
+    let request = GetStateEventForKeyRequest::new(&room_id, EventType::RoomAvatar, "");
 
-    let params = GetStateEventsForKeyParameters { access_token };
+    let response = match session_client.send(request).await {
+        Ok(response) => Some(response),
+        Err(MatrixError::RumaResponse(RumaResponseError::Http(ServerError::Known(
+            RumaClientError {
+                kind: RumaErrorKind::NotFound,
+                ..
+            },
+        )))) => None,
+        Err(err) => return Err(err.into()),
+    };
 
-    let request = get_state_events_for_key(base, &params, &room_id, "m.room.avatar")?;
-    let response: JsonValue = HTTP_CLIENT.get_client().execute(request)?.json()?;
+    let avatar = if let Some(res) = response {
+        serde_json::to_value(&res.content)?["url"]
+            .as_str()
+            .and_then(|s| Url::parse(s).ok())
+    } else {
+        None
+    };
 
-    let avatar = response["url"].as_str().and_then(|s| Url::parse(s).ok());
-    let dest = cache_dir_path(None, &room_id.to_string()).ok();
     if let Some(ref avatar) = avatar {
-        RUNTIME.handle().block_on(dw_media(
+        let dest = cache_dir_path(None, room_id.as_str()).ok();
+
+        dw_media(
             session_client,
             avatar,
             ContentType::default_thumbnail(),
             dest,
-        ))?;
+        )
+        .await?;
     }
 
     Ok((room_id, avatar))
diff --git a/fractal-gtk/src/widgets/room_settings.rs b/fractal-gtk/src/widgets/room_settings.rs
index f0900aa9..73781bd9 100644
--- a/fractal-gtk/src/widgets/room_settings.rs
+++ b/fractal-gtk/src/widgets/room_settings.rs
@@ -439,18 +439,17 @@ impl RoomSettings {
             }
         }
 
-        let access_token = self.access_token.clone();
         let room_id = self.room.id.clone();
-        thread::spawn(
-            move || match room::get_room_avatar(session_client, access_token, room_id) {
+        RUNTIME.spawn(async move {
+            match room::get_room_avatar(session_client, room_id).await {
                 Ok((room, avatar)) => {
                     APPOP!(set_room_avatar, (room, avatar));
                 }
                 Err(err) => {
                     err.handle_error();
                 }
-            },
-        );
+            }
+        });
         let image = widgets::Avatar::avatar_new(Some(100));
         let _data = image.circle(
             self.room.id.to_string(),
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index 46e7bb71..f15e4f9f 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -17,7 +17,6 @@ api_sources = files(
   'r0/profile/set_avatar_url.rs',
   'r0/profile/set_display_name.rs',
   'r0/server/domain_info.rs',
-  'r0/state/get_state_events_for_key.rs',
   'r0/sync/get_joined_members.rs',
   'r0/sync/sync_events.rs',
   'r0/thirdparty/get_supported_protocols.rs',
@@ -27,7 +26,6 @@ api_sources = files(
   'r0/media.rs',
   'r0/profile.rs',
   'r0/server.rs',
-  'r0/state.rs',
   'r0/sync.rs',
   'r0/thirdparty.rs',
   'identity.rs',
diff --git a/fractal-matrix-api/src/r0.rs b/fractal-matrix-api/src/r0.rs
index 1595dfbe..c0a5a4e8 100644
--- a/fractal-matrix-api/src/r0.rs
+++ b/fractal-matrix-api/src/r0.rs
@@ -5,7 +5,6 @@ pub mod media;
 pub mod profile;
 pub mod pushrules;
 pub mod server;
-pub mod state;
 pub mod sync;
 pub mod thirdparty;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]