Skip to content

Commit 7978a8c

Browse files
committed
refactor(ping): add more info in ping command
1 parent a21b34d commit 7978a8c

7 files changed

Lines changed: 97 additions & 24 deletions

File tree

rustmail/src/commands/ping/slash_command/ping.rs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
use std::collections::HashMap;
21
use crate::bot::ShardManagerKey;
32
use crate::commands::{BoxFuture, CommunityRegistrable, RegistrableCommand};
43
use crate::config::Config;
54
use crate::errors::{DiscordError, ModmailError, ModmailResult};
65
use crate::handlers::InteractionHandler;
76
use crate::i18n::get_translated_message;
7+
use crate::utils::{MessageBuilder, defer_response};
8+
use chrono::Utc;
89
use serenity::FutureExt;
910
use serenity::all::{CommandInteraction, Context, CreateCommand, ResolvedOption};
11+
use std::collections::HashMap;
1012
use std::sync::Arc;
1113
use std::time::Duration;
12-
use crate::utils::{defer_response, MessageBuilder};
14+
use tokio::time::Instant;
1315

1416
pub struct PingCommand;
1517

@@ -60,30 +62,58 @@ impl RegistrableCommand for PingCommand {
6062

6163
Box::pin(async move {
6264
defer_response(&ctx, &command).await?;
65+
let response = MessageBuilder::system_message(&ctx, &config)
66+
.content("...")
67+
.to_channel(command.channel_id)
68+
.build_interaction_message_followup()
69+
.await;
6370

6471
let shard_manager = ctx
6572
.data
6673
.read()
6774
.await
6875
.get::<ShardManagerKey>()
69-
.unwrap()
70-
.clone();
76+
.cloned()
77+
.ok_or(ModmailError::Discord(DiscordError::ShardManagerNotFound))?;
7178

72-
let latency = {
79+
let time_before = Instant::now();
80+
let mut res = command.create_followup(&ctx.http, response).await?;
81+
let msg_send_ping = time_before.elapsed().as_millis();
82+
83+
let gateway_ping = {
7384
let runners = shard_manager.runners.lock().await;
7485
runners.get(&ctx.shard_id).and_then(|runner| runner.latency)
7586
};
7687

88+
let start = Instant::now();
89+
ctx.http.get_gateway().await?;
90+
let api_ping = start.elapsed();
91+
7792
let mut params = HashMap::new();
78-
params.insert("latency".to_string(), format!("{:?}", latency.unwrap_or(Duration::default()).as_millis()));
93+
params.insert(
94+
"gateway_latency".to_string(),
95+
format!(
96+
"{:?}",
97+
gateway_ping.unwrap_or(Duration::default()).as_millis()
98+
),
99+
);
100+
params.insert(
101+
"api_latency".to_string(),
102+
format!("{:?}", api_ping.as_millis()),
103+
);
104+
params.insert(
105+
"message_latency".to_string(),
106+
format!("{:?}", msg_send_ping),
107+
);
79108

80109
let response = MessageBuilder::system_message(&ctx, &config)
81-
.translated_content("slash_command.ping_command", Some(&params), None, None).await
110+
.translated_content("slash_command.ping_command", Some(&params), None, None)
111+
.await
82112
.to_channel(command.channel_id)
83-
.build_interaction_message_followup().await;
113+
.build_edit_message()
114+
.await;
84115

85-
command.create_followup(&ctx.http, response).await
86-
.map_err(|e| ModmailError::Discord(DiscordError::ApiError(e.to_string())))?;
116+
res.edit(&ctx.http, response).await?;
87117

88118
Ok(())
89119
})
Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
use std::collections::HashMap;
21
use crate::bot::ShardManagerKey;
32
use crate::prelude::config::*;
43
use crate::prelude::errors::*;
54
use crate::prelude::handlers::*;
5+
use crate::utils::MessageBuilder;
6+
use chrono::Utc;
67
use serenity::all::{Context, Message};
8+
use std::collections::HashMap;
79
use std::sync::Arc;
810
use std::time::Duration;
9-
use crate::utils::MessageBuilder;
11+
use tokio::time::Instant;
1012

1113
pub async fn ping(
1214
ctx: Context,
@@ -19,22 +21,47 @@ pub async fn ping(
1921
.read()
2022
.await
2123
.get::<ShardManagerKey>()
22-
.unwrap()
23-
.clone();
24+
.cloned()
25+
.ok_or(ModmailError::Discord(DiscordError::ShardManagerNotFound))?;
2426

25-
let latency = {
27+
let time_before = Instant::now();
28+
let mut res = msg.reply(&ctx.http, "...").await?;
29+
let msg_send_ping = time_before.elapsed().as_millis();
30+
31+
let gateway_ping = {
2632
let runners = shard_manager.runners.lock().await;
2733
runners.get(&ctx.shard_id).and_then(|runner| runner.latency)
2834
};
2935

36+
let start = Instant::now();
37+
ctx.http.get_gateway().await?;
38+
let api_ping = start.elapsed();
39+
3040
let mut params = HashMap::new();
31-
params.insert("latency".to_string(), format!("{:?}", latency.unwrap_or(Duration::default()).as_millis()));
41+
params.insert(
42+
"gateway_latency".to_string(),
43+
format!(
44+
"{:?}",
45+
gateway_ping.unwrap_or(Duration::default()).as_millis()
46+
),
47+
);
48+
params.insert(
49+
"api_latency".to_string(),
50+
format!("{:?}", api_ping.as_millis()),
51+
);
52+
params.insert(
53+
"message_latency".to_string(),
54+
format!("{:?}", msg_send_ping),
55+
);
3256

33-
let _ = MessageBuilder::system_message(&ctx, &config)
34-
.translated_content("slash_command.ping_command", Some(&params), None, None).await
57+
let edited_msg = MessageBuilder::system_message(&ctx, &config)
58+
.translated_content("slash_command.ping_command", Some(&params), None, None)
59+
.await
3560
.to_channel(msg.channel_id)
36-
.send(true).await
37-
.map_err(|e| ModmailError::Discord(DiscordError::ApiError(e.to_string())))?;
61+
.build_edit_message()
62+
.await;
63+
64+
res.edit(&ctx.http, edited_msg).await?;
3865

3966
Ok(())
4067
}

rustmail/src/errors/dictionary.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ impl DictionaryManager {
188188
DiscordError::UserIsABot => ("discord.user_is_a_bot".to_string(), None),
189189
DiscordError::PermissionDenied => ("discord.permission_denied".to_string(), None),
190190
DiscordError::DmCreationFailed => ("discord.dm_creation_failed".to_string(), None),
191+
DiscordError::ShardManagerNotFound => {
192+
("discord.shard_manager_not_found".to_string(), None)
193+
}
191194
_ => ("discord.api_error".to_string(), None),
192195
},
193196
ModmailError::Command(cmd_err) => match cmd_err {

rustmail/src/errors/types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ pub enum DiscordError {
5656
DmCreationFailed,
5757
FailedToFetchCategories,
5858
FailedToMoveChannel,
59+
ShardManagerNotFound,
5960
}
6061

6162
#[derive(Debug, Clone)]
@@ -198,6 +199,7 @@ impl fmt::Display for DiscordError {
198199
DiscordError::DmCreationFailed => write!(f, "Failed to create DM channel"),
199200
DiscordError::FailedToFetchCategories => write!(f, "Failed to fetch categories"),
200201
DiscordError::FailedToMoveChannel => write!(f, "Failed to move_thread channel"),
202+
DiscordError::ShardManagerNotFound => write!(f, "Shard manager not found"),
201203
}
202204
}
203205
}

rustmail/src/i18n/language/en.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ pub fn load_english_messages(dict: &mut ErrorDictionary) {
5050
"discord.user_is_a_bot".to_string(),
5151
DictionaryMessage::new("The specified user is a rustmail."),
5252
);
53+
dict.messages.insert(
54+
"discord.shard_manager_not_found".to_string(),
55+
DictionaryMessage::new("Shard manager not found."),
56+
);
5357
dict.messages.insert(
5458
"command.invalid_format".to_string(),
5559
DictionaryMessage::new("Invalid command format")
@@ -885,7 +889,7 @@ pub fn load_english_messages(dict: &mut ErrorDictionary) {
885889
);
886890
dict.messages.insert(
887891
"help.ping".to_string(),
888-
DictionaryMessage::new("Show the actual latency of the bot."),
892+
DictionaryMessage::new("Shows the actual latency of the bot."),
889893
);
890894
dict.messages.insert(
891895
"add_reminder.helper".to_string(),
@@ -934,10 +938,10 @@ pub fn load_english_messages(dict: &mut ErrorDictionary) {
934938
);
935939
dict.messages.insert(
936940
"slash_command.ping_command_desc".to_string(),
937-
DictionaryMessage::new("Check the discord bot latency."),
941+
DictionaryMessage::new("Check the Discord bot latency."),
938942
);
939943
dict.messages.insert(
940944
"slash_command.ping_command".to_string(),
941-
DictionaryMessage::new("The Discord bot latency is **{latency}** ms."),
945+
DictionaryMessage::new("## Latency\n\nGateway latency: **{gateway_latency}** ms\nMinimal REST latency (GET /gateway): **{api_latency}** ms\nREST latency (message send): **{message_latency}** ms"),
942946
);
943947
}

rustmail/src/i18n/language/fr.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ pub fn load_french_messages(dict: &mut ErrorDictionary) {
4545
"discord.user_is_a_bot".to_string(),
4646
DictionaryMessage::new("L'utilisateur spécifié est un rustmail"),
4747
);
48+
dict.messages.insert(
49+
"discord.shard_manager_not_found".to_string(),
50+
DictionaryMessage::new("Shard manager non trouvé."),
51+
);
4852
dict.messages.insert(
4953
"command.invalid_format".to_string(),
5054
DictionaryMessage::new("Format de commande invalide")
@@ -950,6 +954,6 @@ pub fn load_french_messages(dict: &mut ErrorDictionary) {
950954
);
951955
dict.messages.insert(
952956
"slash_command.ping_command".to_string(),
953-
DictionaryMessage::new("La latence actuelle du bot est de **{latency}** ms."),
957+
DictionaryMessage::new("## Latence\n\nLatence Gateway : **{gateway_latency}** ms.\nLatence REST minimale (GET /gateway) : **{api_latency}** ms.\nLatence REST (envoi d'un message) : **{message_latency}** ms."),
954958
);
955959
}

rustmail/src/utils/message/message_builder.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ impl<'a> MessageBuilder<'a> {
531531

532532
if self.should_use_embed().await {
533533
message = message.embed(self.build_embed().await);
534+
message = message.content("");
534535
} else {
535536
let content = self.build_plain_message();
536537
if !content.is_empty() {
@@ -550,6 +551,7 @@ impl<'a> MessageBuilder<'a> {
550551

551552
if self.should_use_embed().await {
552553
message = message.embed(self.build_embed().await);
554+
message = message.content("");
553555
} else {
554556
let content = self.build_plain_message();
555557
if !content.is_empty() {
@@ -571,6 +573,7 @@ impl<'a> MessageBuilder<'a> {
571573

572574
if self.should_use_embed().await {
573575
message = message.embed(self.build_embed().await);
576+
message = message.content("");
574577
} else {
575578
let content = self.build_plain_message();
576579
if !content.is_empty() {

0 commit comments

Comments
 (0)