blog

About me Archives Tags

Node.js で Discord bot をつくった

Apr 15, 2020, 21:05 #Tech

概要

Node.js のモジュール Discord.js をつかって、オンライン・コワーキングスペース用のチャットボットをつくりました。

はじめてアプリをつくりました。

プログラムの設計をかんがえるのはむずかしいですね。

Repository

背景

イカトドンというスプラトゥーン好きの集まる SNS(マストドン)があります。スプラトゥーンというタイトルの人気が下火になったいまでも、けっこうたくさんのアクティブユーザがいます。

イカトドンには専用の Discord サーバがあって、毎日いろんなひとがスプラトゥーンや、最近はどうぶつの森でわいわいやってます。

そのサーバの片隅にオンライン・コワーキングスペースがありまして、もくもく会をやったりしています。

コロナウイルスの影響で参加するひとがふえてはいますが、それほど多くはなく時間によっては孤独な作業場になってしまうこともしばしばです。

そこで、テキストチャットで「作業おわった」とか「つらい」とか言うと「えらい」とか「がんばれ」とか言ってくれるボットがほしいね、という話になりました。

仕様

実装

どうやら Discord ボットはいろいろな方法でつくれるらしいということがわかりました。言語でいうと JavaScript、Python、C#、Go、Java、Ruby とかです。

ちょうど無料期間なので学習を進めていた N 予備校の入門 Web アプリコースで Node.js をさわっていたので、じゃあ Discord.js をつかってやってみようということになりました(N 予備校は DWANGO が運営する教育サービスで、大学受験対策やプログラミング系のコースなどがあります。教材の内容がとてもよいうえに月額 1,000 円と安くほんとうにすばらしいサービスなのですが、今回はその話はやめておきます)。

24 時間稼働のためのサーバは、無料でけっこうつかえるという理由で Heroku をえらびました。

とりあえず Discord.js の公式ドキュメントや Qiita なんかをよみながらやってみると、わりとすぐ動くようになりました。

試作したパスファインダーくんです。あらかじめ決めておいた正規表現にマッチすると反応してくれます。

pathfinder-bot

おなじ要領で正規表現のパターンを増やしていけばバイト店員タコガールちゃん完成、とおもいきや問題がひとつ。

サーバとしてえらんだ Heroku は不定期に再起動する仕様だったのです。再起動がおこるとどうなるかというと、プログラムが記憶していたもくもくチャンネルの ID を忘れてしまい、また記憶させなければいけなくなります。とても面倒です。

解決するにはデータベースが必要ということで、じゃあ Google Spread Sheet をつかおう! ということになったのですが、うまく動かず 2 日間を消費してしまったので挫折。テキストファイルに ID を記録しておいて起動時に読み込む、というシンプルな構成に変更しました。

ということで一応の完成をむかえたタコガールちゃんをイカトドンのサーバに招待しました。

temporary-clerk-tako-girl-chang-bot

展望

追加していきたい機能は

などです。となると、やはりログをとる必要があるので

というのが目下の再優先事項です。ゆくゆくは

というのもやってみたい気持ちはありますが、タコガールちゃんのようにキャラクターのパーソナリティをもたせるのはかなーり大変なはずなので、まあできればいいなを頭の片隅においておくぐらいにとどめておきます。

感想

まずボットを導入してみてですが、やはりチャットにだれか反応してくれると「やるか〜」という気持ちになります。孤独な作業はつらいものがあるので。あと、ボット相手だといま話しかけて迷惑にならないだろうか? とかそういうことを考える必要がないので、人間相手よりも気軽さはあるかもしれません。

作ってみてですが、やればわりとできるけど、英語がよめないとつらいな、とおもいました(グーグル翻訳もあてにならんときはならん)。

便利なツールはたくさんあるのですが、Node.js も Discord.js も Google Sheets API も公式な情報はぜんぶ英語です。Qiita などに解説記事があったりもしますが、知りたいことにたどりつくまでに時間がかかったり、たどりついても結局は公式な情報を端折った解説なので、わからなければ最後には公式な情報を頼りにすることになります。じゃあ時間のムダだから最初から公式な情報をみろよという話になり…。

ドキュメントの英語なんてニュースの英語に比べたら大したことはないし、そもそも前提知識がある状態で読むことが多いはずなので(今回は JavaScript わからんけど雰囲気で書けばなんとかなるだろレベルの前提知識でいろいろ読んだのでつらかったわけですが…)慣れればなんとかなるはず…。花粉症治療の舌下免疫療法みたいなかんじで強制的に英語アレルギーを治療していきたいです。

あとは変数とかメソッドの命名はこれでいいんだろうか? とか、モジュールの分割はもっと細かいほうがいい気がするけど細かくなりすぎるとかえってわかりにくいのでは? とかいう悩みをけっこう体験しました。書捨てのコードばかり書いてきたので新鮮な体験でした。たぶんこのへんは永遠の課題なんでしょうけど。リーダブルコード買って読むか。

謝辞

イカトドンは今日で 3 周年を迎えたようです。おめでとうございます。

イカトドンの特徴としてエンジニア率が高いというのがあり、Discord サーバにはチャンネルを自動生成・削除、チャットの読み上げ、Nintendo Switch のフレンドコード登録などができる超多機能なボットがいたりします。

タコガールちゃんはイカトドンのそういった風土に触発されて作ったものです。

イカトドンのみなさん、運営のみなさん、アドバイスをくださったみなさん、もくもく会のみなさんにお礼を申し上げます。これからもよろしくおねがいします。