daily_material 1.0.0

原神当前材料 telegram bot
Documentation
use teloxide::{
    prelude::*,
    types::{
        InlineQueryResult, InlineQueryResultArticle, InputMessageContent, InputMessageContentText,
    },
};

use chrono::{DateTime, Datelike, FixedOffset, TimeZone, Timelike, Weekday};
use daily_material::{talent, weapon};

const SUN_TIP: &str = "周日随便刷哦";

#[tokio::main]
async fn main() {
    pretty_env_logger::init();
    let bot = Bot::from_env().auto_send();
    let handler = Update::filter_inline_query().branch(dptree::endpoint(
        |query: InlineQuery, bot: AutoSend<Bot>| async move {
            let datetime = get_datetime();
            let weekday = datetime.weekday();
            let (rsec, rmin, rhour) = get_remaining(datetime);

            let talent = get_talent(weekday);
            let weapon = get_weapon(weekday);
            let talent_next = get_talent(weekday.succ());
            let weapon_next = get_weapon(weekday.succ());

            let content_text = InputMessageContentText::new(format!(
                "{talent}\n{weapon}\n\n{rhour:02}:{rmin:02}:{rsec:02}后:\n{talent_next}\n{weapon_next}"
            ));
            let content = InputMessageContent::Text(content_text);

            let talent_text = InlineQueryResult::Article(InlineQueryResultArticle::new(
                "天赋",
                talent,
                content.clone(),
            ));
            let weapon_text = InlineQueryResult::Article(InlineQueryResultArticle::new(
                "武器",
                weapon,
                content,
            ));
            let result = [talent_text, weapon_text];

            let response = bot
                .answer_inline_query(&query.id, result)
                .cache_time(1)
                .send()
                .await;

            if let Err(e) = response {
                log::error!("Error in handler: {:?}", e);
            }

            respond(())
        },
    ));

    Dispatcher::builder(bot, handler)
        .build()
        .setup_ctrlc_handler()
        .dispatch()
        .await;
}

fn get_talent(time: Weekday) -> String {
    let list = match time {
        Weekday::Mon | Weekday::Thu => talent::MON_THU,
        Weekday::Tue | Weekday::Fri => talent::TUE_FRI,
        Weekday::Wed | Weekday::Sat => talent::WED_SAT,
        _ => return SUN_TIP.to_owned(),
    };
    format!("天赋:{}", list.join(""))
}

fn get_weapon(time: Weekday) -> String {
    let list = match time {
        Weekday::Mon | Weekday::Thu => weapon::MON_THU,
        Weekday::Tue | Weekday::Fri => weapon::TUE_FRI,
        Weekday::Wed | Weekday::Sat => weapon::WED_SAT,
        _ => return SUN_TIP.to_owned(),
    };
    format!("武器:{}", list.join(""))
}

fn get_datetime() -> DateTime<FixedOffset> {
    let utc = &chrono::Utc::now().naive_utc();
    FixedOffset::east(4 * 3600).from_utc_datetime(utc)
}

fn get_remaining(time: DateTime<FixedOffset>) -> (u32, u32, u32) {
    match (time.second(), time.minute(), time.hour()) {
        (0, 0, hour) => (0, 0, 24 - hour),
        (0, min, hour) => (0, 60 - min, 23 - hour),
        (sec, min, hour) => (60 - sec, 59 - min, 23 - hour),
    }
}