ol_rusty/src/commands/links/wrc.rs
Tom 5caf820dc0 Update poise version (with refactor)
set some command to ephemeral
Add roles command
Do some refactoring and minor changes to commands
2023-04-07 19:06:14 +02:00

119 lines
3.3 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 {
// #[serde(rename = "earliestPlayableStart")]
// #[serde(with = "es_date_time")]
// earliest_playable_start: DateTime<Utc>,
// id: u32,
name: String,
#[serde(rename = "eventDays")]
days: Vec<WRCDays>,
}
#[derive(Deserialize)]
struct WRCDays {
// id: u32,
#[serde(rename = "eventDay")]
event_day: String,
#[serde(rename = "spottChannel")]
spott_channel: WRCChannel,
}
#[derive(Deserialize)]
struct WRCChannel {
// id: u32,
// #[serde(rename = "displayName")]
// name: String,
assets: Vec<WRCAssets>,
}
#[derive(Deserialize)]
struct WRCAssets {
// id: u32,
#[serde(with = "wrc_date")]
start: DateTime<Utc>,
#[serde(with = "wrc_date")]
end: DateTime<Utc>,
// duration: u32,
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<'_>,
// #[description = "Filter sessions for when they are/were happening, defaults to future"]
// timeframe: Option<super::Timeframe>,
// #[description = "Content to filter on"] filter: Option<String>,
) -> 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://morningstreams.com/wrcplayer.html?id={}) {} {}", 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(())
}
}
}