Skip to content

Commit 8831833

Browse files
committed
matrix_sdk_base: room: add direct_target field
Rooms marked as "direct" are associated a user_id in "m.direct" events. Clients could want to handle these separately
1 parent 7d023eb commit 8831833

File tree

4 files changed

+41
-1
lines changed

4 files changed

+41
-1
lines changed

matrix_sdk_base/src/client.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use matrix_sdk_common::locks::Mutex;
2727
use matrix_sdk_common::{
2828
api::r0 as api,
2929
events::{
30-
ignored_user_list::IgnoredUserListEvent, push_rules::PushRulesEvent,
30+
direct::DirectEvent, ignored_user_list::IgnoredUserListEvent, push_rules::PushRulesEvent,
3131
room::member::MemberEventContent, AnyBasicEvent, AnyStrippedStateEvent,
3232
AnySyncEphemeralRoomEvent, AnySyncMessageEvent, AnySyncRoomEvent, AnySyncStateEvent,
3333
},
@@ -695,6 +695,24 @@ impl BaseClient {
695695
// }
696696
}
697697

698+
/// Handle a m.direct event, updating rooms states if necessary.
699+
///
700+
/// Returns true if any room changed, false otherwise.
701+
pub(crate) async fn handle_direct(&self, event: &DirectEvent) -> bool {
702+
let mut update = false;
703+
for (user_id, rooms) in event.content.iter() {
704+
for room_id in rooms.iter() {
705+
if let Some(room) = self.get_joined_room(room_id).await {
706+
let mut room = room.write().await;
707+
if room.handle_direct(user_id) {
708+
update = true;
709+
}
710+
}
711+
}
712+
}
713+
update
714+
}
715+
698716
/// Receive a timeline event for a joined room and update the client state.
699717
///
700718
/// Returns a bool, true when the `Room` state has been updated.
@@ -888,6 +906,7 @@ impl BaseClient {
888906
match event {
889907
AnyBasicEvent::IgnoredUserList(event) => self.handle_ignored_users(event).await,
890908
AnyBasicEvent::PushRules(event) => self.handle_push_rules(event).await,
909+
AnyBasicEvent::Direct(event) => self.handle_direct(event).await,
891910
_ => false,
892911
}
893912
}

matrix_sdk_base/src/models/message.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ mod test {
206206
},
207207
"own_user_id": "@example:example.com",
208208
"creator": null,
209+
"direct_target": null,
209210
"joined_members": {},
210211
"invited_members": {},
211212
"messages": [ msg ],
@@ -253,6 +254,7 @@ mod test {
253254
},
254255
"own_user_id": "@example:example.com",
255256
"creator": null,
257+
"direct_target": null,
256258
"joined_members": {},
257259
"invited_members": {},
258260
"messages": [ msg ],

matrix_sdk_base/src/models/room.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ pub struct Room {
190190
pub own_user_id: UserId,
191191
/// The mxid of the room creator.
192192
pub creator: Option<UserId>,
193+
/// The mxid of the "direct" target if any
194+
pub direct_target: Option<UserId>,
193195
// TODO: Track banned members, e.g. for /unban support?
194196
/// The map of invited room members.
195197
pub invited_members: HashMap<UserId, RoomMember>,
@@ -312,6 +314,7 @@ impl Room {
312314
room_name: RoomName::default(),
313315
own_user_id: own_user_id.clone(),
314316
creator: None,
317+
direct_target: None,
315318
invited_members: HashMap::new(),
316319
joined_members: HashMap::new(),
317320
#[cfg(feature = "messages")]
@@ -799,6 +802,20 @@ impl Room {
799802
true
800803
}
801804

805+
/// Handle setting direct attribute as part of a m.direct event,
806+
/// updating the room if necessary
807+
///
808+
/// Returns true if the direct_target changed, false otherwise.
809+
pub fn handle_direct(&mut self, user_id: &UserId) -> bool {
810+
if let Some(old_target) = &self.direct_target {
811+
if old_target == user_id {
812+
return false;
813+
}
814+
}
815+
self.direct_target = Some(user_id.clone());
816+
true
817+
}
818+
802819
fn handle_encryption_event(&mut self, event: &SyncStateEvent<EncryptionEventContent>) -> bool {
803820
self.encrypted = Some(event.into());
804821
true

matrix_sdk_base/src/state/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ mod test {
160160
},
161161
"own_user_id": "@example:example.com",
162162
"creator": null,
163+
"direct_target": null,
163164
"joined_members": {},
164165
"invited_members": {},
165166
"typing_users": [],
@@ -188,6 +189,7 @@ mod test {
188189
},
189190
"own_user_id": "@example:example.com",
190191
"creator": null,
192+
"direct_target": null,
191193
"joined_members": {},
192194
"invited_members": {},
193195
"messages": [],

0 commit comments

Comments
 (0)