use crate::*;
#[allow(unused_imports)]
use crate::{
InputMessage, InvocationError, PeerRef,
dialog::{Dialog, DialogIter, MessageIter},
inline_iter, media, participants, search, update,
};
use ferogram_tl_types::{Cursor, Deserializable};
impl Client {
pub async fn get_contacts(&self) -> Result<Vec<tl::enums::User>, InvocationError> {
let req = tl::functions::contacts::GetContacts { hash: 0 };
let body: Vec<u8> = self.rpc_call_raw(&req).await?;
let mut cur = Cursor::from_slice(&body);
match tl::enums::contacts::Contacts::deserialize(&mut cur)? {
tl::enums::contacts::Contacts::Contacts(c) => {
self.cache_users_slice(&c.users).await;
Ok(c.users)
}
tl::enums::contacts::Contacts::NotModified => Ok(vec![]),
}
}
pub async fn delete_contacts(&self, user_ids: &[i64]) -> Result<(), InvocationError> {
if user_ids.is_empty() {
return Ok(());
}
let cache: tokio::sync::RwLockReadGuard<'_, PeerCache> = self.inner.peer_cache.read().await;
let users: Vec<tl::enums::InputUser> = user_ids
.iter()
.map(|&id| {
let hash = cache.users.get(&id).copied().unwrap_or(0);
tl::enums::InputUser::InputUser(tl::types::InputUser {
user_id: id,
access_hash: hash,
})
})
.collect();
let req = tl::functions::contacts::DeleteContacts { id: users };
self.rpc_write(&req).await
}
pub async fn block_user(&self, peer: impl Into<PeerRef>) -> Result<(), InvocationError> {
let peer = peer.into().resolve(self).await?;
let input_peer = self.inner.peer_cache.read().await.peer_to_input(&peer)?;
let req = tl::functions::contacts::Block {
my_stories_from: false,
id: input_peer,
};
self.rpc_write(&req).await
}
pub async fn unblock_user(&self, peer: impl Into<PeerRef>) -> Result<(), InvocationError> {
let peer = peer.into().resolve(self).await?;
let input_peer = self.inner.peer_cache.read().await.peer_to_input(&peer)?;
let req = tl::functions::contacts::Unblock {
my_stories_from: false,
id: input_peer,
};
self.rpc_write(&req).await
}
pub async fn set_online(&self) -> Result<(), InvocationError> {
let req = tl::functions::account::UpdateStatus { offline: false };
self.rpc_write(&req).await
}
pub async fn set_offline(&self) -> Result<(), InvocationError> {
let req = tl::functions::account::UpdateStatus { offline: true };
self.rpc_write(&req).await
}
pub async fn terminate_session(&self, hash: i64) -> Result<(), InvocationError> {
let req = tl::functions::account::ResetAuthorization { hash };
self.rpc_write(&req).await
}
}