refluxer 0.2.0

Rust API wrapper for Fluxer
Documentation
//! A simple ping-pong bot using the high-level Client.
//!
//! Run: FLUXER_TOKEN=your_token cargo run --example ping_bot --features client

use std::time::Instant;

use refluxer::model::message::Message;
use refluxer::model::user::User;
use refluxer::{Client, Context, EventHandler};

struct Handler;

#[async_trait::async_trait]
impl EventHandler for Handler {
    async fn ready(&self, _ctx: Context, user: User) {
        println!("Connected as {}#{}", user.username, user.discriminator);
    }

    async fn resumed(&self, _ctx: Context) {
        println!("Session resumed!");
    }

    async fn message_create(&self, ctx: Context, msg: Message) {
        if msg.author.bot.unwrap_or(false) {
            return;
        }

        if msg.content == "!ping" {
            let start = Instant::now();

            let result = ctx
                .send(msg.channel_id)
                .content("Pong!")
                .reply(msg.id)
                .embed(|e| {
                    e.title("Pong!")
                        .description("Bot is alive and responding.")
                        .color(0x00CC88)
                        .field(
                            "Latency",
                            format!("{}ms", start.elapsed().as_millis()),
                            true,
                        )
                        .timestamp_now()
                        .footer("refluxer")
                })
                .await;

            if let Err(e) = result {
                eprintln!("Failed to send message: {e}");
            }
        }
    }
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();

    let token = std::env::var("FLUXER_TOKEN").expect("FLUXER_TOKEN env var required");

    let client = Client::builder()
        .token(&token)
        .event_handler(Handler)
        .build()
        .expect("failed to build client");

    if let Err(e) = client.start().await {
        eprintln!("Client error: {e}");
    }
}