iT邦幫忙

0

使用 Discord.js v14 開發全能Discord機器人 | Ep.4 查看延遲「ping」

  • 分享至 

  • twitterImage
  •  

這個系列會帶著您通過Node.js中的Discord.js套件,從0到1開始製作屬於自己的Discord機器人,希望可以幫助大家成為機器人的開發者哦!

前言

這篇教學將會帶著大家為機器人新增一個指令:

  • ping
    查看機器人延遲數值

為什麼要知道機器人的延遲數值呢?

  1. 方便使用者了解機器人目前的運行狀況,在遇到使用上的狀況時也可以知道是否是因為延遲過高而造成的。
  2. 方便製作者除錯,機器人的製作者得到了機器人的延遲,同樣可以了解自己的機器人當前的運行情形,也可以知道機器人是否適合在當前的環境運行。

前置工作

這篇文章的工作會編寫到 index.js 以及 deploy.js 分別用於執行機器人以及註冊指令。

註冊指令 deploy.js

......前段省略
const commands = [
  {
    name: 'ping',
    description: 'Replies with Pong!',
  },
];
後段省略......

首先,要製作 deploy.js-註冊斜線指令,由於我們所使用的官方範例已經有註冊一個指令叫做「ping」,因此我們只要修改他的敘述即可,將 description: 'Replies with Pong!' 的引號中改為您想為這個指令設置的資訊,例如:

......前段省略
const commands = [
  {
    name: 'ping',
    description: '得知機器人的延遲資訊',
  },
];
後段省略......

編寫完後存檔,並在控制台輸入以下指令執行程式碼:

node deploy.js

等待運作完成且控制台顯示如下後,即完成註冊指令!

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

Ping 延遲查看

接下來,就可以開始編寫程式囉!要編寫的是機器人主程式 index.js 的 onInteractionCreate 事件

......前段省略
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秒

機器人延遲

首先,我們先讓機器人回應機器人延遲,獲得方式如下(解釋皆以註解方式寫在程式碼中,// 後的文字可以刪除或修改):

//對使用者進行回應,告訴使用者我們正在測量延遲,同時讓此訊息用於計算機器人回應的延遲時間
const msg = await interaction.reply({
    content: "正在計算延遲......", //設定訊息的內容
    fetchReply: true //告訴API我們將會對這個指令做出進一步的回應
});
//將ping變數設定為「成功回應的時間」與「指令發送的時間」之間隔
const ping = msg.createdTimestamp - interaction.createdTimestamp;

將其套用到我們的程式碼即為如此:

......前段省略
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延遲,方式如下:

client.ws.ping

比剛剛的機器人延遲簡單了許多,直接將其套入到程式碼中:

......前段省略
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 是指換行
  }
});
後段省略......

存檔後重新啟動就完成囉!
再次使用指令(兩指令的時間隔了四分鐘,是筆者因為方便截圖,實際運行不會唷!):

總結

此篇成品

......前段省略
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,希望這篇教學可以幫助到您!下篇文章再見囉,掰掰~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言