[Node.js] [Discord] Discord の Bot を作る。 その3

遅くなりましたがBotを作るの最終編です。

全体の流れ

  1. Botの用意をする。
  2. 開発環境を用意する。
  3. テストコードを作成する。
  4. ボイスチャンネルの入退出に反応するようにする。 <- いまここ

Eris の仕組み

今更ながらErisの仕組みについて簡単に説明します。

ErisはBOTとしてDiscordにログインした後にサーバーから色々な情報を受信します。

その情報をイベントという形で受け取り処理を行うようにします。

以前に行った、メッセージを受け取ってPing!Pong!するのもその仕組みを利用しています。

ボイスチェンネルの入退出に反応する。

Erisには様々なイベントが用意されていますが今回はその中で下にある3つのイベントを使用します。

他のイベントについては詳しくは以下のドキュメントを参照してください。

Eris Document Client Class
※下のほうに Event の項目があります。

使用するイベントの種類

イベント名 タイミング コールバックの引数
voiceChannelJoin ボイスチャンネルに誰かが入った時。 (member, newChannel)
voiceChannelSwitch 別のボイスチャンネルに誰かが移動した時。 (member, oldChannel, newChannel)
voiceChannelLeave ボイスチャンネルから誰かが退出した時。 (member, oldChannel)
引数の説明
引数名 説明
member Member 入室または退室を行ったメンバー
newChannel GuildChannel そのメンバーの入室先のボイスチャンネル
oldChannel GuildChannel そのメンバーの以前まで居たボイスチャンネル

型は Eris 上での型です。詳細は Erisのドキュメントを参照してください。

とりあえずはボイスチャンネルに入退出したらコンソール上に出力ようにします。

ソースコードはこちら。

const Eris = require("eris");

// BOT_TOKEN は 自身が作成したBotの Bot token の文字を記述します。
var bot = new Eris("BOT_TOKEN");

bot.on("ready", () => {
    // bot が準備できたら呼び出されるイベントです。
    console.log("Ready!");
});

bot.on("voiceChannelJoin", (member, newChannel) => {
    // 誰かがボイスチャンネルに入った時に行う処理
    console.log("%s が チャンネル %s に入室しました。", member.username, newChannel.name);
});

bot.on("voiceChannelLeave", (member, oldChannel) => {
    // 誰かがボイスチャンネルから離れた時に行う処理です。
    console.log("%s が チャンネル %s から退室しました。", member.username, oldChannel.name);
});

bot.on("voiceChannelSwitch", (member, newChannel, oldChannel) => {
    // 誰かがボイスチャンネルを移動した時に行う処理です。
    console.log("%s が チャンネル %s から %s に移動しました。", member.username, oldChannel.name, newChannel.name);
});

// Discord に接続します。
bot.connect();

スポンサーリンクです。

 

ソースコードの補足していきます。

var bot = new Client("BOT_TOKEN")

ここでClientオブジェクトを作成しています。BOT_TOKENは前回使用したものと同じものを使用してください。

bot.on('voiceChannelJoin', (member, newChannel) => { ... } );

bot.on()でイベントを登録します。ここでは voiceChannelJoin というイベントを登録してます。 第二引数にイベントが呼び出された時の処理を関数として書きます。

member.username はユーザー名を、 newChannel.name はチャンネル名を取得します。

このソースコードを以下の環境で実行するとこんな感じになります。

いつものテストサーバーです。

結果

コンソールのほうに出力されましたね!

あとはこれを実際のボイスチャンネルに流すだなのですが、 とりあえずデフォルトチャンネルに流すようにします。

先程のソースコードの console.log() の部分を以下のように変更してみてください。 少々荒っぽい方法です。

bot.on("voiceChannelJoin", (member, newChannel) => {
    // 誰かがボイスチャンネルに入った時に行う処理
    let ch = newChannel.guild.defaultChannel;
    ch.createMessage(member.username + "が チャンネル[" + newChannel.name + "] に入室しました。");
});

bot.on("voiceChannelLeave", (member, oldChannel) => {
    // 誰かがボイスチャンネルから離れた時に行う処理です。
    let ch = oldChannel.guild.defaultChannel;
    ch.createMessage(member.username + "が チャンネル[" + oldChannel.name + "] から退出しました。");
});

bot.on("voiceChannelSwitch", (member, newChannel, oldChannel) => {
    // 誰かがボイスチャンネルを移動した時に行う処理です。
    let ch = oldChannel.guild.defaultChannel;
    ch.createMessage(member.username + "が チャンネル[" + oldChannel.name + "] から [" + newChannel.name + "] に移動しました。");
});

さっくり解説をすると以下の通りです。

// oldChannel が所属している guild の デフォルトチャンネルを取得する。
let ch = oldChannel.guild.defaultChannel;

// チャンネルに 'hoge' を送信する。
ch.createMessage('hoge');

guildというのはDiscordのサーバー1つ1つの事だと思ってください。

これを実行してボイスチャンネルに出入りするとデフォルトチャンネルに以下のように表示なります。

わーい!

特定のチャンネルに出力したりということを行うには少し工夫が必要になりますので、 それはまたの機会に気力があれば紹介出来たらなと思います。