Add methods for setting, getting and uploading avatar
@@ -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<Option<String>> {
+ 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<R: Read>(&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.
