Skip to content

jiro4989/nimbot

Repository files navigation

nimbot

Slackのチャットメッセージを読み取ってNimのコードをコンパイルして実行し、その結果 をSlackに返却するBotです。

image-demo-top

Slackの nimbot チャンネルで、チャット欄に以下のテキストを入力して送信します 。

/nimbot c

```
echo NimVersion
```

これは [Nim] のコンパイラのバージョンを出力する Nim のコードです。 Slackのコードブロック記法内に、任意の Nim のコードを記載できます。

また、以下のようにチャットを送信することで、Nim公式リポジトリの devel ブランチ最 新のコンパイラでコードを実行することが可能です。

/nimbot c devel

```
echo NimVersion
```

以下のツールが必要です。

  • docker
  • docker-compose

このBotはNimで書かれているので、Nimのコンパイラもあったほうが良いです。 しかしながら、Botをビルドして動作させるだけなら上記の2つだけで動作します。

本番検証用には以下のツールが必要です。

ローカル環境のシステム構成は以下。

image-system

Slackの [Slash-Commands] を使用してNimのコードを送信します。

送信すると、サーバ側の nimbot_server の POST /play エンドポイントにデータ がPOSTされます。POSTされたデータをパースし、MongoDBの code コレクションにド キュメントが保存されます。保存後、一旦Slackのユーザに OK というレスポンスが 返却されます。

レスポンス返却後、APIサーバとは別で起動する nimbot_executor がMongoDBの code を定期的に確認します。 code にドキュメントが存在するとき、 nimbot_executor はドキュメント内の code 要素を取得し、Dockerコンテナを起 動して、コンテナ内でNimのコードをコンパイルして実行します。実行結果の標準出力と 標準エラー出力を取得し、Slackの [Incoming-Webhook] にデータをPOSTします。

以下はそのシーケンス図です。

image-data-flow

config.nims というファイルに頻出のタスクを定義しています。 Nimコンパイラがインストールされていれば、以下のコマンドでタスクを確認できます。

nim --hints:off

以下のコマンドを実行すると開発環境を起動します。

docker-compose up

# あるいは

nim --hints:off upDev
nim --hints:off upAll

起動したら以下のコマンドを実行すると、Botが正常に動作していることが確認できます 。

curl -X POST -d 'user_id=test_user&text=ccccc' http://localhost:4001/play

Nimコンパイラをインストールしているなら、以下のコマンドで正常なデータを送信でき ます。

nim --hints:off tests

masterブランチが更新されるとCIが起動します。 CIで本番用のDockerイメージをビルドして、DockerHubにPushします。 本番環境では docker pull してイメージを更新します。

Welcome!

MIT

[Nim]効率的で、表現力豊かで、エレガントなプログラミング言語。このBotもこれで書かれている (Link)
[Slash-Commands]/ で始まるコマンドでBotと対話的にやり取りをするためのSlackインテグレーション (Link)
[Incoming-Webhook]任意のSlackチャンネルにデータを送信するためのWebhook (Link)