mirror of
https://gitlab.com/famedly/conduit.git
synced 2025-07-27 17:28:36 +00:00
wip
This commit is contained in:
parent
a0c4a639b2
commit
ec48df78da
7 changed files with 193 additions and 145 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue