Slackの全Public channelにおける人間の発言を一つのチャンネルに集約して流したりします。
- アプリを生成して、適当に設定します。
- (必要に応じてsocket modeを有効にして)eventを有効化します。
- スコープは以下の設定をしてください。
- private channelに発言させるには、private channelでintegration設定で当該アプリを入れる必要があります。
users:readユーザIDとユーザ名の変換channels:readチャンネルIDとチャンネル名の変換chat:write.customize名前を変更してpostする権限chat:write親権限
team:readチームURIのドメイン取得
channels:historyイベントを受信- eventsをuser eventsにした場合
channels:read- チャンネル状態の変化イベントusers:read- ユーザ情報の変更イベント
channel_rename- チャンネルのリネームchannel_created- チャンネルの作成channel_unarchive- チャンネルのアーカイブ解除user_change- ユーザ情報の変更
message.channelspublic channelに流れるメッセージ
環境変数 AGGREGATE_CHANNEL_ID にチャンネルIDを指定して起動すると、受信した人間による全発言を投入します。
巨大Workspaceなどではchat.postMessageのAPI rate limitを突き抜けるかもしれません。
環境変数DISPATCH_CHANNELにJSON形式で集約ルールを書くことが出来ます。prefixとsuffixの2つがあり、prefixを先に評価します。
[{
"prefix": "times_",
"cid": "CIDTIMES"
},{
"suffix": "_zatsu",
"cid": "CIDZATSU"
},{
"suffix": "_foobar",
"cid": "CIDFOOBAR"
}]Slackが送ってくるイベントではチャンネルとユーザ名が内部UIDで表記されているため、適当にlookupする必要があります。 オンメモリでキャッシュしていますが、なんかの弾みでプロセスが再起動される毎にAPI叩くのを避けるためにRedisに保存することができます。
REDIS_TLS_URL(TLSでの接続URL)、REDIS_URL(生TCPでの接続URL)、REDIS_HOST(host:port形式)のどれか環境変数で設定すると、Redisをオンメモリキャッシュの裏として使うようになります。
現状Redisに書き込むkeyは特にTTLを設定していないので、適当にallkeys-lruなどのeviction policyを設定してください。
WebhookでEvent API受け取る場合はHerokuでも動きます。
dockerコンテナを作るようにしたので、ghcr.io/walkure/aggrechans:latestなどで取ってくることが出来ます。Packageを参照してください。
コンテナはSLACK_APP_TOKENが定義されているとsocket modeで起動し、なければwebhook modeで起動します。SLACK_BOT_TOKENはどちらの場合も必要です。
docker run -e SLACK_BOT_TOKEN=(BOT TOKEN) -e REDIS_HOST=localhost:6379 -e AGGREGATE_CHANNEL_ID=(CHANNEL_ID) -e SLACK_APP_TOKEN=(APP TOKEN) ghcr.io/walkure/aggrechans:latest
webhook modeの場合はREDIS_HOSTやSLACK_SIGNING_SECRET(App CredentialsのSigning Secretにある値)も必要です。
socket modeの場合はREDIS_HOSTの存在は任意で、SLACK_SIGNING_SECRETは不要です。
walkure at 3pf.jp
MIT