# 如何使用Discord.js v13,建立一個Discord機器人 (Ep.2)
[上篇文章](https://hackmd.io/@jc_I--QQRWeD_qhJXTliTA/discord_js_learn1)我們帶著大家建立機器人,註冊斜線指令並讓機器人上線,這篇文章會指導大家製作更多內容!
## 範例解說
上篇教學中,我們使用了官方的範例,來運行程式碼,首先我們將會先了解上次的範例是如何運作的:
### 註冊指令
首先,我們先來解說註冊斜線指令的檔案
```javascript=
const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');
```
這段程式碼是為了匯入註冊指令所需的模組,讓後方的程式碼可以使用模組來創建、註冊斜線指令。
```javascript=4
const commands = [{
name: 'ping',
description: 'Replies with Pong!'
}];
```
這段程式碼是為了設定指令名稱、說明,例如:上述程式碼為指令名稱是ping,而說明是Replies with Pong! ( 在輸入斜線時會看到機器人的所有指令和各個指令說明 )。
```javascript=9
const rest = new REST({ version: '9' }).setToken('在這裡輸入機器人token');
```
這段程式碼設定了機器人登入用的Token,讓接下來註冊斜線指令時使用。
```javascript=11
(async () => {
try {
console.log('Started refreshing application (/) commands.');
```
開始註冊斜線指令,並在輸出頁面紀錄"Started refreshing application (/) commands."。
```javascript=15
await rest.put(
Routes.applicationCommands('在這裡輸入ClientID'),
//記得替換ClientID
{ body: commands },
);
```
將剛剛撰寫的指令名稱、說明等資料拿來註冊斜線指令,且需要輸入ClientID,讓他對機器人註冊指令。
```javascript=21
console.log('Successfully reloaded application (/) commands.');
} catch (error) {
console.error(error);
}
})();
```
若成功註冊斜線指令,則輸出"Successfully reloaded application (/) commands.",若失敗則取得錯誤並記錄在輸出頁面。
### 機器人檔案
接著來講解機器人的運行檔案:
```javascript=
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
```
這裡是為了匯入Discord.js模組,以及編寫機器人會用到的模組。
```javascript=4
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
```
使用client中的"當機器人準備好上線"(ready),並在上線時輸出:Logged in as 機器人名稱!
```javascript=8
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
}
});
```
使用client中的"當指令被創建"(interactionCreate),並確定是否為斜線指令。若是斜線指令,則對不同的指令發出不同的回應。上述程式碼是當指令為ping時,回應Pong!這個字串。
```javascript=16
client.login('在這裡輸入你的機器人token');
```
使用機器人的token來登入,讓機器人上線!
## 教學
這段內容會指導大家增加機器人的功能
### 狀態設定
要設定機器人的狀態,可以在ready事件的程式碼內加入`client.user.setPresence`
```javascript=
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
client.user.setPresence({ activities: [{ name: "狀態的內容文字" }], status: 'connecting' });
});
```
這段程式碼可以設定機器人的狀態
第一個字串中可以填入機器人狀態的內容文字,第二個字串可以設定機器人的在線狀態,像是:在線、閒置、請勿打擾、隱形。
通過`${client.guilds.cache.size}`(機器人在多少個伺服器),設定"在幾個伺服器"的狀態。
![](https://i.imgur.com/PTP2mUu.png)
### 新增 " info " 指令
首先,我們先註冊兩個新的斜線指令,並執行檔案:
```javascript=
//..以上省略..
const commands = [{
name: 'ping',
description: 'Replies with Pong!'
},
{
name: 'serverinfo',
description: '伺服器資訊'
},
{
name: 'userinfo',
description: '使用者資訊'
}];
//..以下省略..
```
首先我們先來撰寫serverinfo的程式碼:
要獲取伺服器的名稱,可以使用`${interaction.guild.name}`,
會獲取使用指令的伺服器的伺服器名稱。
而人數可以使用`${interaction.guild.memberCount}`獲取,
會獲取指令使用伺服器的總人數。
若要將字串和變數組成一段文字,可以使用下方方法 ( 取代原本的這段 ):
```javascript=
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
//判斷是否是斜線指令
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
//針對指令回覆Pong!
}
if (interaction.commandName === 'serverinfo') {
await interaction.reply(`伺服器名稱: ${interaction.guild.name}\n伺服器人數: ${interaction.guild.memberCount}`);
//使用``和${}來寫出字串和變數的字串組合
}
});
```
接著我們來撰寫userinfo!
要獲取使用指令的用戶名稱,可以通過`${interaction.user.tag}`,
而獲取ID則通過`${interaction.user.id}`
因此可以將程式碼寫成下方方法:
```javascript=
client.on('interactionCreate', async interaction => {
if (!interaction.isCommand()) return;
//判斷是否是斜線指令
if (interaction.commandName === 'ping') {
await interaction.reply('Pong!');
//針對指令回覆Pong!
}
if (interaction.commandName === 'serverinfo') {
await interaction.reply(`伺服器名稱: ${interaction.guild.name}\n伺服器人數: ${interaction.guild.memberCount}`);
//使用``和${}來寫出字串和變數的字串組合
}
if (interaction.commandName === 'serverinfo') {
await interaction.reply(`使用者名稱: ${interaction.user.tag}\n使用者ID: ${interaction.user.id}`);
//使用``和${}來寫出字串和變數的字串組合
}
});
```
編寫完畢後,即可註冊指令並執行此檔案 ( 機器人主程式 ),並在你的伺服器測試指令!
###### tags: `Discord.js`