Created
October 1, 2017 18:01
-
-
Save DarkMentat/0ee28f22bb134bb0430fa6ffb014f9d4 to your computer and use it in GitHub Desktop.
Telegram echo-bot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[package] | |
name = "test_telegram_bot" | |
version = "0.1.0" | |
authors = ["darkmentat"] | |
[dependencies] | |
telegram-bot = { git = "https://github.com/telegram-rs/telegram-bot.git" } | |
tokio-core = "0.1" | |
futures = "0.1" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extern crate futures; | |
extern crate telegram_bot; | |
extern crate tokio_core; | |
use std::env; | |
use futures::Stream; | |
use tokio_core::reactor::Core; | |
use telegram_bot::*; | |
fn main() { | |
let mut core = Core::new().unwrap(); //Создается event-loop, в который будут кидаться futures | |
//Он работает так: есть список фьючеров, и если он не пустой, то он по-очереди ходит к каждому | |
//и спрашивает(дергает метод poll), не закончился ли он. | |
//если закончился, то кидает результат в следующий фьючер, который в map указан или for_each | |
//и запускает его | |
//а так по факту это бесконечный цикл, который ходит без остановки по листу и дергает poll() у всех | |
let token = env::var("TELEGRAM_BOT_TOKEN").unwrap(); | |
println!("Starting bot..."); | |
println!("Telegram token: {}", token); | |
let handle = core.handle(); // Что такое Handle? | |
let api = Api::configure(token).build(handle); | |
let future_get_me = api.send(GetMe); | |
let me_res = core.run(future_get_me); //блокируем текущий поток, до тех пор, пока future не завершится | |
print!("Me: "); | |
println!("{:?}", me_res); | |
println!(); | |
//Стрим future-ов, это какбэ один future, но результат не один раз приходит, а много резульатов в разное время | |
//Как Observable в RxJava например | |
let future = api.stream().for_each(|update| { | |
println!("{:?}", update); | |
// If the received update contains a new message... | |
if let UpdateKind::Message(message) = update.kind { | |
// Get sender's first name if available. | |
let first_name = match message.from.as_ref() { | |
Some(from) => &from.first_name, | |
None => return Ok(()) // Skip a message. | |
}; | |
if let MessageKind::Text {ref data, ..} = message.kind { | |
// Answer message with "Hi". | |
api.spawn(message.text_reply( | |
format!("Hi, {}! You just wrote '{}'", first_name, data) | |
)); | |
} | |
} | |
Ok(()) | |
}); | |
//снова блокируем текущий поток, до тех пор, пока стрим не завершится (тоесть по факту до ошибки, а так постоянно ) | |
core.run(future).unwrap(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment