1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use crate::{
    checks::ENABLED_CHECK,
    ClientDataKey,
};
use serenity::{
    framework::standard::{
        macros::command,
        Args,
        CommandResult,
    },
    model::prelude::*,
    prelude::*,
};
use tracing::warn;

#[command]
#[description("Get the bot's latency in this server")]
#[checks(Enabled)]
#[bucket("default")]
async fn latency(ctx: &Context, msg: &Message, _args: Args) -> CommandResult {
    let data_lock = ctx.data.read().await;
    let client_data = data_lock.get::<ClientDataKey>().unwrap();
    let shard_manager = client_data.shard_manager.clone();
    drop(data_lock);

    let shard_id = ctx.shard_id;

    let latency = {
        let runners = shard_manager.runners.lock().await;
        let maybe_shard = runners.get(&shard_id);
        maybe_shard.and_then(|shard| shard.latency)
    };

    match latency {
        Some(latency) => {
            msg.channel_id
                .say(&ctx.http, format!("Shard Latency: {latency:?}"))
                .await?;
        }
        None => {
            warn!("Failed to get latency for shard: {shard_id}");
            msg.channel_id
                .say(&ctx.http, "Failed to get latency")
                .await?;
        }
    }
    Ok(())
}