ol_rusty/src/commands/links/wrc.rs
Tom 7872513949 Fix WRC url
also set it to own site so no need for bot updates if the url format ever changes.
2023-04-21 21:31:50 +02:00

106 lines
2.8 KiB
Rust

use crate::{commands::utils, Context, Error};
use chrono::{DateTime, Utc};
use log::*;
use serde::Deserialize;
mod wrc_date {
use chrono::{DateTime, TimeZone, Utc};
use serde::{self, Deserialize, Deserializer};
const FORMAT: &'static str = "%Y-%m-%dT%H:%M:%S%:z";
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Utc.datetime_from_str(&s, FORMAT)
.map_err(serde::de::Error::custom)
}
}
#[derive(Deserialize)]
struct WRC {
name: String,
#[serde(rename = "eventDays")]
days: Vec<WRCDays>,
}
#[derive(Deserialize)]
struct WRCDays {
#[serde(rename = "eventDay")]
event_day: String,
#[serde(rename = "spottChannel")]
spott_channel: WRCChannel,
}
#[derive(Deserialize)]
struct WRCChannel {
assets: Vec<WRCAssets>,
}
#[derive(Deserialize)]
struct WRCAssets {
#[serde(with = "wrc_date")]
start: DateTime<Utc>,
#[serde(with = "wrc_date")]
end: DateTime<Utc>,
content: WRCContent,
}
#[derive(Deserialize)]
struct WRCContent {
title: String,
id: u32,
#[serde(default)]
description: Option<String>,
}
async fn get_schedule() -> Result<Option<WRC>, Error> {
let client = reqwest::Client::new();
let req = client
.get("https://api.wrc.com/sdb/rallyevent/active/")
.send()
.await?;
if req.status().as_u16() == 404 {
info!("Error 404 on getting wrc schedule");
Ok(None)
} else if req.status().as_u16() == 200 {
let data: WRC = req.json().await?;
Ok(Some(data))
} else {
Ok(None)
}
}
/// WRC sessions
#[poise::command(slash_command, ephemeral)]
pub async fn wrc(
ctx: Context<'_>,
) -> Result<(), Error> {
let wrc = get_schedule().await?;
match wrc {
None => {
ctx.say("No WRC sessions found").await?;
Ok(())
}
Some(wrc_data) => {
let mut events: Vec<String> = vec![];
for day in wrc_data.days {
for session in day.spott_channel.assets {
let desc = if let Some(d) = session.content.description {
d
} else {
"".to_string()
};
events.push(format!("{}: <t:{}:R>- <t:{}:R>: [{}](https://tom.al/ms/wrc/{}) {} {}", day.event_day, session.start.timestamp(), session.end.timestamp(), session.content.id, session.content.id, session.content.title, desc));
}
}
let pages = utils::paginator(events, 2400, "\n".to_owned());
utils::paginate_string_embed(ctx, format!("WRC {}", wrc_data.name), pages).await?;
Ok(())
}
}
}