Herokuやglitch上のnode.jsサーバーで動作させることを前提とした、 TypeScript実装のDiscord Botです。
- ボイスチャンネルが開始された際の通知
- 特殊なコマンドの提供
!memo
コマンド - 発言のメモ- タイトル/本文がセットになった文字列のCRUDを提供
!pomodoro
コマンド - ポモドーロタイマー機能- 特定の音声チャンネルで、マイクのミュートを利用した擬似的なポモドーロタイマーを提供
!wiki
コマンド - wikipediaからの引用- wikipediaから単語の概要を引用して発言・リンクする
!sticker
コマンド - チャットに反応するスタンプ機能- 正規表現と対応する画像URLを登録し、チャットがマッチした際Botに発言させることで、スタンプ機能のように振る舞わせる
それぞれのコマンドの詳細については、実装をご覧いただくか、本Bot起動後、コマンドに引数を付けずに実行することで詳細なヘルプが表示されます。
本プロジェクトは npmのWorkspacesを利用したモノリポ構成となっております。
.
├── Procfile # Herokuの起動スクリプトの情報を書くファイル
├── package.json
├── packages/
│ ├── core/ # 共通で利用するライブラリなど
│ │ ├── src/
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── worker/ # Discordのイベントを常時監視するワーカー
│ │ ├── src/
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── tsconfig.json
├── redis.conf # GlitchでRedisサーバーを立ち上げるときの設定
├── setup-redis.sh # GlitchでRedisサーバーをインストールするスクリプト
├── tsconfig.base.json # モノリポで継承されるベースのtsconfig.json
├── tsconfig.json
└── ... # 省略
- 対象のDiscordサーバーにBOTがログインしている状態にしておくこと
node.js
のいい感じの環境を整えておくこと- Redisサーバーにアクセスできること
- 本リポジトリをクローンし、
npm ci
を実行する - プロジェクトのルートディレクトリにある
.env.sample
をコピーして.env
を作成する .env
ファイルを編集して環境変数を設定するnpm start
を行うと、アプリが起動し指定されたDiscordサーバーでBOTが動作し始まるnpm run dev
を行うと、開発用サーバーが立ち上がり、ファイルの変更検知込のビルドを行う
- DiscordサーバーにBOTがログインしている状態にしておくこと
- Glitchのアカウントを作成し、ログインしておくこと
- https://glitch.com/ のヘッダーにある
New Project
からImport from GitHub
を選択してhttps://github.com/ver-1000000/butler
を入力する - Glitchのエディター画面に飛ばされ、しばらくするとエディター画面が表示され操作が可能になる
- ファイルが編集できるようになるので、
.env
というファイルを編集して環境変数を設定する Tools
>Terminal
からターミナルに入り、プロジェクトを動かすためのコマンドを入力するenable-npm
を実行して、Node 16のnpmを有効化する./setup-redis.sh
を実行してRedisサーバーをインストール(5-10分かかる)する
- 問題がなければ、Glitchのコンテナが再起動し、BOTが動作し始める
無料プランのGlitch Projectは 5分間放置するとCold状態 になります。
なので、外部から定期的にURLを叩いてCOLDにならないようにする必要があります。
Google Apps Scriptの場合、以下のコードを awake.gs
という名前で保存して、
トリガー
メニューから5分おきにwakeGlitch
を実行する分ベースのタイマーを作成します。
const GLITCH_URL = 'https://your-glitch-url.glitch.me';
const wakeGlitch = () => sendGlitch(GLITCH_URL, { type: 'wake' });
const sendGlitch = (uri, json) => {
const contentType = 'application/json; charset=utf-8';
const method = 'post';
const payload = json;
const muteHttpExceptions = true;
const params = { contentType, method, payload, muteHttpExceptions };
UrlFetchApp.fetch(uri, params);
};
コードをクローンしていい感じにHerokuにあげると、あとはpushするたびにビルドが走ってBOTが動作し始めます。
Heroku Redisなどを利用して、REDIS_URLを設定するのも忘れないようにしてください。
DISCORD_TOKEN
: Discord APIを利用するために必要なトークンNOTIFY_TEXT_CHANNEL_ID
: 通知など、BOTが自発的に発言する際のテキストチャンネルIDPOMODORO_VOICE_CHANNEL_ID
: ポモドーロ機能で利用するボイスチャンネルのIDREDIS_URL
: 利用するRedisサーバーのURIDETECT_STICKER_RATE
: チャットがstickerの正規表現にマッチした際の反応率を、0.0-1.0で記述(0は無効化、1.0のときは必ず反応)
WebブラウザからDiscordにアクセスして、お目当てのチャンネルのURL見ればなんとなくわかると思います。
音声チャンネルはURLが表示されないので、開発者ツールとかで該当音声チャンネルのDOMを見るとなんとなくわかると思います。