DiscordのBOTを作ろう
久しぶりのブログ記事です。
技術系の話はQiitaにいろいろ書いてるのですが、たまにはブログも書こうかなと思います。
DiscordのBOTを作ろう
友人達と趣味で開発しているプロジェクトでは、コミュニケーションツールとしてDiscordを使用しています。
なんで、Discordを使ってるかと言うと、もともとは友人達とは一緒にゲームをする時にDiscordを使ってたので、またいちいちSlackとか導入して、招待するのが面倒だったので、流れでそのまま使っているという感じです。
せっかくDiscordを使っているのなら、BOTの1つでも作ろうじゃないかということで、DiscordでのBOTの作り方を書いていこうと思います。
環境
まずは、BOTのアカウント作成
まずはこちらにアクセス discordapp.com
「Create an application」を選択して、
NAMEは適当に今回は「test_bot」にしています。 NAMEを決めたら、SaveChangeで保存します。
次に、左のメニューからBOTを選択 Add Botを選択するとBOTのユーザーが作成されます。
Discord上で表示される、USERNAMEを設定し、下のTOKENをコピーしてください。 こちらもまた、Save Changesをしてください。
次に、OAuth2を選択、SCOPEからBOTにチェックをつけて copyの部分のURLにアクセスします。
すると、BOTをどのサーバーに招待するかを設定できます。 招待したいサーバーを選択して、認証を押します。
そうすると、選択したサーバーに先ほど設定したUSERNAMEのBOTが入ってくるはずです。
これで、BOTアカウントの設定は完了です。
Discord.jsのインストール
次に、BOTを動かすコードを書いていきます。 今回は、DiscordのBotを簡単に作るNodeJS用のパッケージであるDiscord.jsを使います。
適当にディレクトリを作って、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
を実行すると、
こんな感じで、BOTがオンラインになります。 この状態でDiscordのチャンネルで「ping」と打つと こんな感じで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); });
そうすると、こんな感じでメッセージをそのまま返してくれるようになります。
最後に
今回は、テキストメッセージのBOTを作成しましたが、DiscordBOTの最大の特徴はVoiceチャンネルを使うことができることなので、次回はVoiceチャンネルを使ったBOTの作成をしてみようと思います。