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;
|
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