# Slack

Slack 接入使用 Socket Mode，用户可在频道中 @ App、给 App 发私信或在线程中继续对话，回复会回到原频道或原线程；默认由本地服务直连 Slack，除非设置 `SLACK_CHANNEL_DIRECT_ENABLED=false`。

## 使用方式

| 方式 | 触发方式 | 说明 |
| --- | --- | --- |
| 频道 @ App | 在频道中 @ App 并输入问题 | 适合团队在频道里查询设备、处理告警或下发控制命令。 |
| 私信 App | 直接给 App 发私信 | 适合个人远程查询和控制设备。 |
| 线程回复 | 在 App 回复的线程中继续提问 | 适合把一次设备排查或操作过程保持在同一个 Slack 线程里。 |

## 在 Slack 后台准备 App

1. 在 Slack API Apps 中创建 App。
2. OAuth & Permissions → Bot Token Scopes 添加：
   - `chat:write`
   - `app_mentions:read`
   - `im:history`
3. Event Subscriptions 中订阅 Bot Events：
   - `app_mention`
   - `message.im`
4. 打开 Socket Mode。
5. Basic Information → App-Level Tokens 创建 token，scope 选择 `connections:write`，复制 `xapp-...`。
6. OAuth & Permissions → Install to Workspace，复制 Bot User OAuth Token，通常形如 `xoxb-...`。
7. Basic Information 中复制 Signing Secret。

## 在控制台填写配置

打开 **设置 → IM 通道 → Slack**，填写以下字段：

| 字段 | `.env` | 说明 |
| --- | --- | --- |
| 启用 | `SLACK_ENABLED` | 是否启动 Slack 通道 |
| Bot Token | `SLACK_BOT_TOKEN` | `xoxb-...` |
| App Token | `SLACK_APP_TOKEN` | `xapp-...`，需要 `connections:write` |
| Signing Secret | `SLACK_SIGNING_SECRET` | 可选，Slack App 的 Signing Secret |
| 白名单 | `SLACK_ALLOW_FROM` | 可选，允许访问的 Slack 用户 ID |

也可以在 `.env` 中配置：

```bash
SLACK_ENABLED=true
SLACK_BOT_TOKEN=xoxb-your-slack-bot-token
SLACK_APP_TOKEN=xapp-your-slack-app-token
SLACK_SIGNING_SECRET=your-signing-secret
SLACK_ALLOW_FROM=U01234567,U89ABCDEF
SLACK_CHANNEL_DIRECT_ENABLED=true
```

保存后重启服务，配置才会生效。

## 验证接入

1. 确认服务已重启。
2. 日志中出现 `Slack: enabled` 和 `Channel started (Socket Mode)`。
3. 在频道中 @ App，或给 App 发私信。
4. 如果启用了白名单，确认发送者 Slack 用户 ID 已写入白名单。

频道消息会在原线程中回复；私信会直接回复到私信会话中。

## 常见检查项

- 私信无响应：确认订阅了 `message.im`，并重新安装 App 到 workspace。
- 频道无响应：确认消息中 @ 了 App，并且 App 已加入频道。
- Socket Mode 无法启动：确认 `SLACK_APP_TOKEN` 是 `xapp-...`，且包含 `connections:write`。
- 直连通道未启动：确认没有设置 `SLACK_CHANNEL_DIRECT_ENABLED=false`。
