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.channels
public 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