Documentation Index
Fetch the complete documentation index at: https://mintlify.com/jlucaso1/whatsapp-rust/llms.txt
Use this file to discover all available pages before exploring further.
The Blocking trait provides methods for blocking and unblocking contacts, as well as retrieving and checking the blocklist.
Access
Access blocking operations through the client:
let blocking = client.blocking();
Methods
block
Block a contact.
pub async fn block(&self, jid: &Jid) -> Result<(), IqError>
Parameters:
jid - Contact JID to block
Effects:
- Contact will not be able to message you
- Contact will not see your presence updates
- Contact will not see your profile picture (depending on privacy settings)
Example:
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
client.blocking().block(&contact).await?;
println!("Blocked {}", contact);
unblock
Unblock a previously blocked contact.
pub async fn unblock(&self, jid: &Jid) -> Result<(), IqError>
Parameters:
jid - Contact JID to unblock
Example:
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
client.blocking().unblock(&contact).await?;
println!("Unblocked {}", contact);
get_blocklist
Retrieve the full list of blocked contacts.
pub async fn get_blocklist(&self) -> Result<Vec<BlocklistEntry>, anyhow::Error>
Returns:
Vec<BlocklistEntry> - All blocked contacts
BlocklistEntry fields:
jid: Jid - Blocked contact JID
timestamp: Option<u64> - Unix timestamp when blocked (if available)
Example:
let blocklist = client.blocking().get_blocklist().await?;
println!("Blocked contacts: {}", blocklist.len());
for entry in blocklist {
println!(" JID: {}", entry.jid);
if let Some(ts) = entry.timestamp {
println!(" Blocked at: {}", ts);
}
}
is_blocked
Check if a specific contact is blocked.
pub async fn is_blocked(&self, jid: &Jid) -> Result<bool, anyhow::Error>
Parameters:
jid - Contact JID to check
Returns:
bool - true if blocked, false otherwise
Behavior:
- Compares only the user part of the JID (ignores device ID)
- Blocking applies to the entire user account, not individual devices
Example:
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
if client.blocking().is_blocked(&contact).await? {
println!("{} is blocked", contact);
} else {
println!("{} is not blocked", contact);
}
BlocklistEntry Type
pub struct BlocklistEntry {
pub jid: Jid,
pub timestamp: Option<u64>,
}
Fields:
jid - The blocked contact’s JID
timestamp - Unix timestamp (seconds since epoch) when the contact was blocked
The timestamp may be None if the server doesn’t provide it.
Error Types
IqError
Returned by block() and unblock() operations:
pub enum IqError {
// Network/protocol errors
Timeout,
InvalidResponse,
// ... other variants
}
anyhow::Error
Returned by get_blocklist() and is_blocked() for general errors.
Block Request
<iq xmlns="blocklist" type="set" to="s.whatsapp.net" id="...">
<item action="block" jid="15551234567@s.whatsapp.net"/>
</iq>
Unblock Request
<iq xmlns="blocklist" type="set" to="s.whatsapp.net" id="...">
<item action="unblock" jid="15551234567@s.whatsapp.net"/>
</iq>
Get Blocklist Request
<iq xmlns="blocklist" type="get" to="s.whatsapp.net" id="..."/>
Blocklist Response
<iq from="s.whatsapp.net" id="..." type="result">
<list>
<item jid="15551111111@s.whatsapp.net" t="1640000000"/>
<item jid="15552222222@s.whatsapp.net" t="1640000100"/>
</list>
</iq>
Or direct items without <list> wrapper:
<iq from="s.whatsapp.net" id="..." type="result">
<item jid="15551111111@s.whatsapp.net" t="1640000000"/>
<item jid="15552222222@s.whatsapp.net" t="1640000100"/>
</iq>
Usage Examples
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
match client.blocking().block(&contact).await {
Ok(_) => println!("Successfully blocked {}", contact),
Err(e) => eprintln!("Failed to block: {}", e),
}
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
match client.blocking().unblock(&contact).await {
Ok(_) => println!("Successfully unblocked {}", contact),
Err(e) => eprintln!("Failed to unblock: {}", e),
}
Check Before Blocking
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
if !client.blocking().is_blocked(&contact).await? {
client.blocking().block(&contact).await?;
println!("Contact blocked");
} else {
println!("Contact already blocked");
}
let blocklist = client.blocking().get_blocklist().await?;
if blocklist.is_empty() {
println!("No blocked contacts");
} else {
println!("Blocked contacts:");
for entry in blocklist {
print!(" - {}", entry.jid);
if let Some(ts) = entry.timestamp {
println!(" (blocked: {})", ts);
} else {
println!();
}
}
}
Conditional Block/Unblock
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
let should_block = true; // Your logic here
if should_block {
if !client.blocking().is_blocked(&contact).await? {
client.blocking().block(&contact).await?;
println!("Blocked {}", contact);
}
} else {
if client.blocking().is_blocked(&contact).await? {
client.blocking().unblock(&contact).await?;
println!("Unblocked {}", contact);
}
}
let contacts_to_block = vec![
"15551111111@s.whatsapp.net".parse()?,
"15552222222@s.whatsapp.net".parse()?,
"15553333333@s.whatsapp.net".parse()?,
];
for contact in contacts_to_block {
match client.blocking().block(&contact).await {
Ok(_) => println!("Blocked {}", contact),
Err(e) => eprintln!("Failed to block {}: {}", contact, e),
}
}
Error Handling
use whatsapp_rust::request::IqError;
let contact: Jid = "15551234567@s.whatsapp.net".parse()?;
match client.blocking().block(&contact).await {
Ok(_) => println!("Blocked successfully"),
Err(IqError::Timeout) => {
eprintln!("Request timed out");
}
Err(IqError::InvalidResponse) => {
eprintln!("Invalid response from server");
}
Err(e) => eprintln!("Error: {}", e),
}
Device ID Handling
The is_blocked() method compares only the user part of JIDs, ignoring device IDs:
let jid1: Jid = "15551234567.0@s.whatsapp.net".parse()?; // Device 0
let jid2: Jid = "15551234567.1@s.whatsapp.net".parse()?; // Device 1
// Block device 0
client.blocking().block(&jid1).await?;
// Check if device 1 is blocked (will return true)
assert!(client.blocking().is_blocked(&jid2).await?);
// Blocking applies to the user account, not specific devices
Complete Example
use whatsapp_rust::features::blocking::BlocklistEntry;
async fn manage_blocklist(client: &Client) -> anyhow::Result<()> {
// Get current blocklist
let blocklist = client.blocking().get_blocklist().await?;
println!("Current blocklist: {} contacts", blocklist.len());
// Block a new contact
let spam_contact: Jid = "15559999999@s.whatsapp.net".parse()?;
if !client.blocking().is_blocked(&spam_contact).await? {
client.blocking().block(&spam_contact).await?;
println!("Blocked spam contact");
}
// Unblock an old contact
let old_friend: Jid = "15551234567@s.whatsapp.net".parse()?;
if client.blocking().is_blocked(&old_friend).await? {
client.blocking().unblock(&old_friend).await?;
println!("Unblocked old friend");
}
// Print updated blocklist
let updated_blocklist = client.blocking().get_blocklist().await?;
println!("\nUpdated blocklist:");
for entry in updated_blocklist {
println!(" - {}", entry.jid);
}
Ok(())
}