#Slack Connectでアプリを利用する時にハマったこと2

前回のpostはこちらです

https://qiita.com/geeorgey/items/f1a1e125176cfca38454

Slack ConnectはSlackの複数のワークスペース間で一つのチャンネルを共有する事ができる仕組みです。
非常に便利な仕組みで、他組織との協働には欠かせない機能です。
反面、Slackアプリ開発者には気をつけないといけないことがいくつかあり、今回は前回に引き続いてハマったことがありましたので記録していきたいとおもいます。

## そのclientはどのワークスペースのclientか分かっているか？

https://youtu.be/mqVwYwpTJb4

動作イメージはこんな感じです。動画は↑

前提条件として、Slack コネクトで接続したチャンネルで、同じアプリケーションを複数ワークスペースが利用しているという状態です。
最初の記事にも書いたのですが、複数の同じアプリが一つのチャンネルに登録されている場合、Slackは一番最後に登録されたワークスペースのbotのみが生きている状態になります。

最初の状態はこちらです
![Slack___コネクトグリッド___Grid_1___2_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/eebbeebe-525d-b13a-5908-d1f1083534ad.png)

私達が開発しているTASUKARUというSlackアプリでは、todo という文字列を認識して、ToDoリストに加えるという機能を持っています。
このチャンネルには複数の同じアプリが登録されているのですが、今回は画像にある通り、他組織Eのアプリが反応して自動返信を投げてくれていることが分かります。

この状態から、ToDo取り下げボタンを押すと、ToDoリストから排除されます。何でもかんでも拾ってしまうと予期せぬToDoが増えてしまいますよね。
排除されたあとは、このような形に表記を変えています。

![Slack___コネクトグリッド___Grid_1___2_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/3a843ce7-3cbb-d55d-5321-8e3b682d3ae5.png)

## postの書き換えについて
書き換えはchat_update APIを使います。

https://api.slack.com/methods/chat.update

Bolt for Pythonではこんな形で書きます

```Python
@bolt_app.view("remove_todo")
def remove_todo(ack, body, view, logger, client, payload):
    #中略
    try:
        post_update = client.chat_update(
            channel=channel_id,
            ts= ts,
            text = text,
            blocks = message_blocks
        )
    except SlackApiError as e:
        print("Error chat_update: {}".format(e))
```

これは、問題なく動きます。
ちなみに、clientに入っているbot_tokenは、先程見た他組織Eのbot_tokenが自動的に入ります。
ボタンの発火元がEのアプリからということで自動的に引き継がれているっぽいです。

## 問題が起きるのはこのパターン

上記の画像について「ToDoをアサインする」ボタンを押すと、このような画面へと移ります。

![Slack___コネクトグリッド___Grid_1___2_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/fe775a09-a77e-9a51-86c2-1f1ba61c955b.png)

日付を設定し(しなくてもよいのですが）、担当者を設定するボタンを押すと担当者のアサイン画面へと遷移します。

![Slack___コネクトグリッド___Grid_1___2_個の新しいアイテム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/53316eba-429b-15f8-a3c8-fc096ddd8d13.png)

担当者名を選んで保存するボタンを押すと、先程と同様に書き換え処理が走るのですが、cant_update_messageとなります。

### これはなぜか
担当者を設定するボタンを押すと、以下のような形でactionをキャッチします。

```Python

@bolt_app.action("save_assign_user")
def save_assign_user(ack, body, view, logger, client, payload):
    #何かしらの処理
```

ここで取得できるclientは誰のものでしょう。
それは、先程の組織Eのbot_idではなく、そのボタンを押したユーザーのclientになっているのです。
挙動としては、ボタンを押したユーザーが新規にモーダルをつくっているという事になるからだろうと理解しています。
そりゃそうか…という感じではあるのですが、このようにモーダルを連続して立ち上げて処理をする場合は注意しましょう。

## 対処法
最初に他組織のアプリがつくったボタンを押した際に、bot_token をprivate_metadataに入れて引き回しましょう。
最終的にそのtokenを使って、chat_updateを行えば問題ありません。


## まとめ
ということで、Slack Connectで使われる前提でのアプリ開発には、シングルワークスペースでは思いもよらなかった罠が潜んでいるので気をつけていきましょう。


### Slackアプリも稼働中です。是非見ていってください

記事中で紹介したTASUKARU含めて5つのSlackアプリを開発中です。ぜひお試し下さい！

- TASUKARU-TaskALL- https://lne.st/3x1u
- OYASUMI bot https://lne.st/oyasumilink
- TIPS https://lne.st/tips
- TimeLine for Slack https://lne.st/wr21
- YOKOKU for Slack https://lne.st/4cdy

### TASUKARU 
Slackで色々な人からメンションをもらって混乱したことはありませんか？
何か頼まれていたはずだけど思い出せない…　そんな状態からあなたを救います。
TASUKARUはSlack専用のタスクマネージャーです。
デフォルトのスレッドやメンション画面では、処理が終わったpostをアーカイブすることが出来ませんが、TASUKARUならそれが出来ます。
今アクションが必要なものだけに集中することができる、それがTASUKARUです。

### OYASUMI bot
Googleカレンダーのスケジュールに「休み」等の、休暇判定キーワードが入っていた場合に、自動的にSlackをスヌーズ状態に変更します。
メンションがあった場合に、メンションした相手にその日は休暇ですというレスを付けます。
スタッフの休暇を気持ちよく過ごしてもらう為のアプリです。

### TIPS
Slack用のリマインダーアプリです。
デフォルト機能のリマインダーは、一つのスケジュールに一つのメッセージの設定しか出来ません。
このアプリでは、一つのスケジュールに複数のメッセージを登録し、ランダムで指定された時間にpostします。
チャンネル特有のノウハウ等をスケジュール登録しておくことで、自然と情報が浸透する状態を作ります。


### TimeLine for Slack
全ての公開チャンネルのpostを一つのチャンネルにまとめるタイムラインチャンネルを生成するアプリです。
一部のチャンネルのみを集めたミックスチャンネルを作成すると、自分が必要なチャンネルだけのタイムラインを作り出すことが出来ます。
オプション機能として、メッセージ転送時にDeepL翻訳を挟むことが出来ます。

### YOKOKU for Slack
OYASUMI botの応用です。
例えば「営業」というキーワードが入った予定だけを抽出したいと思ったことはありませんか？
カレンダーをいちいち検索するのは手間がかかります。
このアプリを用いれば、特定のキーワードが入った予定を、特定のチャンネルに流すことが出来ます。