Skip to content

Instantly share code, notes, and snippets.

@DarkMentat
Created October 1, 2017 18:01
Show Gist options
  • Save DarkMentat/0ee28f22bb134bb0430fa6ffb014f9d4 to your computer and use it in GitHub Desktop.
Save DarkMentat/0ee28f22bb134bb0430fa6ffb014f9d4 to your computer and use it in GitHub Desktop.
Telegram echo-bot
[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"
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