← Back to Plugins
Channels

Rocketchat Bot

laevateinzzl By laevateinzzl 👁 3 views ▲ 0 votes

Rocket.Chat channel plugin for OpenClaw

GitHub

Install

npm install
npm

Configuration Example

channels:
  rocketchat:
    accounts:
      main:
        enabled: true
        serverUrl: "https://chat.example.com"
        auth:
          mode: "token"
          userId: "rocket-user-id"
          accessToken: "rocket-access-token"
        transport:
          mode: "websocket"
          reconnectDelayMs: 5000
        mentionNames:
          - "rocketbot"
          - "assistant"

README

# OpenClaw Rocket.Chat Plugin

Rocket.Chat channel plugin for OpenClaw.

## 已实现能力

- 原生 OpenClaw channel plugin 包结构
- 支持 `openclaw plugins install` 安装
- 支持两种鉴权方式
  - `token`: `userId + accessToken`
  - `password`: `username + password`
- 支持单聊
- 支持群聊和频道,仅在明确 `@机器人` 时响应
- 回复阶段先发送 `思考中...`,最终内容原地更新
- 保留 Markdown fenced code block,不主动破坏代码块
- 入站接入支持 REST 轮询和 WebSocket/DDP
- 传输层已抽象,可按账号切换 transport

## 当前限制

- 不包含附件、线程、反应、消息撤回同步
- 没有真实 Rocket.Chat E2E 测试,当前以单元测试和模块集成测试为主

## 安装

本地目录安装:

```bash
openclaw plugins install ./
```

后续发布到 npm 后,也可以按包名安装。

## 配置示例

下面的示例表达的是 `channels.rocketchat` 这段配置结构:

```yaml
channels:
  rocketchat:
    accounts:
      main:
        enabled: true
        serverUrl: "https://chat.example.com"
        auth:
          mode: "token"
          userId: "rocket-user-id"
          accessToken: "rocket-access-token"
        transport:
          mode: "websocket"
          reconnectDelayMs: 5000
        mentionNames:
          - "rocketbot"
          - "assistant"
```

密码登录模式:

```yaml
channels:
  rocketchat:
    accounts:
      main:
        enabled: true
        serverUrl: "https://chat.example.com"
        auth:
          mode: "password"
          username: "rocketbot"
          password: "your-password"
        transport:
          mode: "polling"
          pollIntervalMs: 30000
        mentionNames:
          - "rocketbot"
```

## 行为说明

- 单聊消息默认接入 OpenClaw
- 群聊和频道消息只有在明确提及机器人时才接入
- 提及判断优先用 Rocket.Chat 的 mention metadata
- 如果服务端 payload 没带 mentions,会回退到文本里的 `@alias` 匹配
- `mentionNames` 用于补充别名,不需要重复写主用户名也能工作
- `transport.mode: "websocket"` 会用 DDP 接收入站消息,并在房间列表变化时用一次 REST 刷新订阅
- `transport.mode: "polling"` 继续保留,适合作为兼容回退

## 开发命令

```bash
npm install
npm test
npm run typecheck
npm run build
```

## 调试

`debug:client` 和 `debug:poll` 会先读取项目根目录的 `.env`,再用命令行显式传入的环境变量覆盖同名字段。
当前调试脚本主要覆盖 REST 连通性和轮询链路,WebSocket 入站没有单独脚本。

### 1. 调试 Rocket.Chat 登录和接口连通性

```bash
ROCKETCHAT_SERVER_URL="https://chat.example.com" \
ROCKETCHAT_AUTH_MODE="token" \
ROCKETCHAT_USER_ID="rocket-user-id" \
ROCKETCHAT_ACCESS_TOKEN="rocket-access-token" \
npm run debug:client
```

密码模式:

```bash
ROCKETCHAT_SERVER_URL="https://chat.example.com" \
ROCKETCHAT_AUTH_MODE="password" \
ROCKETCHAT_USERNAME="rocketbot" \
ROCKETCHAT_PASSWORD="your-password" \
npm run debug:client
```

输出会打印:

- 当前账号身份信息
- 当前可见订阅数量
- 鉴权失败时的错误信息

### 2. 调试单次轮询和入站事件

```bash
ROCKETCHAT_SERVER_URL="https://chat.example.com" \
ROCKETCHAT_AUTH_MODE="token" \
ROCKETCHAT_USER_ID="rocket-user-id" \
ROCKETCHAT_ACCESS_TOKEN="rocket-access-token" \
ROCKETCHAT_UPDATED_SINCE="2026-03-26T00:00:00.000Z" \
npm run debug:poll
```

可选环境变量:

- `ROCKETCHAT_ACCOUNT_ID`
- `ROCKETCHAT_MENTION_NAMES`
- `ROCKETCHAT_POLL_INTERVAL_MS`
- `ROCKETCHAT_UPDATED_SINCE`

`debug:poll` 会打印每条标准化后的入站事件,以及本次轮询结束后的 checkpoint。

## 项目结构

```text
src/
  index.ts
  plugin.ts
  client.ts
  config.ts
  channel.ts
  format.ts
  checkpoints.ts
  inbound/
    types.ts
    polling.ts
    websocket.ts
tests/
openclaw.plugin.json
```

## 后续扩展

- 为 WebSocket transport 增加独立调试脚本
- 为 websocket 断线重连增加更细粒度的 backoff 策略
- 保持 mention 规则、回复占位、Rocket.Chat 出站逻辑不变
channels

Comments

Sign in to leave a comment

Loading comments...