commit
b2db137663
@ -0,0 +1,56 @@
|
||||
use crate::core::MessageHandle;
|
||||
use crate::error::SerenityUtilsResult;
|
||||
use serenity::builder::CreateMessage;
|
||||
use serenity::http::Http;
|
||||
use serenity::model::channel::Message;
|
||||
use serenity::model::id::ChannelId;
|
||||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
pub struct EphemeralMessage;
|
||||
|
||||
impl EphemeralMessage {
|
||||
/// Ensures that an already existing message is
|
||||
/// deleted after a certain amount of time
|
||||
pub async fn create_from_message(
|
||||
http: &Arc<Http>,
|
||||
message: &Message,
|
||||
timeout: Duration,
|
||||
) -> SerenityUtilsResult<()> {
|
||||
log::debug!("Creating ephemeral message from existing message");
|
||||
let handle = MessageHandle::new(message.channel_id, message.id);
|
||||
let http = Arc::clone(&http);
|
||||
|
||||
log::debug!("Starting delete task");
|
||||
tokio::spawn(async move {
|
||||
log::debug!("Waiting for timeout to pass");
|
||||
tokio::time::sleep(timeout).await;
|
||||
log::debug!("Deleting ephemeral message");
|
||||
if let Err(e) = http
|
||||
.delete_message(handle.channel_id, handle.message_id)
|
||||
.await
|
||||
{
|
||||
log::error!("Failed to delete ephemeral message {:?}: {}", handle, e);
|
||||
}
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Creates a new message that is deleted after a certain amount of time
|
||||
pub async fn create<'a, F>(
|
||||
http: &Arc<Http>,
|
||||
channel_id: ChannelId,
|
||||
timeout: Duration,
|
||||
f: F,
|
||||
) -> SerenityUtilsResult<Message>
|
||||
where
|
||||
F: for<'b> FnOnce(&'b mut CreateMessage<'a>) -> &'b mut CreateMessage<'a>,
|
||||
{
|
||||
log::debug!("Creating new ephemeral message");
|
||||
let msg = channel_id.send_message(http, f).await?;
|
||||
Self::create_from_message(http, &msg, timeout).await?;
|
||||
|
||||
Ok(msg)
|
||||
}
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
pub mod core;
|
||||
pub mod ephemeral_message;
|
||||
pub mod error;
|
||||
pub mod macros;
|
||||
pub mod menu;
|
||||
|
@ -0,0 +1,16 @@
|
||||
/// Forwards the error directly to the user
|
||||
/// without having to accept it in any handler.
|
||||
/// Can only be used in async functions that return a Result.
|
||||
#[macro_export]
|
||||
macro_rules! forward_error {
|
||||
($ctx:expr,$channel_id:expr,$result:expr) => {
|
||||
match $result {
|
||||
Err(e) => {
|
||||
use bot_serenityutils::{core::SHORT_TIMEOUT, ephemeral_message::EphemeralMessage};
|
||||
$channel_id.say($ctx, format!("‼️ {}", e)).await?;
|
||||
return Ok(());
|
||||
}
|
||||
Ok(v) => v,
|
||||
}
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue