use crate::utils::error::BotResult; use bot_database::models::Media; use serenity::builder::CreateMessage; use serenity::client::Context; use serenity::model::id::{ChannelId, UserId}; use serenity_additions::menu::{MenuBuilder, Page}; use std::time::Duration; /// Creates a new gifs embed pub async fn create_media_menu( ctx: &Context, channel_id: ChannelId, media: Vec, owner: UserId, ) -> BotResult<()> { let total_pages = (media.len() as f32 / 10.0).ceil() as usize; let pages: Vec = media .chunks(10) .enumerate() .map(|(page, media)| create_media_page(page + 1, total_pages, media.to_vec())) .collect(); MenuBuilder::new_paginator() .timeout(Duration::from_secs(120)) .add_pages(pages) .show_help() .owner(owner) .build(ctx, channel_id) .await?; Ok(()) } /// Creates a new gif page pub fn create_media_page(page: usize, total_pages: usize, media: Vec) -> Page<'static> { let mut message = CreateMessage::default(); let description_lines: Vec = media .into_iter() .map(|m| { format!( "{} - {} - [Source]({})", m.category.unwrap_or("*N/A*".to_string()), m.name.unwrap_or("*N/A*".to_string()), m.url ) }) .collect(); message.embed(|e| { e.title("Media") .description(description_lines.join("\n")) .footer(|f| f.text(format!("Page {} of {}", page, total_pages))) }); Page::new_static(message) }