You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2b-rs/src/messages/music.rs

84 lines
2.3 KiB
Rust

use std::sync::Arc;
use serenity::builder::CreateEmbed;
use serenity::http::Http;
use serenity::model::prelude::ChannelId;
use songbird::input::Metadata;
use crate::utils::error::BotResult;
use crate::utils::messages::ShareableMessage;
#[derive(Clone)]
pub struct NowPlayingMessage {
inner: ShareableMessage,
}
impl NowPlayingMessage {
/// Creates a new now playing message
pub async fn create(
ctx: Arc<Http>,
channel_id: &ChannelId,
meta: &Metadata,
) -> BotResult<Self> {
let inner = ShareableMessage::create(ctx, channel_id, |f| {
f.embed(|e| Self::create_embed(meta, e))
})
.await?;
Ok(Self { inner })
}
/// Returns the inner shareable message
pub fn inner(&self) -> &ShareableMessage {
&self.inner
}
/// Refreshes the now playing message
pub async fn refresh(&mut self, meta: &Metadata) -> BotResult<()> {
let channel_id = self.inner.channel_id();
let messages = channel_id
.messages(self.inner.http(), |p| p.limit(1))
.await?;
let needs_recreate = messages
.first()
.map(|m| m.id != self.inner.message_id())
.unwrap_or(true);
// recreates the message if needed
if needs_recreate {
log::debug!("Song info message will be recreated");
let http = self.inner.http().clone();
let _ = self.inner.delete().await;
self.inner = ShareableMessage::create(http, &channel_id, |f| {
f.embed(|e| Self::create_embed(meta, e))
})
.await?;
} else {
log::debug!("Reusing old song info");
self.inner
.edit(|m| m.embed(|e| Self::create_embed(meta, e)))
.await?;
}
Ok(())
}
/// Creates the embed of the now playing message
fn create_embed<'a>(meta: &Metadata, mut embed: &'a mut CreateEmbed) -> &'a mut CreateEmbed {
embed = embed.description(format!(
"Now Playing [{}]({}) by {}",
meta.title.clone().unwrap(),
meta.source_url.clone().unwrap(),
meta.artist.clone().unwrap()
));
if let Some(thumb) = meta.thumbnail.clone() {
embed = embed.thumbnail(thumb);
}
embed
}
}