whatsapp_rust/
presence.rs

1use crate::client::Client;
2use crate::types::presence::Presence;
3use log::{debug, info, warn};
4use wacore_binary::builder::NodeBuilder;
5
6impl Client {
7    pub async fn send_presence(&self, presence: Presence) -> Result<(), anyhow::Error> {
8        let device_snapshot = self.persistence_manager.get_device_snapshot().await;
9        debug!(
10            "🔍 send_presence called with push_name: '{}'",
11            device_snapshot.push_name
12        );
13        if device_snapshot.push_name.is_empty() {
14            warn!("❌ Cannot send presence: push_name is empty!");
15            return Err(anyhow::anyhow!(
16                "Cannot send presence without a push name set"
17            ));
18        }
19        let presence_type = match presence {
20            Presence::Available => "available",
21            Presence::Unavailable => "unavailable",
22        };
23        let node = NodeBuilder::new("presence")
24            .attr("type", presence_type)
25            .attr("name", &device_snapshot.push_name)
26            .build();
27        info!(
28            "📡 Sending presence stanza: <presence type=\"{}\" name=\"{}\"/>",
29            presence_type,
30            node.attrs.get("name").map_or("", |s| s.as_str())
31        );
32        self.send_node(node).await.map_err(|e| e.into())
33    }
34}