Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Dialogs & History


Fetch dialogs

#![allow(unused)]
fn main() {
// Fetch up to N dialogs (returns the most recent first)
let dialogs = client.get_dialogs(50).await?;

for d in &dialogs {
    println!("{}: {} unread: top msg: {}",
        d.title(), d.unread_count(), d.top_message());
}
}

Dialog accessors

MethodReturnDescription
d.title()StringChat name
d.peer()Option<&tl::enums::Peer>The peer for this dialog
d.unread_count()i32Unread message count
d.top_message()i32ID of the latest message

DialogIter: lazy paginated iterator

#![allow(unused)]
fn main() {
let mut iter = client.iter_dialogs();

// Total count (available after first page is fetched)
if let Some(total) = iter.total() {
    println!("Total dialogs: {total}");
}

while let Some(dialog) = iter.next(&client).await? {
    println!("{}", dialog.title());
}
}
MethodDescription
client.iter_dialogs()Create iterator
iter.total()Option<i32>: total count after first fetch
iter.next(&client)async → Option<Dialog>

MessageIter: lazy message history

#![allow(unused)]
fn main() {
let mut iter = client.iter_messages(peer.clone());

// Total count of messages in this chat
if let Some(total) = iter.total() {
    println!("Total messages: {total}");
}

while let Some(msg) = iter.next(&client).await? {
    println!("[{}] {}", msg.id, msg.message);
}
}
MethodDescription
client.iter_messages(peer)Create iterator (newest first)
iter.total()Option<i32>: total message count after first fetch
iter.next(&client)async → Option<tl::types::Message>

Fetch messages directly

#![allow(unused)]
fn main() {
// Latest N messages from a peer
let messages = client.get_message_history(peer.clone(), 20).await?;

// Specific message IDs
let messages = client.get_messages(peer.clone(), &[100, 101, 102]).await?;
// Returns Vec<Option<tl::enums::Message>>: None if not found

// Pinned message
let pinned = client.get_pinned_message(peer.clone()).await?;

// Fetch the message a reply refers to by ID
let parent = client.get_messages(peer.clone(), &[reply_id]).await?.into_iter().next();
}

Scheduled messages

#![allow(unused)]
fn main() {
// List all scheduled messages
let scheduled = client.get_scheduled_messages(peer.clone()).await?;

// Send a scheduled message immediately
client.send_scheduled_now(peer.clone(), &[scheduled_id]).await?;

// Cancel a scheduled message
client.delete_scheduled_messages(peer.clone(), &[scheduled_id]).await?;
}

Dialog management

#![allow(unused)]
fn main() {
// Mark all messages as read
client.mark_read(peer.clone()).await?;

// Clear @mention badges
client.clear_mentions(peer.clone()).await?;

// Leave and remove from dialog list
client.delete_dialog(peer.clone()).await?;

// Pin / unpin a dialog
client.pin_dialog(peer.clone()).await?;
client.pin_dialog(peer.clone(), false).await?;

// Get pinned dialogs (folder_id: 0 = main, 1 = archived)
let pinned = client.get_pinned_dialogs(0).await?;

// Set manual unread flag on a dialog
client.mark_dialog_unread(peer.clone(), true).await?;

// Clear the manual unread flag
client.mark_read(peer.clone()).await?;

// Join a public group/channel
client.join_chat("@somegroup").await?;

// Accept a private invite link
client.join_link("https://t.me/joinchat/AbCdEfG").await?;

// Parse invite hash from any link format
let hash = Client::parse_invite_hash("https://t.me/+AbCdEfG12345");
}

Archive & unarchive

Move a dialog into the Telegram archive (folder 1) or back to the main list (folder 0):

#![allow(unused)]
fn main() {
// Move to archive - chat disappears from the main dialog list
client.archive("@somebot").await?;

// Move back to main list
client.archive("@somebot").await?;
}

Archived chats still receive messages; they are simply hidden from the main list and muted by default until the user opens them.

Low-level folder move

For finer control (e.g. custom folders), use move_to_folder:

#![allow(unused)]
fn main() {
// folder_id 0 = main list, 1 = archive
client.move_to_folder("@somebot", 0).await?;
}