use std::time::{SystemTime, UNIX_EPOCH};
use bingle_local::api::bingle_local_api::Message;
use serde_json::Value;
use crate::chat_state::ChatState;
pub fn receive_message(
state: &mut ChatState,
sender_id: &str,
sender_handle: &str,
message: &Value,
) -> Option<Message> {
let text = message.get("text").and_then(|v| v.as_str())?;
let is_plain = message.get("app").is_none_or(|v| v.is_null())
&& message.get("type").is_none_or(|v| v.is_null());
if !is_plain {
return None;
}
let display_handle = if sender_handle.trim().is_empty() {
sender_id
} else {
sender_handle
};
if !state.knows_id(sender_id)
&& let Err(e) = state.add_received_contact(display_handle, sender_id)
{
tracing::warn!(
"chat: could not record contact for '{}': {}",
display_handle,
e
);
}
let recipient = state.opts.handle.clone();
let stored =
match state.record_message(display_handle, vec![recipient], now_millis(), text, None) {
Ok(msg) => msg,
Err(e) => {
tracing::warn!("chat: could not persist incoming message: {}", e);
return None;
}
};
if let Err(e) = state.save_state() {
tracing::warn!("chat: could not save state after message: {}", e);
}
Some(stored)
}
fn now_millis() -> i64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_millis() as i64)
.unwrap_or(0)
}