[fractal] Get room avatars through matrix-sdk
- From: Alexandre Franke <afranke src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] Get room avatars through matrix-sdk
- Date: Tue, 1 Dec 2020 20:22:00 +0000 (UTC)
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, ¶ms, &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]