matrix_sdk_base/response_processors/room/msc4186/
extensions.rs1use std::collections::BTreeMap;
16
17use ruma::{
18 OwnedRoomId, RoomId,
19 api::client::sync::sync_events::v5 as http,
20 events::{AnySyncEphemeralRoomEvent, SyncEphemeralRoomEvent, receipt::ReceiptEventContent},
21 serde::Raw,
22};
23
24use super::super::super::{
25 Context, account_data::for_room as account_data_for_room, ephemeral_events::dispatch_receipt,
26};
27use crate::{
28 RoomState,
29 store::BaseStateStore,
30 sync::{JoinedRoomUpdate, RoomUpdates},
31};
32
33pub fn dispatch_typing_ephemeral_events(
36 typing: &http::response::Typing,
37 joined_room_updates: &mut BTreeMap<OwnedRoomId, JoinedRoomUpdate>,
38) {
39 for (room_id, raw) in &typing.rooms {
40 joined_room_updates
41 .entry(room_id.to_owned())
42 .or_default()
43 .ephemeral
44 .push(raw.clone().cast());
45 }
46}
47
48pub fn dispatch_receipt_ephemeral_event_for_room(
51 context: &mut Context,
52 room_id: &RoomId,
53 receipt: &Raw<SyncEphemeralRoomEvent<ReceiptEventContent>>,
54) {
55 let receipt: Raw<AnySyncEphemeralRoomEvent> = receipt.cast_ref().clone();
56
57 dispatch_receipt(context, &receipt, room_id);
58}
59
60pub fn room_account_data(
61 context: &mut Context,
62 account_data: &http::response::AccountData,
63 room_updates: &mut RoomUpdates,
64 state_store: &BaseStateStore,
65) {
66 for (room_id, raw) in &account_data.rooms {
67 account_data_for_room(context, room_id, raw, state_store);
68
69 if let Some(room) = state_store.room(room_id) {
70 match room.state() {
71 RoomState::Joined => room_updates
72 .joined
73 .entry(room_id.to_owned())
74 .or_default()
75 .account_data
76 .append(&mut raw.to_vec()),
77 RoomState::Left | RoomState::Banned => room_updates
78 .left
79 .entry(room_id.to_owned())
80 .or_default()
81 .account_data
82 .append(&mut raw.to_vec()),
83 RoomState::Invited | RoomState::Knocked => {}
84 }
85 }
86 }
87}