# slack words finder (JP)
###### tags: `Slack` `Bot` `JP`
## 概要
+ Slack 上の発言及びメッセージを設定した正規表現で検証し合致したものを特定のチャンネルへ自動的に収集することが可能です。
+ デフォルトの発動条件の絵文字は :comet: です。
## アーキテクチャ・設計
+ Nedb を採用します。
+ MVC モデルを採用します。 `cluster manager` を参考にして下さい。
+ `cluster manager` 相応の開発クオリティ診断をクリアします。
## 機能
### ADD CMD ( 正規表現をセットします。)
+ 当コマンドの使い方
1. 先頭に絵文字`:comet:` を記述します。 `:comet:`
2. 続いて `add`を記述します。 `:comet: add`
3. 続いて追加したい正規表現を記述します。 `:comet: add /sample/i`
4. スレッドでは使用できません。
### REMOVE CMD ( 登録している正規表現を消します。 )
+ 当コマンドの使い方
1. 先頭文字に `:comet:` を追加します。`:comet:`
2. 続いて `remove` を記載します。 `:comet: remove`
3. 続いて消去したい正規表現の番号を記述します。`:comet: 0`
### LIST CMD ( どの正規表現でどのチャンネルにメッセージが収集されているかを一覧表示します。 )
+ 当コマンドの使い方
1. 先頭文字に `:comet:` を追加します。 `:comet:`
2. 続いて `list` を記載します。 `:comet: list`
当ボットのbotアカウントをワード収集を使いたいチャンネルに招待します。
### ADD CMD 【実装編】
+ 前提条件
+ 当コマンドはトラッキング対象の追加及び正規表現を設定するものになります。
+ 当コマンドはすべてのユーザが使用する事ができます。
+ テキストを受信した場合に発火します。
+ 発火条件の正規表現は `/^:comet:( |)add( |)\/(.+)\/(i|)$/i`
+ シーケンス
1. `イベントパラメータテキスト文章`から正規表現を取得します。
2. チャンネル名を取得します。
3. 第1シーケンスで得られた値を`Nedb`の`reg_exp`,`channel_name`に下記で設定した`Add メソッド`を用いて保存します。
### REMOVE CMD 【実装編】
+ 前提条件
+ 当コマンドは正規表現を消去します。
+ すべてのユーザーが使用できます。しかし、スレッドでは使用できません。
+ テキストタイプのメッセージイベントを受信した場合に発火します。
+ 発火条件の正規表現は`/^:comet:( |)remove( |)\/([0-9]+)\/(i|)$/i`
+ シーケンス
1. イベントパラメータテキスト文章から正規表現を取得します。
2. `removeメソッド`を用いて第1シーケンスで得られた値を`NeDB`の`reg_exp`から消去します。
3. もしスレッドで使用された場合は `event Object` の`ts`の所を参照し使用出来ない趣旨のメッセージする。
### LIST CMD 【実装編】
+ 前提条件
+ 当コマンドは登録している正規表現をリスト化します。
+ テキストタイプのメッセージイベントを受信した場合に発火します。
+ 発火条件の正規表現は `/^:comet:( |)list$/i`
+ シーケンス
1.下記で設定した `findMethod` を使用します。
### WHEN RECEIVE NEW MSG 【実装編】
+ シーケンス
1. 受信したイベントテキストのテキストパラメーターを取得します。
2. DB内に存在するすべての正規表現とマッチするテキストであるかを判定する。
3. もしマッチした場合そのテキストマッチしたドキュメントのチャンネルに転送します(環境変数に設定するhttps://slackWorkspaceURL/archives/channelID/event.ts)。
## 運用
+ Glitch サーバへ展開されます。及び `Web サーバ` を展開し、外部からのアクセスを可能にする必要があります。
## DB モデル一覧
### nedb sample doucment
```jsonld=
{
"_id": "",
"reg_exps":["aaaaaa","bbbbbb","cccccc",....],
"channel_id": "C*********"
}
```
+ ChannelsRegExp Model
+ find Method
+ 引数
+ nedb ( nedb Object )
+ chID ( channel_id String )
+ このメソッドの内容
1. 引数である `chID` が設定されなかった場合、返り値としてすべてのドキュメント格納した配列を出力します。
2. 引数 `chID` に基づき、`NeDB` から該当のドキュメントを検索します。
3. 引数である `chID` が存在する場合、返り値として該当のドキュメントを格納した配列を出力します。
+ add Method
+ 引数
+ nedb (Object)
+ regExp (regExp)
+ chID (channel_id String)
+ chName (channel_name String)
+ このメソッドの内容
1. 引数 `chID` に基づき、 `NeDB` から該当のドキュメントを検索します。
2. 第1シーケンスでの検索した際に一致する`chID`が存在しない場合、その`chID`,`chName`ドキュメントを作成する。
4. 第1シーケンスの結果及び該当のドキュメントのパラメータである `reg_exps` 配列を取り出し、引数 `regExp` が`reg_exps` 配列内部に存在する場合、 `{'message': 'This RegExp is already existed', 'regExp': '受け取ったreg_exp', 'channel': chID}` を返り値として出力します。
5. 第1シーケンスの結果及び該当のドキュメントのパラメータである `reg_exps` 配列を取り出し、引数 `regExp` が`reg_exps` 配列内部に存在しない場合、その正規表現を`NeDB`に追加します。
6. 全てのシーケンスが終了したらその発言に`{'message': 'This method is completed', 'regExp': '受け取ったreg_exps', 'channel': chID}`と返り値を出力します。
+ remove Method
+ 引数
+ nedb (Object)
+ regExp Index (Number)
+ chID (channel_id String)
+ このメソッドの内容
1. 引数 `chID` に基づき、 `NeDB` から該当のドキュメントを検索します。
2. 第1シーケンスの結果及び該当のドキュメントのパラメータである `reg_exps` 配列を取り出し、引数 `regExp` が`reg_exps` 配列内部に存在しない場合、 `{ message: "Cannot find this RegExp", regExp: "受け取ったregExp index", channel: "chID" }`を返り値として出力します。
3. 第1シーケンスの結果及び該当のドキュメントのパラメータである `reg_exps` 配列を取り出し、引数 `regExp` が`reg_exps` 配列内部に存在する場合、その正規表現を`NeDB`から削除します。
4. 全てのシーケンスが終了したらその発言に `{ message: "The remove method is completed", regExp: "受け取ったreg_exp", channel: "chID" }` と返り値を出力します。
## 環境変数一覧
+ HOST 文字列
+ PORT 数値
+ EMOJI 文字列
+ SYSTEM_NAME 文字列 ( package.json から読み取る )
+ SLACK_BOT_TOKEN 文字列
+ SLACK_BOT_ID 文字列
## 今後の予定
+ boltに変更
+ list をプルダウン式に表示できるように変更
+ File 送信イベント、 アタッチメント付きのメッセージイベントも発火イベントに追加