tbot 0.6.6

Make cool Telegram bots with Rust easily.
Documentation
use tbot::{
    markup::{inline_code, markdown_v2},
    prelude::*,
    types::{
        inline_query::{self, result::Article},
        input_message_content::Text,
        parameters::Text as ParseMode,
    },
    Bot,
};
use tokio::sync::Mutex;

#[tokio::main]
async fn main() {
    let mut bot =
        Bot::from_env("BOT_TOKEN").stateful_event_loop(Mutex::new(0_u32));

    bot.text(|context, _| async move {
        let calc_result = meval::eval_str(&context.text.value);
        let message = if let Ok(answer) = calc_result {
            markdown_v2(("= ", inline_code([answer.to_string()]))).to_string()
        } else {
            markdown_v2("Whops, I couldn't evaluate your expression :(")
                .to_string()
        };
        let reply = ParseMode::with_markdown_v2(&message);

        let call_result = context.send_message_in_reply(reply).call().await;
        if let Err(err) = call_result {
            dbg!(err);
        }
    });

    bot.inline(move |context, id| async move {
        let calc_result = meval::eval_str(&context.query);
        let (title, message) = if let Ok(answer) = calc_result {
            let answer = answer.to_string();
            let message = markdown_v2(inline_code([
                context.query.as_str(),
                " = ",
                answer.as_str(),
            ]))
            .to_string();
            (answer, message)
        } else {
            let title = "Whops...".into();
            let message = markdown_v2("I couldn't evaluate your expression :(")
                .to_string();
            (title, message)
        };

        let id = {
            let mut id = id.lock().await;
            *id += 1;
            id.to_string()
        };
        let content = Text::new(ParseMode::with_markdown_v2(&message));
        let article = Article::new(&title, content).description(&message);
        let result = inline_query::Result::new(&id, article);

        let call_result = context.answer(&[result]).call().await;
        if let Err(err) = call_result {
            dbg!(err);
        }
    });

    bot.polling().start().await.unwrap();
}