Glitchを使ってNode.js製Discord Botを動かしてみる

# Glitchの紹介
少し前に[「Glitch」というNode.jsのアプリケーションを無料で動かせるサービスについての記事](https://qiita.com/yonedaco/items/569bcc442872a1f9a03d)が話題になりました。DiscordのBot開発でもNode.jsはもちろん使えます。
今回は、`discord.js`というライブラリを用いてGlitch上でBotを動かしてみたいと思います。
なお、当カレンダー3日目に書いて頂いた記事では`eris`というライブラリが扱われています。どちらも手軽に使える代物ですので、ぜひチェックしてみてください。

# 早速やってみる
Glitchは単なるホスティングサービスではなく開発環境も兼ねています。簡単なアプリケーションを試すくらいなら環境やエディタを整備する必要もありません。さらに、「Remix」という機能を使えば誰かが作成したアプリケーションの複製を作ることができます。これらを活用してパパッとBotを作ってみましょう。

## Discord上でBotユーザの作成
Botアプリケーションを作成する前に、DiscordのDeveloperサイトでちょっとした準備が必要です。奇しくも昨日のカレンダーでちょうどいい解説がありますの。詳しい手順はそちらを参照しましょう。
https://qiita.com/sbhr/items/43320a828e62eadbd77a#botの準備
この手順を済ませると、**Bot用のトークン**が取得できているはずです。

## GlitchでBotテンプレートをRemix
今回は、Remix元として簡単なBotアプリケーションを作成しました。内容は大したことなくて「メンションされたらメンションし返す」というだけです。
https://glitch.com/~pumped-chopper

上記URLを訪れると、画像のように**Remix your own**というボタンが見えていると思います。これを押すだけでBotが動く環境、および開発環境が準備できてしまいます。[^1]
![glitch.png](https://qiita-image-store.s3.amazonaws.com/0/126660/3ae76624-1be8-52bf-729d-a02ea203949d.png)

## Glitch開発環境でカスタマイズ
Remix直後の状態です。`Live` となっているのでアプリケーション自体は起動していますが、エラーログが流れていることが分かります。
![glitch2.png](https://qiita-image-store.s3.amazonaws.com/0/126660/d3bdb370-90a2-a5d2-bdec-b6c3e669a4ca.png)
このエラーはBotトークンが未設定になっているため発生しています。トークンは`.env`ファイルに記載するように作っています。[^2] `DISCORD_BOT_TOKEN=`の先に、最初に取得したトークンを記入しましょう。変更は即時に反映されます。
 `bot is ready!` とログが表示されたら、BotはDiscordとの接続に成功しています！

## 使ってみる
DiscordのサーバーにBotを招待してテストしてみましょう。下記形式のURLで、Botを任意のサーバーに招待できます。**{Bot Client ID}**は、Developerサイトで手続きをした際にBotのClient IDというものが生成されていますのでそれに置き換えてください。
`https://discordapp.com/oauth2/authorize?&client_id={Bot Client ID}&scope=bot&permissions=0`

![glitch3.png](https://qiita-image-store.s3.amazonaws.com/0/126660/3476fdc7-592f-fe19-b4ca-5478c7d8102d.png)
適当なサーバーを用意してBotを招待してみました。メンションだけに反応して返信しています。成功ですね。

# まとめ
Node.jsのアプリケーションをGlitchで動かすのは簡単でした！軽いメンテナンスなら、ブラウザだけで完了できるのも手軽でいいですね。
ただ、アプリケーション自体に割り当てられたURLにアクセスが無い場合は5分くらいでスリープ状態に入ってしまうのでこのままではBotとして運用できません。他のサービスを使って定期的にアクセスしてやれば動かし続けることができますが・・・Glitchのサイト上でそういった際のプラクティスが記載されていないので、今のところは各ユーザの工夫に任せる方向になるのかちょっとわかりませんでした。

# おまけ（Bot実装の解説）
Qiitaなのにソースコードを全く書いていませんので、おまけ程度に記載します。

```javascript:main.js
// Discord bot implements
const discord = require('discord.js');
const client = new discord.Client();

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

client.on('message', message =>
{
	if(message.isMemberMentioned(client.user))
	{
		message.reply( '呼びましたか？' );
		return;
	}
});

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 );
```

#### コード解説
`.env`で設定された`DISCORD_BOT_TOKEN`を参照してDiscordにログインするのは最後の行です。
`client.on`でDiscordの各種イベントを受けることができます。`on('ready')`は割愛します。 
`on('message')` は参加してるサーバーで何らかのテキストが書かれた時のイベントです。
`if(message.isMemberMentioned(client.user))`で、自分へのメンションが含まれるか？というチェックができます。これには`@here`なども含まれます。
後は `message.reply()`でメッセージの発信者へのメンションを付けたテキストを返してやります。簡単ですね。

#### discord.js
`discord.js`は手軽にスタートできるライブラリですが、音声チャンネルへの作用なども可能で高機能です。[ドキュメント](https://discord.js.org/#/docs/main/stable/general/welcome)も充実しているので、本格的に作ってみたいかたは是非チェックしてみてください。

#### Glitchは簡単
当然ですが、ローカルで動かす場合はNode.js, npmのインストール、`npm install` などの手順が必要です。Glitchでは`package.json`さえ書いておけばすべて自動で処理してくれるのでとても楽ちんですね。バージョン管理が無いのでGlitchだけで本格的なBotを開発するのはあまりお勧めしませんが・・


[^1]: Glitchは会員登録をしなくても殆どの機能を使用できます。ただし、ゲスト状態で作成したアプリケーションは5日間で削除されるようです。
[^2]: 実はテンプレートでは既にトークンを設定しています。`.env`の中身は開発者以外見えないようになっており、Remixした場合でも設定値がクリアされた状態で複製されます。APIキーなどセキュアな情報を記載しても、ある程度は安心ですね。