テトラポット技術ブログ「TetLab」

社会人3年目エンジニアのブログ。趣味での開発や仕事で得た知見などを書いて行こうと思います。

DiscordのBOTを作ろう

久しぶりのブログ記事です。

技術系の話はQiitaにいろいろ書いてるのですが、たまにはブログも書こうかなと思います。

DiscordのBOTを作ろう

友人達と趣味で開発しているプロジェクトでは、コミュニケーションツールとしてDiscordを使用しています。

なんで、Discordを使ってるかと言うと、もともとは友人達とは一緒にゲームをする時にDiscordを使ってたので、またいちいちSlackとか導入して、招待するのが面倒だったので、流れでそのまま使っているという感じです。

せっかくDiscordを使っているのなら、BOTの1つでも作ろうじゃないかということで、DiscordでのBOTの作り方を書いていこうと思います。

環境

まずは、BOTのアカウント作成

まずはこちらにアクセス discordapp.com

「Create an application」を選択して、 f:id:tetrapod117:20180809000139j:plain

NAMEは適当に今回は「test_bot」にしています。 NAMEを決めたら、SaveChangeで保存します。 f:id:tetrapod117:20180809001806j:plain

次に、左のメニューからBOTを選択 Add Botを選択するとBOTのユーザーが作成されます。 f:id:tetrapod117:20180809002954j:plain

Discord上で表示される、USERNAMEを設定し、下のTOKENをコピーしてください。 こちらもまた、Save Changesをしてください。

f:id:tetrapod117:20180809012156j:plain 次に、OAuth2を選択、SCOPEからBOTにチェックをつけて copyの部分のURLにアクセスします。 f:id:tetrapod117:20180809002143j:plain

すると、BOTをどのサーバーに招待するかを設定できます。 招待したいサーバーを選択して、認証を押します。 f:id:tetrapod117:20180809002238j:plain

そうすると、選択したサーバーに先ほど設定したUSERNAMEのBOTが入ってくるはずです。 f:id:tetrapod117:20180809003341j:plain

これで、BOTアカウントの設定は完了です。

Discord.jsのインストール

次に、BOTを動かすコードを書いていきます。 今回は、DiscordのBotを簡単に作るNodeJS用のパッケージであるDiscord.jsを使います。

discord.js.org

適当にディレクトリを作って、npmでインストールします

$mkdir test_bot
$cd test_bot
$npm install discord.js

インストールしたら、いくつかWARNが出ますが、あんまり気にしなくて大丈夫です。 インストールが終わったら、適当にindex.jsみたいなファイルを作って、コードを書きます。

exampleを動かす

$touch index.js
const Discord = require('discord.js');
const client = new Discord.Client();

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

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('Pong!');
  }
});

client.login('{YOUR_TOKEN}');

こちらは、Discord.jsのサイトに載っている、exampleです。 client.login('{YOUR_TOKEN}');こちらの{YOUR_TOKEN}の部分は、自分で取得したBOTのTOKENを入れてください。

この状態で、

$node index.js

を実行すると、

f:id:tetrapod117:20180809005822j:plain

こんな感じで、BOTがオンラインになります。 この状態でDiscordのチャンネルで「ping」と打つと f:id:tetrapod117:20180809010225j:plain こんな感じでBOTが「pong」と返してくれます。

おうむ返しをしてみよう

index.jsを少し変更して、送られた言葉をそのまま返信するおうむ返しのBOTにしようと思います。

client.on('message', msg => {
  if (msg.content === 'ping') {
    msg.reply('Pong!');
  }
});

メッセージが送られた場合、この部分のイベントが呼ばれます。 先ほどのping-pongしている処理から考えると、if文でメッセージの中身がpingだった場合に、pongを返しているということがわかります。 つまり、送られて来たメッセージの中身をみたい場合は、msg.contentを使えば良さそうですね。

ということで、おうむ返しするにはこんな感じになります。

client.on('message', msg => {
    msg.reply(msg.content);
});

しかし、これだけだと、BOTが自分の送信したメッセージにも反応してしまい、ひたすらBOTがメッセージを送りつづけてしまうため、メッセージの送信者が自分自身だった場合に終了するコードを追加します。

client.on('message', msg => {
    if (msg.author.id === client.user.id) {
        return;
      }
    msg.reply(msg.content);
});

そうすると、こんな感じでメッセージをそのまま返してくれるようになります。

f:id:tetrapod117:20180809011652j:plain

最後に

今回は、テキストメッセージのBOTを作成しましたが、DiscordBOTの最大の特徴はVoiceチャンネルを使うことができることなので、次回はVoiceチャンネルを使ったBOTの作成をしてみようと思います。