1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-27 17:28:36 +00:00
This commit is contained in:
mikoto 2024-05-07 07:42:10 +02:00
parent a0c4a639b2
commit ec48df78da
7 changed files with 193 additions and 145 deletions

View file

@ -1,136 +1,153 @@
use std::collections::HashSet;
// pub fn filter_room_events<'i, I: Iterator<Item = &'i Raw<AnyTimelineEvent>>>(
// events: I,
// sender_user: &UserId,
// sender_device: &DeviceId,
// room_id: Option<&RoomId>,
// filter: RoomEventFilter,
// ) -> crate::Result<Box<dyn Iterator<Item = &'i Raw<AnyTimelineEvent>>>> {
// let (lazy_load_enabled, lazy_load_send_redundant) = match &filter.lazy_load_options {
// LazyLoadOptions::Enabled {
// include_redundant_members,
// } => (true, *include_redundant_members),
// _ => (false, false),
// };
use ruma::{
api::client::filter::{LazyLoadOptions, RoomEventFilter},
events::AnyTimelineEvent,
serde::Raw,
DeviceId, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, UserId,
};
// let it = Box::new(
// events
// .filter(|event| match &filter.rooms {
// None => true,
// Some(rooms) => rooms.iter().any(|r| {
// r.as_str()
// == event
// .get_field::<String>("room_id")
// .expect("room events should deserialize")
// .expect("room events should have a room_id")
// }),
// })
// .filter(|event| match &filter.not_rooms[..] {
// [] => true,
// not_rooms => not_rooms.iter().all(|r| {
// r.as_str()
// != event
// .get_field::<String>("room_id")
// .expect("room events should deserialize")
// .expect("room events should have a room_id")
// }),
// })
// .filter(|event| match &filter.senders {
// None => true,
// Some(rooms) => rooms.iter().any(|r| {
// r.as_str()
// == event
// .get_field::<String>("sender")
// .expect("room events should deserialize")
// .expect("room events should have a sender")
// }),
// })
// .filter(|event| match &filter.not_senders[..] {
// [] => true,
// not_senders => not_senders.iter().all(|r| {
// r.as_str()
// != event
// .get_field::<String>("sender")
// .expect("room events should deserialize")
// .expect("room events should have a sender")
// }),
// })
// .filter(|event| match &filter.types {
// None => true,
// Some(types) => types.iter().any(|t| {
// t.as_str()
// == event
// .get_field::<String>("type")
// .expect("room events should deserialize")
// .expect("room events should have a type")
// }),
// })
// .filter(|event| match &filter.not_types[..] {
// [] => true,
// not_types => not_types.iter().all(|t| {
// t.as_str()
// != event
// .get_field::<String>("type")
// .expect("room events should deserialize")
// .expect("room events should have a type")
// }),
// })
// .filter(|event| {
// let room_id = event
// .get_field::<OwnedRoomId>("room_id")
// .expect("room events should deserialize")
// .expect("room events should have a room_id");
// let event_id = event
// .get_field::<OwnedEventId>("event_id")
// .expect("room events should deserialize")
// .expect("room events should have an event_id");
use crate::services;
// services()
// .rooms
// .state_accessor
// .user_can_see_event(sender_user, &room_id, &event_id)
// .unwrap_or(false)
// }),
// );
pub fn filter_room_events<'i, I: Iterator<Item = &'i Raw<AnyTimelineEvent>>>(
events: I,
sender_user: &UserId,
sender_device: &DeviceId,
room_id: Option<&RoomId>,
filter: RoomEventFilter,
) -> crate::Result<Box<dyn Iterator<Item = &'i Raw<AnyTimelineEvent>>>> {
let (lazy_load_enabled, lazy_load_send_redundant) = match &filter.lazy_load_options {
LazyLoadOptions::Enabled {
include_redundant_members,
} => (true, *include_redundant_members),
_ => (false, false),
};
// let memberships = it
// .map(|event| {
// let room_id = event
// .get_field::<OwnedRoomId>("room_id")
// .expect("room events should deserialize")
// .expect("room events should have a room_id");
// let sender = event
// .get_field::<OwnedUserId>("sender")
// .expect("room events should deserialize")
// .expect("room events should have a sender");
let it = Box::new(
events
.filter(|event| match &filter.rooms {
None => true,
Some(rooms) => rooms.iter().any(|r| {
r.as_str()
== event
.get_field::<String>("room_id")
.expect("room events should deserialize")
.expect("room events should have a room_id")
}),
})
.filter(|event| match &filter.not_rooms[..] {
[] => true,
not_rooms => not_rooms.iter().all(|r| {
r.as_str()
!= event
.get_field::<String>("room_id")
.expect("room events should deserialize")
.expect("room events should have a room_id")
}),
})
.filter(|event| match &filter.senders {
None => true,
Some(rooms) => rooms.iter().any(|r| {
r.as_str()
== event
.get_field::<String>("sender")
.expect("room events should deserialize")
.expect("room events should have a sender")
}),
})
.filter(|event| match &filter.not_senders[..] {
[] => true,
not_senders => not_senders.iter().all(|r| {
r.as_str()
!= event
.get_field::<String>("sender")
.expect("room events should deserialize")
.expect("room events should have a sender")
}),
})
.filter(|event| match &filter.types {
None => true,
Some(types) => types.iter().any(|t| {
t.as_str()
== event
.get_field::<String>("type")
.expect("room events should deserialize")
.expect("room events should have a type")
}),
})
.filter(|event| match &filter.not_types[..] {
[] => true,
not_types => not_types.iter().all(|t| {
t.as_str()
!= event
.get_field::<String>("type")
.expect("room events should deserialize")
.expect("room events should have a type")
}),
})
.filter(|event| {
let room_id = event
.get_field::<OwnedRoomId>("room_id")
.expect("room events should deserialize")
.expect("room events should have a room_id");
let event_id = event
.get_field::<OwnedEventId>("event_id")
.expect("room events should deserialize")
.expect("room events should have an event_id");
// (room_id, sender)
// })
// .flat_map(|(room_id, sender)| {
// services()
// .rooms
// .lazy_loading
// .lazy_load_was_sent_before(sender_user, sender_device, &room_id, &sender)
// .map(|b| {
// if !b || lazy_load_send_redundant {
// Some(sender)
// } else {
// None
// }
// })
// .transpose()
// })
// .collect::<crate::Result<HashSet<_>>>()?;
services()
.rooms
.state_accessor
.user_can_see_event(sender_user, &room_id, &event_id)
.unwrap_or(false)
}),
);
// Ok(it)
// }
let memberships = it
.map(|event| {
let room_id = event
.get_field::<OwnedRoomId>("room_id")
.expect("room events should deserialize")
.expect("room events should have a room_id");
let sender = event
.get_field::<OwnedUserId>("sender")
.expect("room events should deserialize")
.expect("room events should have a sender");
use serde_json::Value;
(room_id, sender)
})
.flat_map(|(room_id, sender)| {
services()
.rooms
.lazy_loading
.lazy_load_was_sent_before(sender_user, sender_device, &room_id, &sender)
.map(|b| {
if !b || lazy_load_send_redundant {
Some(sender)
} else {
None
}
})
.transpose()
})
.collect::<crate::Result<HashSet<_>>>()?;
pub fn event_fields<I: Iterator<Item = String>>(mut json: Value, event_fields: I) -> Value {
let inner = json
.as_object_mut()
.expect("PduEvent should always be an object");
Ok(it)
// TODO: testing this properly
for field in event_fields {
let mut paths = field.split('.').peekable();
let mut parent = &mut *inner;
while let Some(key) = paths.next() {
if paths.peek().is_none() {
parent.remove(key);
} else {
parent = parent
.get_mut(key)
.map(Value::as_object_mut)
.flatten()
.unwrap();
}
}
}
json
}