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::>(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::().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::().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"); }