# 如何使用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`