ゲレの工房

ゲーム好きの中の人が、自分が作りたいアプリを作る記録です

Discord.js+Glitch+Uptime Robotで作る、無料で簡単なボイスチャット入室・退室管理bot

世の中にはErisを使った方法が多くWeb上で見つかりますが、GlitchでErisを動かす方法が分からなかったので、discord.jsだけで動かすbotを書いてみました。

Discord.js / Glitch / Uptime RobotでのBotの作り方について

このサイトを参考にしました。
note.com

説明が重複するので、ここでは詳しい説明の多くを省きますが、基本的に私が独自にやったことは、Glitch上でのソースコードの編集だけです。

Glitchに書き込むソースコード

以下のソースコードになります
glitch.com

// Response for Uptime Robot
const http = require('http');
http.createServer(function(request, response)
{
	response.writeHead(200, {'Content-Type': 'text/plain'});
	response.end('Discord bot is active now \n');
}).listen(3000);

// Discord bot implements

const discord = require('discord.js');
const client = new discord.Client();

client.on('ready', message =>
{
	console.log('bot is ready!');
});

client.on('voiceStateUpdate', (oldMember, newMember) => {
  let newUserChannel = newMember.voiceChannel
  let oldUserChannel = oldMember.voiceChannel


  if(oldUserChannel === undefined && newUserChannel !== undefined) {
    let channelID;
    let channels = newMember.guild.channels;
    channelLoop:
    for (let c of channels) {
      let channelType = c[1].type;
      if (channelType === "text") {
        channelID = c[0];
        break channelLoop;
      }
    }
    client.channels.get(channelID).send(newMember.user.username + " がチャンネル 「" + newUserChannel.name + "」 に入室したよ。");
  } else if(newUserChannel === undefined){
    let channelID;
    let channels = oldMember.guild.channels;
    channelLoop:
    for (let c of channels) {
      let channelType = c[1].type;
      if (channelType === "text") {
        channelID = c[0];
        break channelLoop;
      }
    }
    client.channels.get(channelID).send(newMember.user.username + " がチャンネル 「" + oldUserChannel.name + "」 から退室したよ。");
  }
})

if(process.env.DISCORD_BOT_TOKEN == undefined)
{
	console.log('please set ENV: DISCORD_BOT_TOKEN');
	process.exit(0);
}

client.login( process.env.DISCORD_BOT_TOKEN );

簡単な解説

どこのテキストチャンネルに書き込むか

channelLoop のあたりでは、テキストチャンネルを探しています。
最初に見つかったテキストチャンネルに今回はメッセージを送るようにしています。
oldMemberやnewMemberが持つチャンネル情報から探します。

もし管理者が特定のチャンネルに書き込むようにしたい場合は、ここを修正する必要があります。

メッセージの内容

oldMemberやnewMemberから情報をとってきています。
簡単に言うと、newMemberのチャンネルが登録されていたら入室。チャンネルが登録されてなかったら退室としています。
この辺りは、コミュニティによって工夫が必要でしょう。

動作

このように動作します。
Discord.js+Glitch+Uptime Robotで作る、無料で簡単なボイスチャット入室・退室管理bot

お疲れ様でした。

追記

この方法だと、1つのサーバーに1つのbotを用意する必要がありますね。何か工夫しないと。
また何か考えます。


広告