Added weather.

This commit is contained in:
2023-02-23 22:14:59 +00:00
parent cac238df97
commit d93d12e48a
6 changed files with 131 additions and 4 deletions

View File

@ -1,3 +1,4 @@
pub mod currency_converter;
pub mod get_chat_id;
pub mod help;
pub mod weather_forecaster;

View 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(())
}
}

View File

@ -1,3 +1,4 @@
pub mod blyaficator;
pub mod greeter;
pub mod repeator;
pub mod rotator;

View 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(())
}
}