mail4agent_server/
events.rs1use crate::error::MatrixError;
4use crate::store::{self, MatrixEvent};
5
6pub fn client_event_json(
7 conn: &rusqlite::Connection,
8 event: &MatrixEvent,
9 own_txn_id: Option<&str>,
10) -> Result<serde_json::Value, MatrixError> {
11 let sender = store::mxid_of(conn, event.sender_user_id)?.ok_or_else(|| {
12 tracing::error!("client_event_json: sender {} has no matrix_users row", event.sender_user_id);
13 MatrixError::internal()
14 })?;
15 let content: serde_json::Value = serde_json::from_str(&event.content).unwrap_or_else(|_| serde_json::json!({}));
16 let now_ms = chrono::Utc::now().timestamp_millis();
17 let age = (now_ms - event.origin_server_ts).max(0);
18
19 let mut unsigned = serde_json::json!({ "age": age });
20 if let Some(redaction_event_id) = &event.redacted_by {
21 if let Some(redaction_event) = store::get_event(conn, redaction_event_id)? {
22 unsigned["redacted_because"] = client_event_json(conn, &redaction_event, None)?;
23 }
24 }
25 if event.event_type == "m.room.member" {
26 if let Ok(member_content) = serde_json::from_str::<serde_json::Value>(&event.content) {
27 if member_content.get("membership").and_then(|v| v.as_str()) == Some("invite") {
28 let stripped = store::stripped_invite_state(conn, &event.room_id, event.sender_user_id)?;
29 unsigned["invite_room_state"] = serde_json::Value::Array(stripped);
30 }
31 }
32 }
33 if let Some(txn_id) = own_txn_id {
34 unsigned["transaction_id"] = serde_json::Value::String(txn_id.to_string());
35 }
36
37 let mut value = serde_json::json!({
38 "event_id": event.event_id,
39 "type": event.event_type,
40 "sender": sender,
41 "origin_server_ts": event.origin_server_ts,
42 "content": content,
43 "room_id": event.room_id,
44 "unsigned": unsigned,
45 });
46 if let Some(state_key) = &event.state_key {
47 value["state_key"] = serde_json::Value::String(state_key.clone());
48 }
49 if let Some(redacts) = &event.redacts {
50 value["redacts"] = serde_json::Value::String(redacts.clone());
51 }
52 Ok(value)
53}