Change now playing to update automatically
Signed-off-by: trivernis <trivernis@protonmail.com>pull/2/head
parent
f32228e61f
commit
f36cf5a477
@ -0,0 +1 @@
|
||||
pub mod music;
|
@ -0,0 +1,58 @@
|
||||
use crate::utils::error::BotResult;
|
||||
use crate::utils::messages::ShareableMessage;
|
||||
use serenity::builder::CreateEmbed;
|
||||
use serenity::http::Http;
|
||||
use serenity::model::prelude::ChannelId;
|
||||
use songbird::input::Metadata;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[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(&self, meta: &Metadata) -> BotResult<()> {
|
||||
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
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
pub const SETTING_AUTOSHUFFLE: &str = "music.autoshuffle";
|
||||
pub const GUILD_SETTINGS: &[&str] = &[SETTING_AUTOSHUFFLE];
|
@ -1,2 +1 @@
|
||||
pub(crate) mod constants;
|
||||
pub(crate) mod music;
|
||||
|
@ -0,0 +1,72 @@
|
||||
use crate::utils::error::BotResult;
|
||||
use serenity::async_trait;
|
||||
use serenity::builder::{CreateMessage, EditMessage};
|
||||
use serenity::http::{CacheHttp, Http};
|
||||
use serenity::model::channel::{Message, Reaction};
|
||||
use serenity::model::id::{ChannelId, MessageId};
|
||||
use std::sync::Arc;
|
||||
|
||||
#[async_trait]
|
||||
pub trait EventDrivenMessage: Send + Sync {
|
||||
async fn on_deleted(&self) -> BotResult<()>;
|
||||
async fn on_reaction_add(&self, reaction: Reaction) -> BotResult<()>;
|
||||
async fn on_reaction_remove(&self, reaction: Reaction) -> BotResult<()>;
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ShareableMessage {
|
||||
http: Arc<Http>,
|
||||
channel_id: u64,
|
||||
message_id: u64,
|
||||
}
|
||||
|
||||
impl ShareableMessage {
|
||||
/// Creates a new active message
|
||||
pub async fn create<'a, F>(http: Arc<Http>, channel_id: &ChannelId, f: F) -> BotResult<Self>
|
||||
where
|
||||
for<'b> F: FnOnce(&'b mut CreateMessage<'a>) -> &'b mut CreateMessage<'a>,
|
||||
{
|
||||
let msg = channel_id.send_message(http.http(), f).await?;
|
||||
|
||||
Ok(Self::new(http, &msg.channel_id, &msg.id))
|
||||
}
|
||||
|
||||
/// Creates a new active message
|
||||
pub fn new(http: Arc<Http>, channel_id: &ChannelId, message_id: &MessageId) -> Self {
|
||||
Self {
|
||||
http,
|
||||
channel_id: channel_id.0,
|
||||
message_id: message_id.0,
|
||||
}
|
||||
}
|
||||
|
||||
/// Deletes the underlying message
|
||||
pub async fn delete(&self) -> BotResult<()> {
|
||||
let msg = self.get_message().await?;
|
||||
msg.delete(&self.http).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Edits the active message
|
||||
pub async fn edit<F>(&self, f: F) -> BotResult<()>
|
||||
where
|
||||
F: FnOnce(&mut EditMessage) -> &mut EditMessage,
|
||||
{
|
||||
let mut message = self.get_message().await?;
|
||||
message.edit(&self.http, f).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Returns the underlying message
|
||||
async fn get_message(&self) -> BotResult<Message> {
|
||||
let message = self
|
||||
.http
|
||||
.http()
|
||||
.get_message(self.channel_id, self.message_id)
|
||||
.await?;
|
||||
|
||||
Ok(message)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue