rust-tdlib 0.4.3

TDlib (Telegram Database library) client
Documentation
use rust_tdlib::types::MessageContent;
use rust_tdlib::{
    client::{Client, ClientState, Worker},
    tdjson,
    types::{
        FormattedText, GetMe, InputMessageContent, InputMessageText, SearchPublicChat,
        SearchPublicChats, SendMessage, TdlibParameters, Update,
    },
};
use std::borrow::Borrow;

#[tokio::main]
async fn main() {
    tdjson::set_log_verbosity_level(1);
    env_logger::init();
    let (sender, mut receiver) = tokio::sync::mpsc::channel::<Box<Update>>(10000);

    let client1 = Client::builder()
        .with_tdlib_parameters(
            TdlibParameters::builder()
                .database_directory("tddb1")
                .use_test_dc(false)
                .api_id(std::env::var("API_ID").unwrap().parse::<i32>().unwrap())
                .api_hash(std::env::var("API_HASH").unwrap())
                .system_language_code("en")
                .device_model("Desktop")
                .system_version("Unknown")
                .application_version(env!("CARGO_PKG_VERSION"))
                .enable_storage_optimizer(true)
                .build(),
        )
        .with_updates_sender(sender)
        .build()
        .unwrap();

    let client2 = Client::builder()
        .with_tdlib_parameters(
            TdlibParameters::builder()
                .database_directory("tddb2")
                .use_test_dc(false)
                .api_id(std::env::var("API_ID").unwrap().parse::<i32>().unwrap())
                .api_hash(std::env::var("API_HASH").unwrap())
                .system_language_code("en")
                .device_model("Desktop")
                .system_version("Unknown")
                .application_version(env!("CARGO_PKG_VERSION"))
                .enable_storage_optimizer(true)
                .build(),
        )
        .build()
        .unwrap();

    let mut worker = Worker::builder().build().unwrap();

    worker.start();

    let client1 = worker.bind_client(client1).await.unwrap();

    loop {
        if worker.wait_client_state(&client1).await.unwrap() == ClientState::Opened {
            log::info!("client1 authorized");
            break;
        }
    }
    let me1 = client1.get_me(GetMe::builder().build()).await.unwrap();
    log::info!("me 1: {:?}", me1);

    let client2 = worker.bind_client(client2).await.unwrap();
    loop {
        if worker.wait_client_state(&client2).await.unwrap() == ClientState::Opened {
            log::info!("client2 authorized");
            break;
        }
    }
    let me2 = client2.get_me(GetMe::builder().build()).await.unwrap();
    log::info!("me 2: {:?}", me2);

    let chats = client1
        .search_public_chats(SearchPublicChats::builder().query("@rust").build())
        .await
        .unwrap();
    log::info!("found chats with client1: {}", chats.chat_ids().len());

    let chats = client2
        .search_public_chats(SearchPublicChats::builder().query("@telegram").build())
        .await
        .unwrap();
    log::info!("found chats with client2: {}", chats.chat_ids().len());

    log::info!("get client");
    let chat_with_yourself = client1
        .search_public_chat(SearchPublicChat::builder().username(me1.username()).build())
        .await
        .unwrap();

    let text_to_send = format!("hello from {}", me1.username());
    log::info!("sending text: {}", text_to_send);

    client1
        .send_message(
            SendMessage::builder()
                .chat_id(chat_with_yourself.id())
                .input_message_content(InputMessageContent::InputMessageText(
                    InputMessageText::builder()
                        .text(FormattedText::builder().text(&text_to_send).build())
                        .build(),
                ))
                .build(),
        )
        .await
        .unwrap();

    let mut wait_messages: i32 = 100;
    while let Some(message) = receiver.recv().await {
        if let Update::NewMessage(new_message) = message.borrow() {
            log::info!("new message received: {:?}", new_message);
            if let MessageContent::MessageText(text) = new_message.message().content() {
                if text.text().text().eq(&text_to_send) {
                    break;
                }
            }
        }
        wait_messages -= 1;
        if wait_messages == 0 {
            break;
        }
    }

    client1.stop().await.unwrap();
    client2.stop().await.unwrap();

    loop {
        if worker.wait_client_state(&client1).await.unwrap() == ClientState::Closed {
            log::info!("client1 closed");
            break;
        }
    }

    loop {
        if worker.wait_client_state(&client2).await.unwrap() == ClientState::Closed {
            log::info!("client2 closed");
            break;
        }
    }

    worker.stop();
    log::info!("worker stopped");
}