@@ -7,9 +7,12 @@ use ruma::{
7
7
membership:: { get_member_events, join_room_by_id, leave_room} ,
8
8
message:: get_message_events,
9
9
room:: get_room_event,
10
+ tag:: { create_tag, delete_tag} ,
10
11
} ,
11
12
events:: {
12
- room:: history_visibility:: HistoryVisibility , AnyStateEvent , AnySyncStateEvent , EventType ,
13
+ room:: history_visibility:: HistoryVisibility ,
14
+ tag:: { TagInfo , TagName } ,
15
+ AnyStateEvent , AnySyncStateEvent , EventType ,
13
16
} ,
14
17
serde:: Raw ,
15
18
EventId , UserId ,
@@ -18,7 +21,7 @@ use ruma::{
18
21
use crate :: {
19
22
media:: { MediaFormat , MediaRequest , MediaType } ,
20
23
room:: RoomType ,
21
- BaseRoom , Client , Result , RoomMember ,
24
+ BaseRoom , Client , HttpError , HttpResult , Result , RoomMember ,
22
25
} ;
23
26
24
27
/// A struct containing methods that are common for Joined, Invited and Left
@@ -444,4 +447,57 @@ impl Common {
444
447
445
448
Ok ( true )
446
449
}
450
+
451
+ /// Adds a tag to the room, or updates it if it already exists.
452
+ ///
453
+ /// Returns the [`create_tag::Response`] from the server.
454
+ ///
455
+ /// # Arguments
456
+ /// * `tag` - The tag to add or update.
457
+ ///
458
+ /// * `tag_info` - Information about the tag, generally containing the
459
+ /// `order` parameter.
460
+ ///
461
+ /// # Example
462
+ ///
463
+ /// ```no_run
464
+ /// # use std::str::FromStr;
465
+ /// # use ruma::events::tag::{TagInfo, TagName, UserTagName};
466
+ /// # futures::executor::block_on(async {
467
+ /// # let homeserver = url::Url::parse("http://localhost:8080")?;
468
+ /// # let mut client = matrix_sdk::Client::new(homeserver)?;
469
+ /// # let room_id = matrix_sdk::ruma::room_id!("!test:localhost");
470
+ /// use matrix_sdk::ruma::events::tag::TagInfo;
471
+ ///
472
+ /// if let Some(room) = client.get_joined_room(&room_id) {
473
+ /// let mut tag_info = TagInfo::new();
474
+ /// tag_info.order = Some(0.9);
475
+ /// let user_tag = UserTagName::from_str("u.work")?;
476
+ ///
477
+ /// room.set_tag(TagName::User(user_tag), tag_info ).await?;
478
+ /// }
479
+ /// # Result::<_, matrix_sdk::Error>::Ok(()) });
480
+ /// ```
481
+ pub async fn set_tag (
482
+ & self ,
483
+ tag : TagName ,
484
+ tag_info : TagInfo ,
485
+ ) -> HttpResult < create_tag:: Response > {
486
+ let user_id = self . client . user_id ( ) . await . ok_or ( HttpError :: AuthenticationRequired ) ?;
487
+ let request =
488
+ create_tag:: Request :: new ( & user_id, self . inner . room_id ( ) , tag. as_ref ( ) , tag_info) ;
489
+ self . client . send ( request, None ) . await
490
+ }
491
+
492
+ /// Removes a tag from the room.
493
+ ///
494
+ /// Returns the [`delete_tag::Response`] from the server.
495
+ ///
496
+ /// # Arguments
497
+ /// * `tag` - The tag to remove.
498
+ pub async fn remove_tag ( & self , tag : TagName ) -> HttpResult < delete_tag:: Response > {
499
+ let user_id = self . client . user_id ( ) . await . ok_or ( HttpError :: AuthenticationRequired ) ?;
500
+ let request = delete_tag:: Request :: new ( & user_id, self . inner . room_id ( ) , tag. as_ref ( ) ) ;
501
+ self . client . send ( request, None ) . await
502
+ }
447
503
}
0 commit comments