第 14 屆 iThome 鐵人賽 (2022)
事件為Node.js的主要非同步事件驅動模型,非同步I/O操作完成時,某些類型物件(觸發氣)會週期性的觸發一個命名事件到事件佇列,用來呼叫函數物件(監聽器)。無論是在Express的網頁或是Discord機器人,EventListener和EventEmtiter都是必不可少的,所有能產生事件的物件都是events.EventeEmitter的實例,events模組只提供了一個物件: events:EventEmitter 。EventEmitter的核心就是事件觸發與事件監聽器功能的封裝。
首先,透過Require("events")引用events模組:
//引用events 模組
var events = require('events');
//建立eventEmitter物件
var eventEmitter = new event.Emitter();
透過on()註冊一個事件(名)和一個監聽器,增加到監聽器陣列尾端,addListener()是 on()的別名。 emit()按順序執行每個監聽器,這邊透過Discord機器人來舉例。
import DiscordJS, { GatewayIntentBits, IntentsBitField } from 'discord.js'
import dotenv from 'dotenv'
dotenv.config()
client.on('messageCreate',(message) => {
if (message.content === 'test'){
message.reply({
content:'BOT已啟動 BOT準備完畢',
})
}
})
這裡 DiscordJS
就是一個Event 監聽器,並且會在輸入test以後觸發EventEmitter,我們也能透過Once註冊最多只會觸發一次的事件。
client.once('messageCreate',(message) => {
if (message.content === 'test'){
message.reply({
content:'BOT已啟動 BOT準備完畢',
})
}
})
Discord API支援註冊指令功能,能夠讓使用者打上"/"的時候展示出能夠提供的Function,宣告的方式為:
client.on('interactionCreate',async(interaction) =>{
if(!interaction.isCommand()){
return
}
然後要在註冊事件中輸入使用伺服器的ID開啟開發者模式。
右鍵複製伺服器ID,並輸入:
const guildId ='346218020798070786'
const guild = client.guilds.cache.get(guildId)
let commands
import DiscordJS, { GatewayIntentBits, IntentsBitField } from 'discord.js'
import dotenv from 'dotenv'
dotenv.config()
const client = new DiscordJS.Client({
intents:[
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
]
})
client.on('ready',() =>{
console.log('BOT準備好了!')
const guildId ='346218020798070786'
const guild = client.guilds.cache.get(guildId)
let commands
if(guild){
commands = guild.commands
}else{
commands = client.application.commands
}
commands.create({
name:'乒',
description:'機器人會回復訊息',
})
})
client.on('interactionCreate',async(interaction) =>{
if(!interaction.isCommand()){
return
}
const {commandName,options} = interaction
if(commandName ==='乒'){
interaction.reply({
content:'BOT 乓',
ephemeral:true,
})
}
})
client.on('messageCreate',(message) => {
if (message.content === 'test'){
message.reply({
content:'BOT已啟動 BOT準備完畢',
})
}
})
client.login(process.env.TOKEN)
以下是顯示結果