use crate::serenity_prelude as serenity;
pub async fn paginate<U, E>(
ctx: crate::Context<'_, U, E>,
pages: &[&str],
) -> Result<(), serenity::Error> {
let ctx_id = ctx.id();
let prev_button_id = format!("{}prev", ctx_id);
let next_button_id = format!("{}next", ctx_id);
let reply = {
let components = serenity::CreateActionRow::Buttons(vec![
serenity::CreateButton::new(&prev_button_id).emoji('◀'),
serenity::CreateButton::new(&next_button_id).emoji('▶'),
]);
crate::CreateReply::default()
.embed(serenity::CreateEmbed::default().description(pages[0]))
.components(vec![components])
};
ctx.send(reply).await?;
let mut current_page = 0;
while let Some(press) = serenity::collector::ComponentInteractionCollector::new(ctx)
.filter(move |press| press.data.custom_id.starts_with(&ctx_id.to_string()))
.timeout(std::time::Duration::from_secs(3600 * 24))
.await
{
if press.data.custom_id == next_button_id {
current_page += 1;
if current_page >= pages.len() {
current_page = 0;
}
} else if press.data.custom_id == prev_button_id {
current_page = current_page.checked_sub(1).unwrap_or(pages.len() - 1);
} else {
continue;
}
press
.create_response(
ctx.serenity_context(),
serenity::CreateInteractionResponse::UpdateMessage(
serenity::CreateInteractionResponseMessage::new()
.embed(serenity::CreateEmbed::new().description(pages[current_page])),
),
)
.await?;
}
Ok(())
}