Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8837

Discord.jsのフレームワーク「Ecstar」を作ったよって話

$
0
0

Ecstar

Discord.js のコマンド等を楽に追加するフレームワークです。

何で作ったの?

Discord、LINE、Slack の Bot などメッセージに対して反応する Bot は以下のように if 文がたくさん必要になってきます。

if(message==="aaa"){send("aaa");}if(message==="bbb"){send("bbb");}if(message==="ccc"){send("ccc");...

めんどくさいので Bot の規模が大きくなってくるとできるだけ簡潔にコマンドを増やせるように、自分で何らかの処理を書くと思います。

これでもいいのですが、複数 Bot を作成するときに同じ処理を書き直す事を考えると管理面などから大変です。

なら module 化すればよくね?それ npm に上げればよくねって事でできたのがEcstarです。

もっといい Klasa ってのがあるよって意見は受け付けません。

特徴

  1. ムダなコードが減って楽に Bot が作れる
  2. Discord.js の関数など全部利用できる
  3. TypesScript 対応(そろそろします)

使い方

現在作成中で大きな変更があると思います。
なのでこちらの最新版を確認してください。

詰まったところ

実行フォルダーの取得

実行フォルダー(Ecstar を使うフォルダー)を取得するにはprocess.argv[1]で実行したファイルまで取得できます。
そこから〇〇.jsを消すことで実行フォルダーを取得しました。

GitHub

メッセージコマンドの引数

コマンドの引数の処理にかなりの時間を費やしました。

!help all

のようなメッセージがあるときallを取得してそれに対して処理したいです。それを Ecstar 側で出力する処理をしました。

まだ結構ガバガバで納得してないので上手くできたら別で記事にしたいと思います。

EventEmitter のイベントを一括で取得したい

EventEmitter2でやった方法

通常の EventEmitter では全部を一括で取得できません。
ちょっと調べたところEventEmitter2というものがあり、これは以下のように*で全部取得できます。
emitter.on("*",functionevent(callback){console.log(`イベント名: ${this.event}返り値: ${callback}`);});

ですがEventEmitter2でイベントを受けるときアロー関数だとthis.eventでイベント名を取得できないのでなんかもっといい方法ないかなとか考えてます。

記事公開したあと考えてたらこんな感じで実装できました(別記事)
EventEmitterですべてのイベントを取得する(ワイルドカード)

npm に公開

はじめて作ったのでつまりました。
公式のドキュメントがわかりやすかったのでそれ読みつつ公開しました。

これから

  • TypeScript
  • Discordの権限別に実行できるコマンド
  • 複数のコマンド引数

終わりに

これ仮完成させたのが数ヶ月前なので思い出しつつ書きました。
今はこれを TypeScript を使ってきれいで安全なコードに書き直しています。

何か意見、質問があれば

GitHub,
Twitter,Discord コミュニティーまたはコメントまで


Viewing all articles
Browse latest Browse all 8837

Trending Articles