---
# System prepended metadata

title: slack_cluster_manager2.0
tags: [JP, API, Bot, Slack]

---

# slack_cluster_manager2.0
###### tags: `Slack` `Bot` `JP` `API`

> このボットはスラックのクラスタを管理するためのボットです。
クラスタとはスラックのメンバーの集まりまたはリストのようなものです。
このボットはそのクラスタをスラックのチャンネルあるいはグループへ招待したり、退室させたりする機能を提供します。

## :fries: mention コマンドについて
+ 当コマンドの使い方
  1. 先頭に絵文字 `:fries:` を記述します。 `:fries:`
  2. 続いて `mention` と記述します。 `:fries: mension`
  3. 続いて `クラスタ名` を記述します。 `:fries: mension b-7`
  4. 続いて `メッセージ` を記述します。 `:fries: mension b-7 今日はモリンガではなくパーティーテントがあります`
    + *任意
  5. Enter
    + Bot が b-7 クラスタに登録されている全てのメンバへ DM を送信します。 DM の内容は第5シーケンスにて送信されたユーザの投稿の URL と第4シーケンスで入力されたメッセージが含まれます。
+ 当コマンドの機能
  + コマンドを入力したチャンネルに存在する、コマンドで指定されたクラスタの全てのメンバーに通知を届けます。

##  :fries: invite コマンドについて
+ 当コマンドの使い方
  1. 先頭に絵文字 `:fries:` を記述します。 `:fries:`
  2. 続いて `invite` と記述します。 `:fries: invite`
  3. 続いて `クラスタ名` を記述します。 `:fries: invite b-7`
  4. Enter
    + Bot が b-7 クラスタに登録されている全てのメンバを、当コマンドを入力したチャンネル或いはグループへ自動的に招待します。
+ 当コマンドの機能
  + 記述したチャンネルに選択したクラスタに属する人物を招待する。

## :fries: kick について
+ 当コマンドの使い方
  1. 先頭に絵文字 `:fries:` を記述します。 `:fries:`
  2. 続いて `kick` と記述します。 `:fries: kick`
  3. 続いて `クラスタ名` を記述します。 `:fries: kick b-7`
  4. Enter
+ 当コマンドの機能
  + コマンドを入力したチャンネルに存在する、コマンドで指定されたクラスタの全てのメンバをそのチャンネルから退出させます。
## API について
+ 当コマンドの使い方
  1. `http://kit-cluster.gritch.me/{cluster_name}` を受け取ります。 ( Ex: "b6", "c4k" ... )
  2. objectを返します。
+ 当コマンドの機能
+ sample object
 ```json
   {
    "cluster_name: "B7",
    "members":[ 
    {
    "email": "example@kit.edu.kh", 
    "slack_id": "U---"
    },{},...
    ]
  }
```

## :fries: mention コマンドについて 【実装編】
### 前提条件
+ Slack RTM Client により slack event を受信します。
+ Slack Web Client により slack event を返信します。
+ 当コマンドはチャンネル・グループ・スレッドにて利用可能です。
+ テキストタイプのメッセージイベントを受信した場合に発火します。
+ 発火条件のメッセージテキストの正規表現は `/^:fries:( |)mention( |)(([a-z]||-|_|[0-9])+)( |)(.+)$/i`
### シーケンス
1. イベントのテキストパラメータの文章から `cluster name` 及び文字列を取得します。
2. 第1シーケンスで得られた値を Nedb の `cluster model` の find メソッドへ渡します。
3. Bot が b-7 クラスタに登録されている全てのメンバへ DM を送信します。 DM の内容は第5シーケンスにて送信されたユーザの投稿の URL と第4シーケンスで入力されたメッセージが含まれます。( https://api.slack.com/methods/im.open https://api.slack.com/methods/chat.postMessage )
4. 第2シーケンスにて該当のクラスタが存在しない場合はその旨をイベントのユーザへスレッドを用いて送信します。

## :fries: invite コマンドについて 【実装編】
### 前提条件
+ Slack RTM Client により slack event を受信します。
+ Slack Web Client により slack event を返信します。
+ 当コマンドはチャンネル・グループ・スレッドにて利用可能です。
+ テキストタイプのメッセージイベントを受信した場合に発火します。
+ 発火条件のメッセージテキストの正規表現は `/^:fries:( |)invite( |)(([a-z]||-|_|[0-9])+)$/i`
### シーケンス
1. イベントのテキストパラメータの文章から `cluster name` 及び文字列を取得します。
2. イベントのチャンネルパラメータから `channel id` を取得します。
3. Nedb の `cluster model` の find メソッド へ `cluster name` を渡します。
4. 第3シーケンスにて該当のクラスタが存在しない場合はその旨をイベントのユーザへスレッドを用いて返信します。及び当コマンドを終了します。
5. `channel id` の チャンネルのメンバ一覧を取得します。 ( https://api.slack.com/methods/conversations.members )
6. 第5シーケンスで得られた結果に環境変数 SLACK_USER_ID と合致するものが存在するか否か確認します。
7. 第6シーケンスの確認結果が「存在しない」の場合、 SLACK_USER_ID のメンバーを参加させます。( https://api.slack.com/methods/conversations.join )
8. 該当クラスタの環境変数 SLACK_USER_ID のメンバを除く全てのメンバを招待します。 ( https://api.slack.com/methods/conversations.invite )
9. 第6シーケンスの確認結果が「存在しない」の場合、環境変数 SLACK_USER_ID のメンバを退出させます。 ( https://api.slack.com/methods/conversations.leave )
10. 当コマンドの全てのシーケンスが正常に終了した旨をイベントのユーザへスレッドで返信します。

## :fries: kick コマンドについて 【実装編】
### 前提条件
+ Slack RTM Client により slack event を受信します。
+ Slack Web Client により slack event を返信します。
+ 当コマンドはチャンネル・グループ・スレッドにて利用可能です。
+ テキストタイプのメッセージイベントを受信した場合に発火します。
+ 発火条件のメッセージテキストの正規表現は `/^:fries:( |)kick( |)(([a-z]||-|_|[0-9])+)$/i`
### シーケンス
1. イベントのテキストパラメータの文章から `cluster name` 及び文字列を取得します。
2. イベントのチャンネルパラメータから `channel id` を取得します。
3. Nedb の `cluster model` の find メソッド へ `cluster name` を渡します。
4. 第3シーケンスにて該当のクラスタが存在しない場合はその旨をイベントのユーザへスレッドを用いて返信します。及び当コマンドを終了します。
5. `channel id` の チャンネルのメンバ一覧を取得します。 ( https://api.slack.com/methods/conversations.members )
6. 第5シーケンスで得られた結果に環境変数 SLACK_USER_ID と合致するものが存在するか否か確認します。
7. 第6シーケンスの確認結果が「存在しない」の場合、 SLACK_USER_ID のメンバーを参加させます。( https://api.slack.com/methods/conversations.join )
8. 該当クラスタの環境変数 SLACK_USER_ID のメンバを除く全てのメンバを退出させます。 ( https://api.slack.com/methods/conversations.kick )
9. 第6シーケンスの確認結果が「存在しない」の場合、或いは該当クラスタに環境変数 SLACK_USER_ID が存在する場合は環境変数 SLACK_USER_ID のメンバを退出させます。 ( https://api.slack.com/methods/conversations.leave )
  10. 当コマンドの全てのシーケンスが正常に終了した旨をイベントのユーザへスレッドで返信します。

## データベース ( Nedb ) について
### sample

```json
{
}
```
### model list
+ cluster
  + cluster update method ( `cluster name` を `String` として受け取ります。, `members` の `id` 一覧を `String[]` の引数として受け取ります。 )
    1. `cluster name` に基づき該当するレコードを検索します。
    2. `members` の `id` 一覧の配列の `length` が 0件の場合、該当レコードを削除します。及びに当メソッドを終了します。返り値として `{'message': 'deleted', cluster_name: '__受け取った_cluster_name__'}` を返します。
    3. 検索結果が 0 件の場合はレコードを新規作成します。及び当メソッドを終了します。返り値として `{'message': 'created', cluster_name: '__受け取った_cluster_name__'}` を返します。
    4. 該当レコードの `members` を引数として受け取った `members` の `id` 一覧の `String[]` へ更新します。及び当メソッドを終了します。返り値として `{'message': 'updated', cluster_name: '__受け取った_cluster_name__'}` を返します。
  + cluster find method ( `cluster name` を `String` として受け取ります。)
    1. `cluster name` に基づき該当するレコードを検索します。
    2. `cluster name` を設定しなかった場合、全ての cluster を返り値として表示します。

### 環境変数一覧
BOT の名前は package.json から取得する。
+ HOST 文字列
+ EMOJI 文字列
+ PORT 数値
+ SYSTEM_NAME 文字列
+ SLACK_BOT_TOKEN 文字列
+ SLACK_USER_TOKEN 文字列
+ SLACK_USER_ID 文字列