UNPKG

koishi-plugin-best-cave

Version:

功能强大、高度可定制的回声洞。支持丰富的媒体类型、内容查重、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。

99 lines (77 loc) 9.05 kB
# koishi-plugin-best-cave [![npm](https://img.shields.io/npm/v/koishi-plugin-best-cave?style=flat-square)](https://www.npmjs.com/package/koishi-plugin-best-cave) 功能强大、高度可定制的回声洞插件。支持丰富的媒体类型、内容查重、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。 ## 🧩 前置依赖 - **数据库 (`koishi-plugin-database`)**: 本插件强依赖数据库来存储数据,请确保您已至少配置了一个数据库插件(如 `koishi-plugin-database-sqlite``koishi-plugin-database-mysql`)。 - **图片处理 (`sharp`)**: 如果您启用了 `enableSimilarity` (内容查重) 功能,插件需要使用 `sharp` 库来处理图片。通常情况下它会自动安装,如遇安装问题,请参考 `sharp` 的官方文档解决。 ## ✨ 功能亮点 - **丰富的内容形式**:不止于文本,轻松发布包含图片、视频、音频甚至文件的混合内容。插件能自动解析回复或引用的消息,并将其完整存入回声洞。 - **灵活的存储后端**:媒体文件可存储在 **本地服务器** (`data/cave` 目录),或配置使用任何 **S3 兼容** 的云端对象存储(如 AWS S3, MinIO, 阿里云 OSS, 腾讯云 COS 等)。支持通过公共URL、本地文件路径或Base64三种方式发送媒体。 - **高级内容查重**:(可选) 启用后,插件会在添加时自动计算文本 (Simhash) 和图片 (pHash) 的哈希值。对于相似度过高的投稿将直接拒绝,有效防止重复。管理员还可通过维护工具找出局部相似或拼接的图片。 - **完善的审核机制**:(可选) 启用后,所有新投稿都将进入待审核状态,并通知管理群组。只有管理员审核通过后,内容才会对用户可见,确保内容质量。 - **精细的作用域**:通过 `perChannel` 配置,可设定回声洞是在所有群聊中共享(全局模式),还是在每个群聊中独立(分群模式)。 - **专属用户昵称**:(可选) 用户可以为自己在回声洞中的发言设置一个专属昵称,增加趣味性。 - **便捷的数据管理**:(可选) 管理员可通过指令轻松地将所有回声洞数据导出为 `JSON` 文件备份,或从文件中恢复数据,迁移无忧。 - **强大的维护工具**:管理员可以通过 `cave.hash` 指令为历史数据批量生成哈希值,并通过 `cave.check` 获取一份所有内容的相似度报告。 - **权限分离**:普通用户可删除自己的投稿。审核、数据管理等高级操作则仅限在指定的 **管理群组** 内由管理员执行。 - **高效的ID管理**:优先复用已删除的ID,并在无可用ID时采用高效的“最大ID+1”策略,确保回声洞序号紧凑,并能高效处理大量数据。 ## 📖 指令说明 ### 用户指令 | 指令 | 别名/选项 | 说明 | | :--- | :--- | :--- | | `cave` | | 随机查看一条回声洞。 | | `cave.add [内容]` | `cave -a [内容]` | 添加新的回声洞。可以直接跟文字,也可以**回复一条带图片/视频的消息后发送 `cave.add`**,或等待机器人提示后发送。 | | `cave.view <序号>` | `cave -g <序号>` | 查看指定序号的回声洞。 | | `cave.del <序号>` | `cave -r <序号>` | 删除指定序号的回声洞。仅投稿人或在管理群组内的管理员可操作。 | | `cave.list` | `cave -l` | 查询并列出自己投稿过的所有回声洞序号及总数。 | | | `-u <用户>` | 查询指定用户(需@或使用ID)投稿的所有回声洞。 | | | `-a` | **(仅限管理群组)** 查看所有用户的投稿数量排行榜。 | ### 模块化指令 这些指令只有在配置中启用了相应功能后才可用。 | 指令 | 所需配置 | 说明 | | :--- | :--- | :--- | | `cave.name [昵称]` | `enableName: true` | 设置你在回声洞中显示的昵称。若不提供昵称,则清除现有设置。 | | `cave.pend` | `enablePend: true` | **(仅限管理群组)** 列出所有待审核的回声洞ID。 | | `cave.pend <序号>` | `enablePend: true` | **(仅限管理群组)** 查看指定待审核内容的详情。 | | `cave.pend.Y [...序号]` | `enablePend: true` | **(仅限管理群组)** 通过审核。若不提供序号,则通过所有待审核内容。 | | `cave.pend.N [...序号]` | `enablePend: true` | **(仅限管理群组)** 拒绝审核。若不提供序号,则拒绝所有待审核内容。 | | `cave.export` | `enableIO: true` | **(仅限管理群组)** 将所有`active`状态的回声洞导出到 `data/cave/cave_export.json`。 | | `cave.import` | `enableIO: true` | **(仅限管理群组)**`data/cave/cave_import.json` 文件中导入数据。 | | `cave.hash` | `enableSimilarity: true` | **(仅限管理群组)** 校验所有历史数据,为缺失哈希的回声洞补全记录。 | | `cave.check` | `enableSimilarity: true` | **(仅限管理群组)** 检查所有回声洞的哈希,生成一份关于文本和图片相似度的报告。 | ## ⚙️ 配置说明 ### 基础配置 | 配置项 | 类型 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | `perChannel` | `boolean` | `false` | 是否启用分群模式。`true` 表示各群的回声洞独立。 | | `enableName` | `boolean` | `false` | 是否启用自定义昵称功能 (`cave.name` 指令)。 | | `enableIO` | `boolean` | `false` | 是否启用数据导入/导出功能 (`cave.export` / `.import` 指令)。 | | `adminChannel` | `string` | `'onebot:'` | **管理群组ID**。格式为 `平台名:群号`,如 `onebot:12345678`。管理指令仅在此群组生效。若配置无效,审核将自动通过。 | | `caveFormat` | `string` | `'回声洞 ——({id})\|—— {*name}'` | 回声洞消息的显示格式。`\|`为页眉页脚分隔符。支持强大的占位符语法:• **基本**: `{id}`, `{name}`, `{time}`, `{user}`, `{channel}`**自动打码**: `{*user}` (在占位符前加\*)• **审核可见**: `{/channel}` (在占位符前加/)• **组合**: `{*user/user}` (常规打码/审核时完整) | ### 复核配置 (审核与查重) | 配置项 | 类型 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | `enablePend` | `boolean` | `false` | 是否启用审核机制。启用后,新投稿将进入`pending`状态。 | | `enableSimilarity` | `boolean` | `false` | 是否启用内容相似度检查(查重)。 | | `textThreshold` | `number` | `90` | **文本**相似度阈值 (0-100)。基于Simhash汉明距离计算,超过此值将被拒绝。 | | `imageThreshold` | `number` | `90` | **图片整体**相似度阈值 (0-100)。基于pHash汉明距离计算,超过此值将被拒绝。 | ### 存储配置 | 配置项 | 类型 | 默认值 | 说明 | | :--- | :--- | :--- | :--- | | `localPath` | `string` | | 为本地文件提供一个可访问的绝对路径。配置后,将以 `file:///` 协议发送本地媒体。 | | `enableS3` | `boolean` | `false` | 是否启用 S3 兼容对象存储。若为 `false`,所有媒体文件将保存在本地 `data/cave` 目录下。 | | `publicUrl` | `string` | | **(S3 可选)** S3 存储桶的公共访问 URL。如果提供,插件将直接用此 URL 发送媒体链接,性能最佳。 | | `endpoint` | `string` | | **(S3 必填)** S3 兼容存储的 Endpoint URL。 | | `bucket` | `string` | | **(S3 必填)** S3 存储桶 (Bucket) 名称。 | | `region` | `string` | `'auto'` | **(S3 可选)** S3 区域 (Region)。 | | `accessKeyId` | `string` | | **(S3 必填)** S3 访问密钥 ID。 | | `secretAccessKey` | `string` | | **(S3 必填)** S3 秘密访问密钥。 | ## ⚠️ 注意事项 1. **媒体发送方式**:插件会按以下优先级决定如何发送图片、视频等媒体文件: 1. **S3 公共URL**:如果 `enableS3``publicUrl` 已配置。**(推荐)** 2. **本地文件路径**:如果 `localPath` 已配置。 3. **Base64 编码**:如果以上两项均未配置,将文件转为 Base64 发送(可能受平台大小限制或支持问题)。 2. **文件存储权限**:若使用本地存储,请确保 Koishi 拥有对 `data/cave` 目录的读写权限。若使用 S3,请确保 Access Key 权限和存储桶策略(如ACL设为`public-read`)配置正确。 3. **异步删除**:删除操作(`cave.del` 或审核拒绝)会将内容状态标记为 `delete`,然后由后台任务异步清理关联的文件和数据库条目,以避免阻塞当前指令。 4. **数据迁移**:导入功能会读取插件数据目录下的 `cave_import.json`。导出功能则会生成 `cave_export.json`。请在操作前放置或备份好相应文件。导入时,ID会从现有最大ID开始自增,不会覆盖或修改老数据。 5. **查重机制**:图片查重在投稿时,仅基于**整图**的相似度进行判断和拒绝。插件还会为图片的四个象限生成哈希,但这些局部哈希仅用于 `cave.check` 指令生成相似度报告,供管理员识别拼接图、裁剪图等情况,**并不会在投稿时直接导致拒绝**