Skip to content

Commit e53eaf4

Browse files
committed
refactor: Fetch the ignored user list account data from the store for Client::is_user_ignored
Also move it to `BaseClient` instead.
1 parent a3725b6 commit e53eaf4

File tree

4 files changed

+80
-99
lines changed

4 files changed

+80
-99
lines changed

crates/matrix-sdk-base/src/client.rs

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,19 @@ use ruma::DeviceId;
3636
use ruma::{
3737
api::client::{self as api, sync::sync_events::v5},
3838
events::{
39+
ignored_user_list::IgnoredUserListEventContent,
3940
push_rules::{PushRulesEvent, PushRulesEventContent},
4041
room::member::SyncRoomMemberEvent,
4142
StateEvent, StateEventType,
4243
},
4344
push::Ruleset,
4445
time::Instant,
45-
OwnedRoomId, OwnedUserId, RoomId,
46+
OwnedRoomId, OwnedUserId, RoomId, UserId,
4647
};
4748
use tokio::sync::{broadcast, Mutex};
4849
#[cfg(feature = "e2e-encryption")]
4950
use tokio::sync::{RwLock, RwLockReadGuard};
50-
use tracing::{debug, enabled, info, instrument, Level};
51+
use tracing::{debug, enabled, info, instrument, warn, Level};
5152

5253
#[cfg(feature = "e2e-encryption")]
5354
use crate::RoomMemberships;
@@ -960,6 +961,27 @@ impl BaseClient {
960961
pub fn room_info_notable_update_receiver(&self) -> broadcast::Receiver<RoomInfoNotableUpdate> {
961962
self.room_info_notable_update_sender.subscribe()
962963
}
964+
965+
/// Checks whether the provided `user_id` belongs to an ignored user.
966+
pub async fn is_user_ignored(&self, user_id: &UserId) -> bool {
967+
match self.state_store.get_account_data_event_static::<IgnoredUserListEventContent>().await
968+
{
969+
Ok(Some(raw_ignored_user_list)) => match raw_ignored_user_list.deserialize() {
970+
Ok(current_ignored_user_list) => {
971+
current_ignored_user_list.content.ignored_users.contains_key(user_id)
972+
}
973+
Err(error) => {
974+
warn!(?error, "Failed to deserialize the ignored user list event");
975+
false
976+
}
977+
},
978+
Ok(None) => false,
979+
Err(error) => {
980+
warn!(?error, "Could not get the ignored user list from the state store");
981+
false
982+
}
983+
}
984+
}
963985
}
964986

965987
/// Represent the `required_state` values sent by a sync request.
@@ -1597,4 +1619,27 @@ mod tests {
15971619
assert_let!(Some(ignored) = subscriber.next().await);
15981620
assert!(ignored.is_empty());
15991621
}
1622+
1623+
#[async_test]
1624+
async fn test_is_user_ignored() {
1625+
let ignored_user_id = user_id!("@alice:example.org");
1626+
let client = logged_in_base_client(None).await;
1627+
1628+
let mut sync_builder = SyncResponseBuilder::new();
1629+
let response = sync_builder
1630+
.add_global_account_data_event(matrix_sdk_test::GlobalAccountDataTestEvent::Custom(
1631+
json!({
1632+
"content": {
1633+
"ignored_users": {
1634+
ignored_user_id: {}
1635+
}
1636+
},
1637+
"type": "m.ignored_user_list",
1638+
}),
1639+
))
1640+
.build_sync_response();
1641+
client.receive_sync_response(response).await.unwrap();
1642+
1643+
assert!(client.is_user_ignored(ignored_user_id).await);
1644+
}
16001645
}

crates/matrix-sdk-ui/src/notification_client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ impl NotificationClient {
693693
match notification_result {
694694
Ok(notification_status) => match notification_status {
695695
NotificationStatus::Event(event) => {
696-
if self.client.is_user_ignored(event.event.sender()) {
696+
if self.client.is_user_ignored(event.event.sender()).await {
697697
result.add_notification(
698698
event_id,
699699
NotificationStatus::EventFilteredOut,
@@ -768,7 +768,7 @@ impl NotificationClient {
768768
)
769769
.await?;
770770

771-
if self.client.is_user_ignored(notification_item.event.sender()) {
771+
if self.client.is_user_ignored(notification_item.event.sender()).await {
772772
Ok(None)
773773
} else {
774774
Ok(Some(notification_item))

crates/matrix-sdk-ui/tests/integration/notification_client.rs

Lines changed: 28 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
collections::BTreeMap,
23
sync::{Arc, Mutex},
34
time::Duration,
45
};
@@ -9,8 +10,8 @@ use matrix_sdk::{
910
test_utils::{logged_in_client_with_server, mocks::MatrixMockServer},
1011
};
1112
use matrix_sdk_test::{
12-
async_test, mocks::mock_encryption_state, JoinedRoomBuilder, StateTestEvent,
13-
SyncResponseBuilder,
13+
async_test, event_factory::EventFactory, mocks::mock_encryption_state, JoinedRoomBuilder,
14+
StateTestEvent, SyncResponseBuilder,
1415
};
1516
use matrix_sdk_ui::{
1617
notification_client::{
@@ -19,7 +20,11 @@ use matrix_sdk_ui::{
1920
},
2021
sync_service::SyncService,
2122
};
22-
use ruma::{event_id, events::TimelineEventType, room_id, user_id};
23+
use ruma::{
24+
event_id,
25+
events::{room::member::MembershipState, TimelineEventType},
26+
room_id, user_id,
27+
};
2328
use serde_json::json;
2429
use wiremock::{
2530
matchers::{header, method, path},
@@ -1083,7 +1088,6 @@ async fn test_notification_client_sliding_sync_filters_out_events_from_ignored_u
10831088
let room_id = room_id!("!a98sd12bjh:example.org");
10841089
let room_name = "The Maltese Falcon";
10851090
let sender_display_name = "John Mastodon";
1086-
let sender_avatar_url = "https://example.org/avatar.jpeg";
10871091
let event_id = event_id!("$example_event_id");
10881092

10891093
let raw_event = EventFactory::new()
@@ -1093,6 +1097,23 @@ async fn test_notification_client_sliding_sync_filters_out_events_from_ignored_u
10931097
.event_id(event_id)
10941098
.into_raw_sync();
10951099

1100+
let event_factory = EventFactory::new().room(room_id);
1101+
1102+
let sender_member_event = event_factory
1103+
.member(sender)
1104+
.display_name(sender_display_name)
1105+
.membership(MembershipState::Join)
1106+
.into_raw_sync();
1107+
1108+
let own_member_event = event_factory
1109+
.member(&my_user_id)
1110+
.display_name("My self")
1111+
.membership(MembershipState::Join)
1112+
.into_raw_sync();
1113+
1114+
let power_levels_event =
1115+
event_factory.sender(sender).power_levels(&mut BTreeMap::new()).into_raw_sync();
1116+
10961117
let pos = Mutex::new(0);
10971118
Mock::given(SlidingSyncMatcher)
10981119
.respond_with(move |request: &Request| {
@@ -1111,75 +1132,13 @@ async fn test_notification_client_sliding_sync_filters_out_events_from_ignored_u
11111132

11121133
"required_state": [
11131134
// Sender's member information.
1114-
{
1115-
"content": {
1116-
"avatar_url": sender_avatar_url,
1117-
"displayname": sender_display_name,
1118-
"membership": "join"
1119-
},
1120-
"room_id": room_id,
1121-
"event_id": "$151800140517rfvjc:example.org",
1122-
"membership": "join",
1123-
"origin_server_ts": 151800140,
1124-
"sender": sender,
1125-
"state_key": sender,
1126-
"type": "m.room.member",
1127-
"unsigned": {
1128-
"age": 2970366,
1129-
}
1130-
},
1135+
sender_member_event,
11311136

11321137
// Own member information.
1133-
{
1134-
"content": {
1135-
"avatar_url": null,
1136-
"displayname": "My Self",
1137-
"membership": "join"
1138-
},
1139-
"room_id": room_id,
1140-
"event_id": "$151800140517rflkc:example.org",
1141-
"membership": "join",
1142-
"origin_server_ts": 151800140,
1143-
"sender": my_user_id.clone(),
1144-
"state_key": my_user_id,
1145-
"type": "m.room.member",
1146-
"unsigned": {
1147-
"age": 2970366,
1148-
}
1149-
},
1138+
own_member_event,
11501139

11511140
// Power levels.
1152-
{
1153-
"content": {
1154-
"ban": 50,
1155-
"events": {
1156-
"m.room.avatar": 50,
1157-
"m.room.canonical_alias": 50,
1158-
"m.room.history_visibility": 100,
1159-
"m.room.name": 50,
1160-
"m.room.power_levels": 100,
1161-
"m.room.message": 25,
1162-
},
1163-
"events_default": 0,
1164-
"invite": 0,
1165-
"kick": 50,
1166-
"redact": 50,
1167-
"state_default": 50,
1168-
"users": {
1169-
"@example:localhost": 100,
1170-
sender: 0,
1171-
},
1172-
"users_default": 0,
1173-
},
1174-
"event_id": "$15139375512JaHAW:localhost",
1175-
"origin_server_ts": 151393755,
1176-
"sender": "@example:localhost",
1177-
"state_key": "",
1178-
"type": "m.room.power_levels",
1179-
"unsigned": {
1180-
"age": 703422,
1181-
},
1182-
},
1141+
power_levels_event,
11831142
],
11841143

11851144
"timeline": [

crates/matrix-sdk/src/client/mod.rs

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,10 +2543,8 @@ impl Client {
25432543
}
25442544

25452545
/// Checks whether the provided `user_id` belongs to an ignored user.
2546-
pub fn is_user_ignored(&self, user_id: &UserId) -> bool {
2547-
let raw_user_id = user_id.to_string();
2548-
let current_ignored_user_list = self.subscribe_to_ignore_user_list_changes().get();
2549-
current_ignored_user_list.contains(&raw_user_id)
2546+
pub async fn is_user_ignored(&self, user_id: &UserId) -> bool {
2547+
self.base_client().is_user_ignored(user_id).await
25502548
}
25512549
}
25522550

@@ -2615,7 +2613,7 @@ pub(crate) mod tests {
26152613
ignored_user_list::IgnoredUserListEventContent,
26162614
media_preview_config::{InviteAvatars, MediaPreviewConfigEventContent, MediaPreviews},
26172615
},
2618-
owned_room_id, room_alias_id, room_id, user_id, RoomId, ServerName, UserId,
2616+
owned_room_id, room_alias_id, room_id, RoomId, ServerName, UserId,
26192617
};
26202618
use serde_json::json;
26212619
use stream_assert::{assert_next_matches, assert_pending};
@@ -3452,25 +3450,4 @@ pub(crate) mod tests {
34523450
assert_eq!(initial_value.invite_avatars, InviteAvatars::On);
34533451
assert_eq!(initial_value.media_previews, MediaPreviews::On);
34543452
}
3455-
3456-
#[async_test]
3457-
async fn test_is_user_ignored() {
3458-
let server = MatrixMockServer::new().await;
3459-
let client = server.client_builder().build().await;
3460-
3461-
let user_id = user_id!("@alice:host");
3462-
assert!(!client.is_user_ignored(user_id));
3463-
3464-
server
3465-
.mock_sync()
3466-
.ok_and_run(&client, |builder| {
3467-
builder.add_global_account_data_event(GlobalAccountDataTestEvent::Custom(json!({
3468-
"type": "m.ignored_user_list",
3469-
"content": IgnoredUserListEventContent::users([user_id.to_owned()])
3470-
})));
3471-
})
3472-
.await;
3473-
3474-
assert!(client.is_user_ignored(user_id));
3475-
}
34763453
}

0 commit comments

Comments
 (0)