use anyhow::Result;
use wacore_binary_ng::jid::Jid;
use waproto_ng::whatsapp as wa;
use super::Client;
impl Client {
pub(crate) async fn mark_forget_sender_key(
&self,
group_jid: &str,
participants: &[String],
) -> Result<()> {
use anyhow::anyhow;
let device_store = self.persistence_manager.get_device_arc().await;
let device_guard = device_store.read().await;
let own_lid_user = device_guard.lid.as_ref().map(|j| j.user.clone());
let own_pn_user = device_guard.pn.as_ref().map(|j| j.user.clone());
drop(device_guard);
let lid_prefixes = own_lid_user
.as_ref()
.map(|lid| (format!("{lid}:"), format!("{lid}@"), lid.as_str()));
let pn_prefixes = own_pn_user
.as_ref()
.map(|pn| (format!("{pn}:"), format!("{pn}@"), pn.as_str()));
let filtered: Vec<String> = participants
.iter()
.filter(|p| {
let is_own_lid = lid_prefixes.as_ref().is_some_and(|(colon, at, exact)| {
p.starts_with(colon) || p.starts_with(at) || p.as_str() == *exact
});
let is_own_pn = pn_prefixes.as_ref().is_some_and(|(colon, at, exact)| {
p.starts_with(colon) || p.starts_with(at) || p.as_str() == *exact
});
!is_own_lid && !is_own_pn
})
.cloned()
.collect();
if filtered.is_empty() {
return Ok(());
}
let backend = self.persistence_manager.backend();
for participant in &filtered {
backend
.mark_forget_sender_key(group_jid, participant)
.await
.map_err(|e| anyhow!("{e}"))?;
}
Ok(())
}
pub(crate) async fn consume_forget_marks(&self, group_jid: &str) -> Result<Vec<String>> {
use anyhow::anyhow;
let backend = self.persistence_manager.backend();
backend
.consume_forget_marks(group_jid)
.await
.map_err(|e| anyhow!("{e}"))
}
pub(crate) async fn take_recent_message(&self, to: Jid, id: String) -> Option<wa::Message> {
use prost::Message;
let key = self.make_stanza_key(to.clone(), id.clone()).await;
self.recent_messages.remove(&key).await.and_then(|bytes| {
match wa::Message::decode(bytes.as_slice()) {
Ok(msg) => Some(msg),
Err(e) => {
log::warn!("Failed to decode cached message for {}:{}: {}", to, id, e);
None
}
}
})
}
pub(crate) async fn add_recent_message(&self, to: Jid, id: String, msg: &wa::Message) {
use prost::Message;
let key = self.make_stanza_key(to, id).await;
let bytes = msg.encode_to_vec();
self.recent_messages.insert(key, bytes).await;
}
}