use std::collections::BTreeMap;
use ruma::{
OwnedRoomId, RoomId,
api::client::sync::sync_events::v5 as http,
events::{AnySyncEphemeralRoomEvent, SyncEphemeralRoomEvent, receipt::ReceiptEventContent},
serde::Raw,
};
use super::super::super::{
Context, account_data::for_room as account_data_for_room, ephemeral_events::dispatch_receipt,
};
use crate::{
RoomState,
store::BaseStateStore,
sync::{JoinedRoomUpdate, RoomUpdates},
};
pub fn dispatch_typing_ephemeral_events(
typing: &http::response::Typing,
joined_room_updates: &mut BTreeMap<OwnedRoomId, JoinedRoomUpdate>,
) {
for (room_id, raw) in &typing.rooms {
joined_room_updates
.entry(room_id.to_owned())
.or_default()
.ephemeral
.push(raw.clone().cast());
}
}
pub fn dispatch_receipt_ephemeral_event_for_room(
context: &mut Context,
room_id: &RoomId,
receipt: &Raw<SyncEphemeralRoomEvent<ReceiptEventContent>>,
) {
let receipt: Raw<AnySyncEphemeralRoomEvent> = receipt.cast_ref().clone();
dispatch_receipt(context, &receipt, room_id);
}
pub fn room_account_data(
context: &mut Context,
account_data: &http::response::AccountData,
room_updates: &mut RoomUpdates,
state_store: &BaseStateStore,
) {
for (room_id, raw) in &account_data.rooms {
account_data_for_room(context, room_id, raw, state_store);
if let Some(room) = state_store.room(room_id) {
match room.state() {
RoomState::Joined => room_updates
.joined
.entry(room_id.to_owned())
.or_default()
.account_data
.append(&mut raw.to_vec()),
RoomState::Left | RoomState::Banned => room_updates
.left
.entry(room_id.to_owned())
.or_default()
.account_data
.append(&mut raw.to_vec()),
RoomState::Invited | RoomState::Knocked => {}
}
}
}
}