use { async_trait::async_trait, ruvolt::{ models::{events::ReadyEvent, Message, User}, Client, Context, EventHandler, Result, }, std::{env, time::Instant}, tokio::time::{sleep, Duration}, }; struct Handler; #[async_trait] impl EventHandler for Handler { async fn ready(&self, cx: Context, _: ReadyEvent) { if let Ok(User { username, .. }) = cx.user().await { println!("@{username} is ready!"); } } async fn message(&self, cx: Context, msg: Message) { let content = msg.content.to_string(); if content == "!ping" { let start = Instant::now(); if let Ok(mut msg) = msg.reply(&cx, "Pong!", true).await { let delta_latency = (Instant::now() - start).as_millis(); let bonfire_latency = cx.latency().await.as_millis(); let content = format!( "### Pong!\ \n#### The Delta API latency is `{delta_latency}ms`\ \n#### The Bonfire API latency is `{bonfire_latency}ms`" ); msg.edit(&cx, content).await.ok(); sleep(Duration::from_secs(5)).await; msg.delete(&cx).await.ok(); } } } } #[tokio::main] async fn main() -> Result { let token = env::var("TOKEN").unwrap(); let mut client = Client::new(Handler, token).await?; client.listen().await }