Change queue command to accept query and display an embed
The queue command now displays an embed with pagination and allows for songs to be queried by providing arguments. Each argument is interpreted as a keyword that is searched for. Signed-off-by: trivernis <trivernis@protonmail.com>pull/11/head
parent
0f47c5b942
commit
a98f401fbe
@ -0,0 +1,2 @@
|
||||
pub mod now_playing;
|
||||
pub mod queue;
|
@ -0,0 +1,45 @@
|
||||
use crate::providers::music::queue::Song;
|
||||
use crate::utils::error::BotResult;
|
||||
use bot_serenityutils::menu::{MenuBuilder, Page};
|
||||
use serenity::builder::CreateMessage;
|
||||
use serenity::client::Context;
|
||||
use serenity::model::id::ChannelId;
|
||||
use std::time::Duration;
|
||||
|
||||
/// Creates a new queue menu
|
||||
pub async fn create_queue_menu(
|
||||
ctx: &Context,
|
||||
channel_id: ChannelId,
|
||||
songs: Vec<(usize, Song)>,
|
||||
) -> BotResult<()> {
|
||||
let page_count = (songs.len() as f32 / 10.0).ceil() as usize;
|
||||
let pages: Vec<Page<'static>> = songs
|
||||
.chunks(10)
|
||||
.enumerate()
|
||||
.map(|(i, entries)| create_songs_page(page_count, i + 1, entries.to_vec()))
|
||||
.collect();
|
||||
|
||||
MenuBuilder::new_paginator()
|
||||
.add_pages(pages)
|
||||
.timeout(Duration::from_secs(120))
|
||||
.build(ctx, channel_id)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Creates a new page with songs
|
||||
fn create_songs_page(total_pages: usize, page: usize, songs: Vec<(usize, Song)>) -> Page<'static> {
|
||||
let mut message = CreateMessage::default();
|
||||
let description_entries: Vec<String> = songs
|
||||
.into_iter()
|
||||
.map(|(i, s)| format!("{:0>3}. {} - {}", i, s.author(), s.title()))
|
||||
.collect();
|
||||
message.embed(|e| {
|
||||
e.title("Queue")
|
||||
.description(format!("```md\n{}\n```", description_entries.join("\n")))
|
||||
.footer(|f| f.text(format!("Page {} of {}", page, total_pages)))
|
||||
});
|
||||
|
||||
Page::new_static(message)
|
||||
}
|
Loading…
Reference in New Issue