# 使用 Discord.js v14 開發全能Discord機器人 | Ep.4 查看延遲「ping」
:::info
這個系列會帶著您通過Node.js中的Discord.js套件,從0到1開始製作屬於自己的Discord機器人,希望可以幫助大家成為機器人的開發者哦!
:::
## 前言
這篇教學將會帶著大家為機器人新增一個指令:
* ping
查看機器人延遲數值
### 為什麼要知道機器人的延遲數值呢?
1. 方便使用者了解機器人目前的運行狀況,在遇到使用上的狀況時也可以知道是否是因為延遲過高而造成的。
2. 方便製作者除錯,機器人的製作者得到了機器人的延遲,同樣可以了解自己的機器人當前的運行情形,也可以知道機器人是否適合在當前的環境運行。
## 前置工作
這篇文章的工作會編寫到 `index.js` 以及 `deploy.js` 分別用於執行機器人以及註冊指令。
## 註冊指令 deploy.js
```javascript=2
......前段省略
const commands = [
{
name: 'ping',
description: 'Replies with Pong!',
},
];
後段省略......
```
首先,要製作 `deploy.js`-註冊斜線指令,由於我們所使用的官方範例已經有註冊一個指令叫做「ping」,因此我們只要修改他的敘述即可,將 `description: 'Replies with Pong!'` 的引號中改為您想為這個指令設置的資訊,例如:
```javascript=2
......前段省略
const commands = [
{
name: 'ping',
description: '得知機器人的延遲資訊',
},
];
後段省略......
```
編寫完後存檔,並在控制台輸入以下指令執行程式碼:
```
node deploy.js
```
等待運作完成且控制台顯示如下後,即完成註冊指令!

此時到Discord輸入斜線 (/) 會發現機器人的 `ping` 指令的敘述已經成功修改(倘諾未出現可能是延遲問題,稍待片刻即可)

## Ping 延遲查看
接下來,就可以開始編寫程式囉!要編寫的是機器人主程式 `index.js` 的 onInteractionCreate 事件
```javascript=8
......前段省略
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
}
});
後段省略......
```
這裡也已經有了偵測ping使用的事件,因此我們直接對裡面的內容進行修改即可!
機器人的延遲分為「機器人延遲」以及「API延遲」,機器人延遲為機器人對於指令處理的延遲,而api延遲是官方Discord API的延遲數值,皆以毫秒(ms)顯示
*Note: 1000毫秒 = 1秒*
### 機器人延遲
首先,我們先讓機器人回應機器人延遲,獲得方式如下(解釋皆以註解方式寫在程式碼中,`//` 後的文字可以刪除或修改):
```javascript
//對使用者進行回應,告訴使用者我們正在測量延遲,同時讓此訊息用於計算機器人回應的延遲時間
const msg = await interaction.reply({
content: "正在計算延遲......", //設定訊息的內容
fetchReply: true //告訴API我們將會對這個指令做出進一步的回應
});
//將ping變數設定為「成功回應的時間」與「指令發送的時間」之間隔
const ping = msg.createdTimestamp - interaction.createdTimestamp;
```
將其套用到我們的程式碼即為如此:
```javascript=8
......前段省略
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
const msg = await interaction.reply({
content: "正在計算延遲......",
fetchReply: true
});
const ping = msg.createdTimestamp - interaction.createdTimestamp;
interaction.editReply(`機器人延遲:${ping} ms`)
//editReply是指修改回覆,使用此函數是因為我們先前已經發送過指令,若用reply會發生錯誤
}
});
後段省略......
```
*Note: 兩個\`中包住的字串,可以放入${},大括號中包入變數或函數,顯示出的即為該值*
將此段程式碼存檔後運行
```
node index.js
```
等待準備好開始運行後,至Discord輸入指令,即可獲得機器人的延遲!


### API延遲
接著,要得知的是API延遲,方式如下:
```javascript
client.ws.ping
```
比剛剛的機器人延遲簡單了許多,直接將其套入到程式碼中:
```javascript=8
......前段省略
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
// 機器人延遲獲取
const msg = await interaction.reply({
content: "正在計算延遲......",
fetchReply: true
});
const ping = msg.createdTimestamp - interaction.createdTimestamp;
// 告知用戶延遲
interaction.editReply(`機器人延遲:${ping} ms\nAPI延遲:${client.ws.ping} ms`)
// \n 是指換行
}
});
後段省略......
```
存檔後重新啟動就完成囉!
再次使用指令(兩指令的時間隔了四分鐘,是筆者因為方便截圖,實際運行不會唷!):


## 總結
### 此篇成品
```javascript=8
......前段省略
client.on('interactionCreate', async interaction => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === 'ping') {
const msg = await interaction.reply({
content: "正在計算延遲......",
fetchReply: true
});
const ping = msg.createdTimestamp - interaction.createdTimestamp;
interaction.editReply(`機器人延遲:${ping} ms\nAPI延遲:${client.ws.ping} ms`)
}
});
後段省略......
```
這篇文章帶著大家製作了我們的第一個手作指令:ping,希望這篇教學可以幫助到您!下篇文章再見囉,掰掰~
###### tags: `Node.js` `Discord.js`