iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 8
0
AI & Data

用Node.js製作後台零負擔的DiscordBot系列 第 8

Day8 - 呃...他會需要更多前綴字

昨天我們對message事件做了完善的前置判斷

如果你做的跟範例一樣,這時我們可以在 ! 後面加入任何字串,來命令機器人做對應的事情

假設之後機器人的指令不斷增加,除了單純的文字回覆,可能還會有查表,投票,管理員指令,權限控制與音樂功能等

這種時候、比起單純的只使用!,機器人支援多種前綴詞顯然是更好的分類手段
今天我們進一步修改昨天已經完善的message框架,並且做出音樂功能(假)


首先,請幫我在DiscordBot資料夾內新增一個JSONHome資料夾,把auth.json放進去,然後新增一個prefix.json檔

8-1
8-2

(prefix.json的內容)

bot.js的最上方幫我加載prefix.json

8-3

(auth.json的路徑記得也要一併修改喔!)


我們把前綴字整理成了JSONArray物件
這樣一來,我們就做到了前綴字的統整,之後不管是新增或調用參數都會方便許多

然後我們把下面的message事件改成這樣

8-4

簡單來說就是從原本只判斷驚嘆號,變成只要前綴詞符合prefix.json內的任一Value就給過,並且由tempPrefix來接受符合條件的參數
同學們可以參考昨天的範例,來比對每一行的作用。

做到這裡,我們已經可以判斷多種前綴了,不過還沒在實作區判斷成功的是哪一個前綴
原本我們打!ping,機器人會回pong
現在打@ping也會通過了,如果prefix.json內的值不是@而是#或$$#@#$@甚麼的也一樣,依此類推
切割字串的方式也是可以動態化的,不過筆者不在此贅述。
我們繼續完善後續判斷

8-5

這樣,如果使用者輸入!xxx,就會進入上方的文字回應功能
輸入@xxx,就會進入下方的音樂指令了

8-6


音樂指令的部份我們明天繼續製作,以下是今天的完整程式碼:

const Discord = require('discord.js');
const client = new Discord.Client();
const auth = require('./JSONHome/auth.json');
const prefix = require('./JSONHome/prefix.json');

client.login(auth.key);

client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
});

client.on('message', msg => {
    //前置判斷
    try {
        if (!msg.guild || !msg.member) return; //訊息內不存在guild元素 = 非群組消息(私聊)
        if (!msg.member.user) return; //幫bot值多拉一層,判斷上層物件是否存在
        if (msg.member.user.bot) return; //訊息內bot值為正 = 此消息為bot發送
    } catch (err) {
        return;
    }

    //字串分析
    try {
        let tempPrefix = '-1';
        const prefixED = Object.keys(prefix); //前綴符號定義
        prefixED.forEach(element => {
            if (msg.content.substring(0, prefix[element].Value.length) === prefix[element].Value) {
                tempPrefix = element;
            }
        });

        //實作
        switch (tempPrefix) {
            case '0': //文字回應功能
                const cmd = msg.content.substring(prefix[tempPrefix].Value.length).split(' '); //以空白分割前綴以後的字串
                switch (cmd[0]) {
                    case 'ping':
                        msg.channel.send('pong');
                        break;
                    case '老婆':
                        msg.reply('你沒有老婆!!');
                        break;
                    case 'myAvatar':
                        const avatar = GetMyAvatar(msg);
                        if (avatar.files) msg.channel.send(`${msg.author}`, avatar).catch(err => { console.log(err) });
                        break;
                }
                break;
            case '1': //音樂指令
                msg.channel.send('music');
                break;
        }
    } catch (err) {
        console.log('OnMessageError', err);
    }
});

//獲取頭像
function GetMyAvatar(msg) {
    try {
        return {
            files: [{
                attachment: msg.author.displayAvatarURL('png', true),
                name: 'avatar.jpg'
            }]
        };
    } catch (err) {
        console.log('GetMyAvatar,Error');
    }
}

上一篇
Day7 - 你的Bot需要一個前綴字
下一篇
Day9 - 註解摺疊與音樂系統介紹
系列文
用Node.js製作後台零負擔的DiscordBot31

尚未有邦友留言

立即登入留言