１日の振り返りを簡単に楽しくできるSlack botを作ってみた（furikaeru）

## :frog: 解決したい課題
僕のチームでは有志のメンバーが、毎晩仕事が終わるときに、Slackのチームチャンネルで一日の振り返りを投稿しています。

目的は２つ。
自分の頭の整理と、チームメンバーへの共有です。

しかし、毎回フォーマットをコピペしに探しに行ったり、今日自分がやったことを思い出す作業にはまぁまぁの負荷があります。一日真剣に働いて、ウィルパワーが消耗し切っているのに、これはキツイです。それで、なかなか毎日続かない。一度サボると、やらなくなってしまう。そんな循環を繰り返しています。

それを少しでも楽にできるようにしようということで、botアプリを作りました。

アプリの名前は`furikaeru`にしました。:frog:

`今は一般公開はしていませんが、一応それも見据えてコード書いたので、ゆくゆくできたらと考えていたり、考えていなかったり。`会社のインフラ使わせてもらっているので、インフラ代が気になるところ。:money_with_wings:

## :frog: 仕様
### 実装済みのもの
#### 1. アプリをチャンネルに招待する

アプリのいないチャンネルに`@furikaeru`と投稿すればOK。

#### 2. フォーマットを投げてくれる

振り返りフォーマットをコピペするために、Slackチャンネルの昨日の投稿までスクロールして探したり（僕はこのスタイル）、他のNotionなどのメモアプリに行ったり（このスタイルのメンバーもいそう）、地味に面倒です。

`@furikaeru`と投稿すると、スレッドへの返信の形でこんなフォーマットを返してくれます。
![スクリーンショット 2022-09-19 15.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/5439d8c2-6fb0-4b06-e0e7-78b0ec5049b2.png)
これをコピペして内容を埋めればOK。
わざわざ昨日の投稿を探してコピペして中身を編集したり、メモアプリに置いてあるフォーマットをコピペしたりする必要がなくなります。

#### 3. 今日完了したタスクを記憶してフォーマットに入れて返してくれる

振り返りフォーマットの取得は楽になりました。
でも記憶の糸をたぐって今日やったことを思い出すのも面倒な作業です。とある同僚はSlack内で自分の投稿を検索して、今日やったことを整理するとのこと。

そういう人は次のことをやればもっと楽にできるかもです。
日中、一つのタスクが終わったら、@furikaeruに向かって完了したタスクをつぶやくと、@furikaeruはそのタスクを記録してくれます。

`@furikaeru テストを書く :white_check_mark:`
![スクリーンショット 2022-09-19 17.15.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/2e285696-6b81-4aab-f8c9-c27166926d4d.png)
:white_check_mark: `:white_check_mark:`の部分は他に下記スタンプでも代用可能です。

- :ok: `:ok:`
- :white_check_mark: `:white_check_mark:`
- :ballot_box_with_check: `:ballot_box_with_check:`
- :heavy_check_mark: `:heavy_check_mark:`
- `:done:`→[弊社](https://fusic.co.jp/)のワークスペースにはオリジナルスタンプで存在している。

ちなみに、投稿するとこんな感じで@furikaeruが絵文字でリアクションしてくれます。
![スクリーンショット 2022-09-19 17.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/29e8666f-87ad-dd19-a50e-976065a84538.png)
この状態で、一日の終わりに振り返るフォーマットを要求すると、その日の完了タスクを入れた状態でフォーマットを返します。
![スクリーンショット 2022-09-19 17.21.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/f8a80b3d-3979-772d-1655-c5b4cd82d354.png)

### 今後追加したい機能
#### 1. 今日以外の完了タスクのフォーマットも返せるようにしたい
例えば`@furikaeru yesterday`とかやったら昨日のフォーマットが取れるようにしたい。

#### 2. 「明日やること」も自動で取得したい
[弊社](https://fusic.co.jp/)はOutlookを使っているので、カレンダーに入っている予定を取ってきてフォーマットに埋めたい。
この辺参考になりそう↓

https://tech.fusic.co.jp/posts/2022-04-18-satellite-bancho-2/

#### 3. Slackのリストがリストにならない
`- `もしくは`* `で投げるんですが、上の写真の通りリストマークにならないんですよね。半角スペース入れているのにダメ。

2022/9/22追記
これはSlack apiの仕様でできない模様。

> There's no specific list syntax in app-published text, but you can mimic list formatting with regular text and line breaks:
https://api.slack.com/reference/surfaces/formatting#block-formatting

Google翻訳すると↓
> アプリで公開されたテキストには特定のリスト構文はありませんが、通常のテキストと改行を使用してリストの書式設定を模倣できます。

模倣、つまりリストっぽく、それっぽくはできるよ、ということみたい。これが現時点では限界のようです。

#### 4. 完了したタスクの登録はスラッシュコマンドもいいかも
参考↓

https://tech.fusic.co.jp/posts/2020-01-14-nicole-slack-app/

#### 5. SAM化する。ついでにTypeScript化する

同僚が教えてくれましたが、SAMならTypeScriptが書けるらしい。
TypeScriptは今、会社の輪読会でやっているのでいいなと。

https://aws.amazon.com/jp/blogs/compute/building-typescript-projects-with-aws-sam-cli/

https://www.notion.so/fusic-no/Fusic-TypeScript-317cfb8801164493a8d5d9f18baaf399

## :frog: アーキテクチャ

- Slack API
- AWS
  - API Gateway
  - Lambda (Node.js)
  - DynamoDB

## :frog: ハマったところ
基本的には、次章の「参考になったサイト」など、世に溢れる記事を参考にすればSlack botアプリは作れると思いますが、ちょいちょいハマったのでそこだけメモしていこうと思っています。

適宜記事を書いて、公開でき次第、こちら更新します。

### API Gatewayの設定
Now writing...

### DynamoDBの設計とLambdaからDynamoDBにputItemすること。

https://qiita.com/kakudaisuke/items/f28a4942e423d95c1cd1

### Lambda + JSの実行環境で日本時間をセットすること

https://qiita.com/kakudaisuke/items/abdb920a3df20e029c44

### Slackで自動で絵文字のリアクションをすること

https://qiita.com/kakudaisuke/items/f0e45fbf5cfb553c1253

## :frog: 参考になったサイト

https://qiita.com/landwarrior/items/dfac36a1aadac9ab0cd5



https://qiita.com/charon1212/items/3618e6e76dc5ba06484a#4%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E8%BF%94%E4%BF%A1%E3%81%99%E3%82%8B

https://www.webfx.com/tools/emoji-cheat-sheet/