diff --git a/matrix_sdk/src/client.rs b/matrix_sdk/src/client.rs index 195a4a28..06bbed1d 100644 --- a/matrix_sdk/src/client.rs +++ b/matrix_sdk/src/client.rs @@ -74,7 +74,7 @@ use matrix_sdk_common::{ join_room_by_id, join_room_by_id_or_alias, kick_user, leave_room, Invite3pid, }, message::{get_message_events, send_message_event}, - profile::{get_display_name, set_display_name}, + profile::{get_avatar_url, get_display_name, set_avatar_url, set_display_name}, read_marker::set_read_marker, receipt::create_receipt, room::create_room, @@ -478,6 +478,69 @@ impl Client { Ok(()) } + /// Gets the mxc avatar url of the owner of the client, if set. + /// + /// # Example + /// ```no_run + /// # use futures::executor::block_on; + /// # use matrix_sdk::Client; + /// # use url::Url; + /// # let homeserver = Url::parse("http://example.com").unwrap(); + /// # block_on(async { + /// # let user = "example"; + /// let client = Client::new(homeserver).unwrap(); + /// client.login(user, "password", None, None).await.unwrap(); + /// + /// if let Some(url) = client.avatar_url().await.unwrap() { + /// println!("Your avatar's mxc url is {}", url); + /// } + /// # }) + /// ``` + pub async fn avatar_url(&self) -> Result> { + let user_id = self.user_id().await.ok_or(Error::AuthenticationRequired)?; + let request = get_avatar_url::Request::new(&user_id); + let response = self.send(request).await?; + Ok(response.avatar_url) + } + + /// Sets the mxc avatar url of the client's owner. The avatar gets unset if `url` is `None`. + pub async fn set_avatar_url(&self, url: Option<&str>) -> Result<()> { + let user_id = self.user_id().await.ok_or(Error::AuthenticationRequired)?; + let request = set_avatar_url::Request::new(&user_id, url); + self.send(request).await?; + Ok(()) + } + + /// Upload and set the owning client's avatar. + /// + /// The will upload the data produced by the reader to the homeserver's content repository, and + /// set the user's avatar to the mxc url for the uploaded file. + /// + /// This is a convenience method for calling [`upload()`](#method.upload), followed by + /// [`set_avatar_url()`](#method.set_avatar_url). + /// + /// # Example + /// ```no_run + /// # use std::{path::Path, fs::File, io::Read}; + /// # use futures::executor::block_on; + /// # use matrix_sdk::Client; + /// # use url::Url; + /// # block_on(async { + /// # let homeserver = Url::parse("http://locahost:8080").unwrap(); + /// # let client = Client::new(homeserver).unwrap(); + /// let path = Path::new("/home/example/selfie.jpg"); + /// let mut image = File::open(&path).unwrap(); + /// + /// client.upload_avatar(&mime::IMAGE_JPEG, &mut image).await.expect("Can't set avatar"); + /// # }) + /// ``` + pub async fn upload_avatar(&self, content_type: &Mime, reader: &mut R) -> Result<()> { + let upload_response = self.upload(content_type, reader).await?; + self.set_avatar_url(Some(&upload_response.content_uri)) + .await?; + Ok(()) + } + /// Add `EventEmitter` to `Client`. /// /// The methods of `EventEmitter` are called when the respective `RoomEvents` occur.