1
Fork 0
shimmeringmoon/src/commands/chart.rs
prescientmoon eec8d4f964
Refactor a huge amount of code!
Signed-off-by: prescientmoon <git@moonythm.dev>
2024-08-08 23:26:13 +02:00

77 lines
1.8 KiB
Rust

use poise::serenity_prelude::{CreateAttachment, CreateEmbed, CreateMessage};
use sqlx::query;
use crate::{
arcaea::chart::Side,
context::{Context, Error},
recognition::fuzzy_song_name::guess_song_and_chart,
};
// {{{ Chart
/// Show a chart given it's name
#[poise::command(prefix_command, slash_command)]
pub async fn chart(
ctx: Context<'_>,
#[rest]
#[description = "Name of chart to show (difficulty at the end)"]
name: String,
) -> Result<(), Error> {
let (song, chart) = guess_song_and_chart(&ctx.data(), &name)?;
let attachement_name = "chart.png";
let icon_attachement = match chart.cached_jacket.as_ref() {
Some(jacket) => Some(CreateAttachment::bytes(jacket.raw, attachement_name)),
None => None,
};
let play_count = query!(
"
SELECT COUNT(*) as count
FROM plays
WHERE chart_id=?
",
chart.id
)
.fetch_one(&ctx.data().db)
.await?;
let mut embed = CreateEmbed::default()
.title(format!(
"{} [{:?} {}]",
&song.title, chart.difficulty, chart.level
))
.field("Note count", format!("{}", chart.note_count), true)
.field(
"Chart constant",
format!("{:.1}", chart.chart_constant as f32 / 100.0),
true,
)
.field("Total plays", format!("{}", play_count.count), true)
.field("BPM", &song.bpm, true)
.field("Side", Side::SIDE_STRINGS[song.side.to_index()], true)
.field("Artist", &song.title, true);
if let Some(note_design) = &chart.note_design {
embed = embed.field("Note design", note_design, true);
}
if let Some(pack) = &song.pack {
embed = embed.field("Pack", pack, true);
}
if icon_attachement.is_some() {
embed = embed.thumbnail(format!("attachment://{}", &attachement_name));
}
ctx.channel_id()
.send_files(
ctx.http(),
icon_attachement,
CreateMessage::new().embed(embed),
)
.await?;
Ok(())
}
// }}}