discord.jsを使ったbot制作

最終更新日

nodejs

かんたんです。やってみましょう。

環境構築

作業用のディレクトリで以下を実行します。
npm initの時になにやら色々聞かれますが、適宜判断してください。

touch ./app.js
npm init
npm i discord.js

APIで使うトークンなどの設定ファイルはプログラム本体に直接記述するのではなく、別ファイルにまとめて記述すべきです。

以下の内容を、./config.jsonに記述してください。

{
    "discord": {
        "token": "xxxxxxxxxxxxxxxx"
    }
}

プログラムを記述

以下の内容を./app.jsに書いていきます。
内容はソース内のコメントを読んで理解してください。

const Discord = require('discord.js');
const conf = require('./config.json');
const client = new Discord.Client();

// ログを出力する関数
const putLog = async msg => {
    console.log('[ LOG ] [ ' + new Date().toLocaleString('ja') + ' ] : ' + msg);
    return
};

// チャンネルへメッセージを送信する関数を返す
const createSendMsg = channel => {
    return async msg => {
        try {
            await channel.send(msg);
            return
        } catch(err) {
            return Promise.reject('ERROR in sending message')
        }
    }
};

// メッセージにリアクションを追加する関数を返す
const createAddReact = msg => {
    // 引数は配列もしくは文字列
    return async emoji => {
        try {
            if (Array.isArray(emoji)) {
                // emojiが配列だった場合
                emoji.forEach(async i => await msg.react(i));
            } else {
                // emojiが配列でなかった場合
                (
                    async i => await msg.react(i)
                )(emoji);
            };
            return
        } catch(err) {
            return Promise.reject('ERROR in adding reaction')
        }
    }
};

// Discordに接続したらログを出力
client.on('ready', () => putLog('Connected to discord.'));

// 新規メッセージ受信時
client.on('message', async msg => {

    // 送信元が(自分を含め)botだったら処理を中断(プログラムは実行され続ける)
    if (msg.author.bot) return

    // 先の関数にチャンネルを渡すことで、
    // そのチャンネルへメッセージを送信する関数を作成する。
    const sendMsg = createSendMsg(msg.channel);

    // 同じく、メッセージへリアクションをつける関数を作成する。
    const addReact = createAddReact(msg);

    // メッセージの内容を解析
    switch (true) {

        // 先頭が'BotHelp'である場合(大文字・小文字は区別しない)
        case /^BotHelp/i.test(msg.content) :

            // botのみが送信できる特別なメッセージ[ embed ]を送信する。
            await sendMsg({embed: {
                color: 0x114514,
                title: 'ほげほげbot',
                url: 'https://example.com',
                description: '使い方の簡単な説明',
                fields: [
                    {
                        name: '挨拶',
                        value: '`おはよう`もしくは`こんにちは`もしくは`こんばんは`'
                    },
                    {
                        name: '現在時刻',
                        value: '`卍時刻`'
                    }
                ]
            }});
            break

        // メッセージの先頭が'卍時刻'だった場合
        case /^卍時刻/i.test(msg.content) :
            await sendMsg('只今の時刻は ' + new Date().toLocaleString('ja') + ' です!');
            await addReact('⏰');
            break

        // 先頭に'BotHelp'も'卍時刻'も無かった場合
        default :
            switch (msg.content) {

                // メッセージが'おはよう'だった場合
                case 'おはよう' :
                    await sendMsg('おはよう!!');
                    break
                // 同じく'こんにちは'だった場合
                case 'こんにちは' :
                    await sendMsg('こんにちは〜');
                    break
                // 同じく'こんばんは'だった場合
                case 'こんばんは' :
                    await sendMsg('こんばんは。');
                    break
            };
    };
});

// Discordへ接続
client.login(conf.discord.token);

実行

node ./app.js

エラーが出たら確実に貴方が悪いです。コードを見直しましょう。

サービスとして登録

Linuxであればrunitを使用してサービス化すると良いでしょう。

sudo apt install runit-systemd
sudo mkdir /etc/sv/discord_bot
echo -e '#!/bin/bash\nexec node /path/to/app.js' | sudo tee /etc/sv/hoge/run
sudo chmod +x /etc/sv/hoge/run
sudo ln -s /etc/sv/hoge /etc/service/hoge

また、runitで
プロセス番号と稼働時間を確認するには
sudo sv s /etc/service/hoge
再起動するには
sudo sv t /etc/service/hoge
停止・無効化
sudo sv d /etc/service/hoge
sudo rm /etc/service/hoge

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする