77 lines
1.8 KiB
Rust
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(())
|
|
}
|
|
// }}}
|