iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

Node.js系列 第 15

DAY 15 知名DC機器人該有的3個功能

  • 分享至 

  • xImage
  •  
tags: 第 14 屆 iThome 鐵人賽 (2022)

I.事件(Event)

事件為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();

II.註冊事件名 & 監聽器

透過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準備完畢',
        })
    }
})

III.註冊功能

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

Discord機器人實作成品

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)

以下是顯示結果


上一篇
DAY 14 機器人做得更好 ! DC機器人 Node.js建置
下一篇
WebSocket
系列文
Node.js30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言