use ferogram::{Client, TransportKind};
const API_ID: i32 = 0; const API_HASH: &str = ""; const PHONE: &str = "";
const MAX_DIALOGS: usize = 50;
#[tokio::main]
async fn main() {
if let Err(e) = run().await {
eprintln!("error: {e}");
std::process::exit(1);
}
}
async fn run() -> Result<(), Box<dyn std::error::Error>> {
if API_ID == 0 || API_HASH.is_empty() || PHONE.is_empty() {
eprintln!("Fill in API_ID, API_HASH and PHONE at the top of dialogs_list.rs");
std::process::exit(1);
}
println!("Connecting...");
let (client, _shutdown) = Client::builder()
.api_id(API_ID)
.api_hash(API_HASH)
.transport(TransportKind::Abridged)
.connect()
.await?;
if !client.is_authorized().await? {
login(&client).await?;
client.save_session().await?;
println!("Session saved.");
}
let me = client.get_me().await?;
let display = me
.first_name
.as_deref()
.unwrap_or(me.username.as_deref().unwrap_or("?"));
println!("Logged in as {display}\n");
let limit_label = if MAX_DIALOGS == 0 {
"all".to_string()
} else {
MAX_DIALOGS.to_string()
};
println!("Dialogs ({limit_label}):\n{}", "-".repeat(60));
let mut iter = client.iter_dialogs();
let mut n = 0usize;
let mut total_unread = 0i32;
while let Some(dialog) = iter.next(&client).await? {
n += 1;
let unread = dialog.unread_count();
total_unread += unread;
let badge = if unread > 0 {
format!(" [{unread} unread]")
} else {
String::new()
};
if n == 1 {
if let Some(total) = iter.total() {
println!("Total dialogs reported by server: {total}\n");
}
}
println!("{n:>4}. {}{badge}", dialog.title());
if MAX_DIALOGS > 0 && n >= MAX_DIALOGS {
println!("... (truncated at {MAX_DIALOGS})");
break;
}
}
println!(
"{}\nShowed {n} dialog(s), {total_unread} total unread message(s).",
"-".repeat(60)
);
Ok(())
}
async fn login(client: &Client) -> Result<(), Box<dyn std::error::Error>> {
let name = client.interactive_sign_in(PHONE).await?;
println!("Signed in as {name}");
Ok(())
}