Added weather.
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
pub mod currency_converter;
|
||||
pub mod get_chat_id;
|
||||
pub mod help;
|
||||
pub mod weather_forecaster;
|
||||
|
84
src/bot/handlers/basic/weather_forecaster.rs
Normal file
84
src/bot/handlers/basic/weather_forecaster.rs
Normal file
@ -0,0 +1,84 @@
|
||||
use std::time::Duration;
|
||||
|
||||
use grammers_client::{Client, InputMessage, Update};
|
||||
use rand::seq::SliceRandom;
|
||||
|
||||
use crate::{bot::handlers::Handler, utils::messages::get_message};
|
||||
use rand::rngs::OsRng;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct WeatherForecaster {
|
||||
client: reqwest::Client,
|
||||
}
|
||||
|
||||
impl WeatherForecaster {
|
||||
pub fn new() -> anyhow::Result<Self> {
|
||||
let client = reqwest::ClientBuilder::new()
|
||||
.timeout(Duration::from_secs(2))
|
||||
.gzip(true)
|
||||
.build()?;
|
||||
Ok(Self { client })
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl Handler for WeatherForecaster {
|
||||
async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> {
|
||||
let Some(message) = get_message(update) else {
|
||||
return Ok(());
|
||||
};
|
||||
let Some(city) = message.text().strip_prefix(".w").map(str::trim) else {
|
||||
return Ok(());
|
||||
};
|
||||
|
||||
let response = self
|
||||
.client
|
||||
.get(format!("https://wttr.in/{city}?0QT"))
|
||||
.header("user-agent", "curl/7.0")
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
if response.status() == reqwest::StatusCode::NOT_FOUND {
|
||||
message
|
||||
.reply(
|
||||
[
|
||||
"Лол, ты сам-то понял что написал?",
|
||||
"Не, я хз где это.",
|
||||
"Если ты действительно тут живешь, то сочувствую.",
|
||||
]
|
||||
.choose(&mut OsRng)
|
||||
.copied()
|
||||
.unwrap(),
|
||||
)
|
||||
.await?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if response.status() != reqwest::StatusCode::OK {
|
||||
message.reply("Сервис недоступен. Попробуй потом.").await?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let forecast = response.text().await?;
|
||||
|
||||
message
|
||||
.reply(
|
||||
InputMessage::html(
|
||||
forecast
|
||||
// We need to wrap every line in pre tag.
|
||||
.split('\n')
|
||||
.filter(|line| !line.trim().is_empty())
|
||||
.map(|line| format!("<pre>{line}</pre>\n"))
|
||||
// Also we add a message at the end by chaining another
|
||||
// iterable.
|
||||
.chain([String::from("Ваш прогноз.")])
|
||||
// And collect interator to final HTML string.
|
||||
.collect::<String>(),
|
||||
)
|
||||
.silent(true),
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
pub mod blyaficator;
|
||||
pub mod greeter;
|
||||
pub mod repeator;
|
||||
pub mod rotator;
|
||||
|
15
src/bot/handlers/fun/repeator.rs
Normal file
15
src/bot/handlers/fun/repeator.rs
Normal file
@ -0,0 +1,15 @@
|
||||
use grammers_client::{Client, Update};
|
||||
|
||||
use crate::{bot::handlers::Handler, utils::messages::get_message};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Repeator;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl Handler for Repeator {
|
||||
async fn react(&self, _: &Client, update: &Update) -> anyhow::Result<()> {
|
||||
let Some(message) = get_message(update) else { return Ok(()) };
|
||||
message.respond(message.text()).await?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user