koishi-plugin-best-cave 2.1.3 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/HashManager.d.ts +12 -26
- package/lib/index.js +224 -291
- package/package.json +2 -2
- package/readme.md +41 -31
- package/lib/DataManager.d.ts +0 -38
- package/lib/FileManager.d.ts +0 -48
- package/lib/ProfileManager.d.ts +0 -50
- package/lib/ReviewManager.d.ts +0 -40
- package/lib/Utils.d.ts +0 -86
- package/lib/index.d.ts +0 -61
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-best-cave",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "2.
|
|
3
|
+
"description": "功能强大、高度可定制的回声洞。支持丰富的媒体类型、内容查重、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。",
|
|
4
|
+
"version": "2.2.0",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Yis_Rime <yis_rime@outlook.com>"
|
|
7
7
|
],
|
package/readme.md
CHANGED
|
@@ -2,29 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/koishi-plugin-best-cave)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
功能强大、高度可定制的回声洞。支持丰富的媒体类型、内容查重、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。
|
|
6
6
|
|
|
7
7
|
## ✨ 功能亮点
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
9
|
+
- **丰富的内容形式**:不止于文本,轻松发布包含图片、视频、音频甚至文件的混合内容。插件能自动解析回复或引用的消息,并将其完整存入回声洞。
|
|
10
|
+
- **灵活的存储后端**:媒体文件可存储在 **本地服务器** (`data/cave` 目录),或配置使用 **AWS S3** 兼容的云端对象存储。支持通过公共URL、本地文件路径或Base64三种方式发送媒体。
|
|
11
|
+
- **内容相似度检查**:(可选) 启用后,插件会在添加时自动计算文本(Simhash)和图片(pHash)的哈希值,拒绝与现有内容相似度过高的投稿,有效防止重复。
|
|
12
|
+
- **完善的审核机制**:(可选) 启用后,所有新投稿都将进入待审核状态,并通知管理群组。只有管理员审核通过后,内容才会对用户可见,确保内容质量。
|
|
13
|
+
- **精细的作用域**:通过 `perChannel` 配置,可设定回声洞是在所有群聊中共享(全局模式),还是在每个群聊中独立(分群模式)。
|
|
14
|
+
- **专属用户昵称**:(可选) 用户可以为自己在回声洞中的发言设置一个专属昵称,增加趣味性。
|
|
15
|
+
- **便捷的数据管理**:(可选) 管理员可通过指令轻松地将所有回声洞数据导出为 `JSON` 文件备份,或从文件中恢复数据,迁移无忧。
|
|
16
|
+
- **强大的维护工具**:管理员可以通过 `cave.hash` 指令为历史数据批量生成哈希值,并获取一份所有内容的相似度报告。
|
|
17
|
+
- **权限分离**:普通用户可删除自己的投稿。审核、数据管理等高级操作则仅限在指定的 **管理群组** 内由管理员执行。
|
|
16
18
|
|
|
17
19
|
## 📖 指令说明
|
|
18
20
|
|
|
19
|
-
###
|
|
21
|
+
### 用户指令
|
|
20
22
|
|
|
21
23
|
| 指令 | 别名/选项 | 说明 |
|
|
22
24
|
| :--- | :--- | :--- |
|
|
23
25
|
| `cave` | | 随机查看一条回声洞。 |
|
|
24
|
-
| `cave.add
|
|
26
|
+
| `cave.add [内容]` | `cave -a [内容]` | 添加一条新的回声洞。可直接跟内容,也可回复/引用消息,或等待机器人提示后发送。 |
|
|
25
27
|
| `cave.view <序号>` | `cave -g <序号>` | 查看指定序号的回声洞。 |
|
|
26
|
-
| `cave.del <序号>` | `cave -r <序号>` |
|
|
27
|
-
| `cave.list` | `cave -l` |
|
|
28
|
+
| `cave.del <序号>` | `cave -r <序号>` | 删除指定序号的回声洞。仅投稿人或在管理群组内的管理员可操作。 |
|
|
29
|
+
| `cave.list` | `cave -l` | 查询并列出自己投稿过的所有回声洞序号及总数。 |
|
|
28
30
|
|
|
29
31
|
### 模块化指令
|
|
30
32
|
|
|
@@ -32,48 +34,56 @@
|
|
|
32
34
|
|
|
33
35
|
| 指令 | 所需配置 | 说明 |
|
|
34
36
|
| :--- | :--- | :--- |
|
|
35
|
-
| `cave.profile [昵称]` | `enableProfile: true` |
|
|
36
|
-
| `cave.review` | `enableReview: true` | **(
|
|
37
|
-
| `cave.review <序号>` | `enableReview: true` | **(
|
|
38
|
-
| `cave.review
|
|
39
|
-
| `cave.
|
|
40
|
-
| `cave.
|
|
37
|
+
| `cave.profile [昵称]` | `enableProfile: true` | 设置你在回声洞中显示的昵称。若不提供昵称,则清除现有设置。 |
|
|
38
|
+
| `cave.review` | `enableReview: true` | **(仅限管理群组)** 列出所有待审核的回声洞ID。 |
|
|
39
|
+
| `cave.review <序号>` | `enableReview: true` | **(仅限管理群组)** 查看指定待审核内容的详情。 |
|
|
40
|
+
| `cave.review.Y [序号]` | `enableReview: true` | **(仅限管理群组)** 通过审核。若不提供序号,则通过所有待审核内容。 |
|
|
41
|
+
| `cave.review.N [序号]` | `enableReview: true` | **(仅限管理群组)** 拒绝审核。若不提供序号,则拒绝所有待审核内容。 |
|
|
42
|
+
| `cave.export` | `enableIO: true` | **(仅限管理群组)** 将所有`active`状态的回声洞导出到 `cave_export.json`。 |
|
|
43
|
+
| `cave.import` | `enableIO: true` | **(仅限管理群组)** 从 `cave_import.json` 文件中导入数据。 |
|
|
44
|
+
| `cave.hash` | `enableSimilarity: true` | **(仅限管理群组)** 校验所有历史数据,补全哈希并检查内容相似度。 |
|
|
41
45
|
|
|
42
46
|
## ⚙️ 配置说明
|
|
43
47
|
|
|
44
|
-
插件配置分为三个部分:基础配置、审核配置和存储配置。
|
|
45
|
-
|
|
46
48
|
### 基础配置
|
|
47
49
|
|
|
48
50
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
49
51
|
| :--- | :--- | :--- | :--- |
|
|
50
|
-
| `
|
|
51
|
-
| `perChannel` | `boolean` | `false` | 是否启用分群模式。`true`
|
|
52
|
-
| `adminUsers` | `string[]` | `[]` | 管理员的用户 ID 列表。 |
|
|
52
|
+
| `coolDown` | `number` | `10` | `cave` 和 `cave.view` 指令的冷却时间(秒)。 |
|
|
53
|
+
| `perChannel` | `boolean` | `false` | 是否启用分群模式。`true` 表示各群的回声洞独立。 |
|
|
53
54
|
| `enableProfile` | `boolean` | `false` | 是否启用自定义昵称功能 (`cave.profile` 指令)。 |
|
|
54
|
-
| `
|
|
55
|
+
| `enableIO` | `boolean` | `false` | 是否启用数据导入/导出功能 (`cave.export` / `.import` 指令)。 |
|
|
56
|
+
| `adminChannel` | `string` | `'onebot:'` | **管理群组ID**。格式为 `平台名:群号`,如 `onebot:12345678`。审核、数据等管理指令仅在此群组生效。 |
|
|
57
|
+
| `caveFormat` | `string` | `'回声洞 ——({id})\|—— {name}'` | 回声洞消息的显示格式。`{id}`是序号,`{name}`是昵称,`\|`为换行符。 |
|
|
55
58
|
|
|
56
|
-
###
|
|
59
|
+
### 复核配置 (审核与查重)
|
|
57
60
|
|
|
58
61
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
59
62
|
| :--- | :--- | :--- | :--- |
|
|
60
|
-
| `enableReview` | `boolean` | `false` |
|
|
63
|
+
| `enableReview` | `boolean` | `false` | 是否启用审核机制。 |
|
|
64
|
+
| `enableSimilarity` | `boolean` | `false` | 是否启用内容相似度检查(查重)。 |
|
|
65
|
+
| `textThreshold` | `number` | `0.9` | 文本相似度阈值 (0-1)。超过此值将被拒绝。 |
|
|
66
|
+
| `imageThreshold` | `number` | `0.9` | 图片相似度阈值 (0-1)。超过此值将被拒绝。 |
|
|
61
67
|
|
|
62
68
|
### 存储配置
|
|
63
69
|
|
|
64
70
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
65
71
|
| :--- | :--- | :--- | :--- |
|
|
72
|
+
| `localPath` | `string` | | 为本地文件提供一个可访问的绝对路径。配置后,将以 `file:///` 协议发送本地媒体。 |
|
|
66
73
|
| `enableS3` | `boolean` | `false` | 是否启用 S3 存储。若为 `false`,所有媒体文件将保存在本地 `data/cave` 目录下。 |
|
|
74
|
+
| `publicUrl` | `string` | | **(S3 可选)** S3 存储桶的公共访问 URL。如果提供,插件将直接用此 URL 发送媒体链接。 |
|
|
67
75
|
| `endpoint` | `string` | | **(S3 必填)** S3 兼容存储的 Endpoint URL。 |
|
|
68
76
|
| `bucket` | `string` | | **(S3 必填)** S3 存储桶 (Bucket) 名称。 |
|
|
69
77
|
| `region` | `string` | `'auto'` | **(S3 可选)** S3 区域 (Region)。 |
|
|
70
|
-
| `publicUrl` | `string` | | **(S3 可选)** S3 存储桶的公共访问 URL。如果提供,插件将直接用此 URL 拼接文件名来访问资源,否则将尝试使用 Base64 格式发送媒体。 |
|
|
71
78
|
| `accessKeyId` | `string` | | **(S3 必填)** S3 访问密钥 ID。 |
|
|
72
79
|
| `secretAccessKey` | `string` | | **(S3 必填)** S3 秘密访问密钥。 |
|
|
73
80
|
|
|
74
81
|
## ⚠️ 注意事项
|
|
75
82
|
|
|
76
|
-
1.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
1. **媒体发送方式**:插件会按以下优先级决定如何发送图片、视频等媒体文件:
|
|
84
|
+
1. **S3 公共URL**:如果 `enableS3` 和 `publicUrl` 已配置。
|
|
85
|
+
2. **本地文件路径**:如果 `localPath` 已配置。
|
|
86
|
+
3. **Base64 编码**:如果以上两项均未配置,将文件转为 Base64 发送(可能受平台大小限制)。
|
|
87
|
+
2. **文件存储权限**:若使用本地存储,请确保 Koishi 拥有对 `data/cave` 目录的读写权限。若使用 S3,请确保 Access Key 权限和存储桶策略配置正确。
|
|
88
|
+
3. **异步删除**:删除操作(`cave.del` 或审核拒绝)会将内容状态标记为 `delete`,然后由后台任务异步清理关联的文件和数据库条目,以避免阻塞当前指令。
|
|
89
|
+
4. **数据迁移**:导入功能会读取插件数据目录下的 `cave_import.json`。导出功能则会生成 `cave_export.json`。请在操作前放置或备份好相应文件。
|
package/lib/DataManager.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Context, Logger } from 'koishi';
|
|
2
|
-
import { FileManager } from './FileManager';
|
|
3
|
-
import { Config } from './index';
|
|
4
|
-
/**
|
|
5
|
-
* @class DataManager
|
|
6
|
-
* @description 负责处理回声洞数据的导入和导出功能。
|
|
7
|
-
*/
|
|
8
|
-
export declare class DataManager {
|
|
9
|
-
private ctx;
|
|
10
|
-
private config;
|
|
11
|
-
private fileManager;
|
|
12
|
-
private logger;
|
|
13
|
-
private reusableIds;
|
|
14
|
-
/**
|
|
15
|
-
* @constructor
|
|
16
|
-
* @param ctx Koishi 上下文,用于数据库操作。
|
|
17
|
-
* @param config 插件配置。
|
|
18
|
-
* @param fileManager 文件管理器实例。
|
|
19
|
-
* @param logger 日志记录器实例。
|
|
20
|
-
* @param reusableIds 可复用 ID 的内存缓存。
|
|
21
|
-
*/
|
|
22
|
-
constructor(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, reusableIds: Set<number>);
|
|
23
|
-
/**
|
|
24
|
-
* @description 注册 `.export` 和 `.import` 子命令。
|
|
25
|
-
* @param cave - 主 `cave` 命令实例。
|
|
26
|
-
*/
|
|
27
|
-
registerCommands(cave: any): void;
|
|
28
|
-
/**
|
|
29
|
-
* @description 导出所有 'active' 状态的回声洞数据到 `cave_export.json`。
|
|
30
|
-
* @returns 描述导出结果的消息字符串。
|
|
31
|
-
*/
|
|
32
|
-
exportData(): Promise<string>;
|
|
33
|
-
/**
|
|
34
|
-
* @description 从 `cave_import.json` 文件导入回声洞数据。
|
|
35
|
-
* @returns 描述导入结果的消息字符串。
|
|
36
|
-
*/
|
|
37
|
-
importData(): Promise<string>;
|
|
38
|
-
}
|
package/lib/FileManager.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Logger } from 'koishi';
|
|
2
|
-
import { Config } from './index';
|
|
3
|
-
/**
|
|
4
|
-
* @class FileManager
|
|
5
|
-
* @description 封装了对文件的存储、读取和删除操作。
|
|
6
|
-
* 能根据配置自动选择使用本地文件系统或 AWS S3 作为存储后端。
|
|
7
|
-
* 内置 Promise 文件锁,防止本地文件的并发写入冲突。
|
|
8
|
-
*/
|
|
9
|
-
export declare class FileManager {
|
|
10
|
-
private logger;
|
|
11
|
-
private resourceDir;
|
|
12
|
-
private locks;
|
|
13
|
-
private s3Client?;
|
|
14
|
-
private s3Bucket?;
|
|
15
|
-
/**
|
|
16
|
-
* @constructor
|
|
17
|
-
* @param baseDir Koishi 应用的基础数据目录 (ctx.baseDir)。
|
|
18
|
-
* @param config 插件的配置对象。
|
|
19
|
-
* @param logger 日志记录器实例。
|
|
20
|
-
*/
|
|
21
|
-
constructor(baseDir: string, config: Config, logger: Logger);
|
|
22
|
-
/**
|
|
23
|
-
* @description 使用文件锁安全地执行异步文件操作,防止并发读写冲突。
|
|
24
|
-
* @template T 异步操作的返回类型。
|
|
25
|
-
* @param fullPath 需要加锁的文件的完整路径。
|
|
26
|
-
* @param operation 要执行的异步函数。
|
|
27
|
-
* @returns 返回异步操作的结果。
|
|
28
|
-
*/
|
|
29
|
-
private withLock;
|
|
30
|
-
/**
|
|
31
|
-
* @description 保存文件,自动选择 S3 或本地存储。
|
|
32
|
-
* @param fileName 用作 S3 Key 或本地文件名。
|
|
33
|
-
* @param data 要写入的 Buffer 数据。
|
|
34
|
-
* @returns 返回保存时使用的文件名/标识符。
|
|
35
|
-
*/
|
|
36
|
-
saveFile(fileName: string, data: Buffer): Promise<string>;
|
|
37
|
-
/**
|
|
38
|
-
* @description 读取文件,自动从 S3 或本地存储读取。
|
|
39
|
-
* @param fileName 要读取的文件名/标识符。
|
|
40
|
-
* @returns 文件的 Buffer 数据。
|
|
41
|
-
*/
|
|
42
|
-
readFile(fileName: string): Promise<Buffer>;
|
|
43
|
-
/**
|
|
44
|
-
* @description 删除文件,自动从 S3 或本地删除。
|
|
45
|
-
* @param fileIdentifier 要删除的文件名/标识符。
|
|
46
|
-
*/
|
|
47
|
-
deleteFile(fileIdentifier: string): Promise<void>;
|
|
48
|
-
}
|
package/lib/ProfileManager.d.ts
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { Context } from 'koishi';
|
|
2
|
-
/**
|
|
3
|
-
* @description 数据库 `cave_user` 表的结构定义。
|
|
4
|
-
* @property userId 用户唯一ID,作为主键。
|
|
5
|
-
* @property nickname 用户自定义的昵称。
|
|
6
|
-
*/
|
|
7
|
-
export interface UserProfile {
|
|
8
|
-
userId: string;
|
|
9
|
-
nickname: string;
|
|
10
|
-
}
|
|
11
|
-
declare module 'koishi' {
|
|
12
|
-
interface Tables {
|
|
13
|
-
cave_user: UserProfile;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* @class ProfileManager
|
|
18
|
-
* @description 负责管理用户在回声洞中的自定义昵称。
|
|
19
|
-
* 当插件配置 `enableProfile` 为 true 时实例化。
|
|
20
|
-
*/
|
|
21
|
-
export declare class ProfileManager {
|
|
22
|
-
private ctx;
|
|
23
|
-
/**
|
|
24
|
-
* @constructor
|
|
25
|
-
* @param ctx - Koishi 上下文,用于初始化数据库模型。
|
|
26
|
-
*/
|
|
27
|
-
constructor(ctx: Context);
|
|
28
|
-
/**
|
|
29
|
-
* @description 注册 `.profile` 子命令,用于管理用户昵称。
|
|
30
|
-
* @param cave - 主 `cave` 命令实例。
|
|
31
|
-
*/
|
|
32
|
-
registerCommands(cave: any): void;
|
|
33
|
-
/**
|
|
34
|
-
* @description 设置或更新指定用户的昵称。
|
|
35
|
-
* @param userId - 目标用户的 ID。
|
|
36
|
-
* @param nickname - 要设置的新昵称。
|
|
37
|
-
*/
|
|
38
|
-
setNickname(userId: string, nickname: string): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* @description 获取指定用户的昵称。
|
|
41
|
-
* @param userId - 目标用户的 ID。
|
|
42
|
-
* @returns 返回用户的昵称字符串,如果未设置则返回 null。
|
|
43
|
-
*/
|
|
44
|
-
getNickname(userId: string): Promise<string | null>;
|
|
45
|
-
/**
|
|
46
|
-
* @description 清除指定用户的昵称设置。
|
|
47
|
-
* @param userId - 目标用户的 ID。
|
|
48
|
-
*/
|
|
49
|
-
clearNickname(userId: string): Promise<void>;
|
|
50
|
-
}
|
package/lib/ReviewManager.d.ts
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Context, Logger } from 'koishi';
|
|
2
|
-
import { CaveObject, Config } from './index';
|
|
3
|
-
import { FileManager } from './FileManager';
|
|
4
|
-
/**
|
|
5
|
-
* @class ReviewManager
|
|
6
|
-
* @description 负责处理回声洞的审核流程,处理新洞的提交、审核通知和审核操作。
|
|
7
|
-
*/
|
|
8
|
-
export declare class ReviewManager {
|
|
9
|
-
private ctx;
|
|
10
|
-
private config;
|
|
11
|
-
private fileManager;
|
|
12
|
-
private logger;
|
|
13
|
-
private reusableIds;
|
|
14
|
-
/**
|
|
15
|
-
* @constructor
|
|
16
|
-
* @param ctx Koishi 上下文。
|
|
17
|
-
* @param config 插件配置。
|
|
18
|
-
* @param fileManager 文件管理器实例。
|
|
19
|
-
* @param logger 日志记录器实例。
|
|
20
|
-
* @param reusableIds 可复用 ID 的内存缓存。
|
|
21
|
-
*/
|
|
22
|
-
constructor(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, reusableIds: Set<number>);
|
|
23
|
-
/**
|
|
24
|
-
* @description 注册与审核相关的子命令。
|
|
25
|
-
* @param cave - 主 `cave` 命令实例。
|
|
26
|
-
*/
|
|
27
|
-
registerCommands(cave: any): void;
|
|
28
|
-
/**
|
|
29
|
-
* @description 将新回声洞提交到管理群组以供审核。
|
|
30
|
-
* @param cave 新创建的、状态为 'pending' 的回声洞对象。
|
|
31
|
-
*/
|
|
32
|
-
sendForReview(cave: CaveObject): Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* @description 处理管理员的审核决定(通过或拒绝)。
|
|
35
|
-
* @param action 'approve' (通过) 或 'reject' (拒绝)。
|
|
36
|
-
* @param caveId 被审核的回声洞 ID。
|
|
37
|
-
* @returns 返回给操作者的确认消息。
|
|
38
|
-
*/
|
|
39
|
-
processReview(action: 'approve' | 'reject', caveId: number): Promise<string>;
|
|
40
|
-
}
|
package/lib/Utils.d.ts
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { Context, h, Logger, Session } from 'koishi';
|
|
2
|
-
import { CaveObject, Config, StoredElement, CaveHashObject } from './index';
|
|
3
|
-
import { FileManager } from './FileManager';
|
|
4
|
-
import { HashManager } from './HashManager';
|
|
5
|
-
/**
|
|
6
|
-
* @description 将数据库存储的 StoredElement[] 转换为 Koishi 的 h() 元素数组。
|
|
7
|
-
* @param elements 从数据库读取的元素数组。
|
|
8
|
-
* @returns 转换后的 h() 元素数组。
|
|
9
|
-
*/
|
|
10
|
-
export declare function storedFormatToHElements(elements: StoredElement[]): h[];
|
|
11
|
-
/**
|
|
12
|
-
* @description 构建一条用于发送的完整回声洞消息。
|
|
13
|
-
* 此函数会处理 S3 URL、文件映射路径或本地文件到 Base64 的转换。
|
|
14
|
-
* @param cave 要展示的回声洞对象。
|
|
15
|
-
* @param config 插件配置。
|
|
16
|
-
* @param fileManager FileManager 实例。
|
|
17
|
-
* @param logger Logger 实例。
|
|
18
|
-
* @returns 包含 h() 元素和字符串的消息数组。
|
|
19
|
-
*/
|
|
20
|
-
export declare function buildCaveMessage(cave: CaveObject, config: Config, fileManager: FileManager, logger: Logger): Promise<(string | h)[]>;
|
|
21
|
-
/**
|
|
22
|
-
* @description 清理数据库中所有被标记为 'delete' 状态的回声洞及其关联文件。
|
|
23
|
-
* @param ctx Koishi 上下文。
|
|
24
|
-
* @param fileManager FileManager 实例。
|
|
25
|
-
* @param logger Logger 实例。
|
|
26
|
-
* @param reusableIds 可复用 ID 的内存缓存。
|
|
27
|
-
*/
|
|
28
|
-
export declare function cleanupPendingDeletions(ctx: Context, fileManager: FileManager, logger: Logger, reusableIds: Set<number>): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* @description 根据配置(是否分群)和当前会话,生成数据库查询的范围条件。
|
|
31
|
-
* @param session 当前会话对象。
|
|
32
|
-
* @param config 插件配置。
|
|
33
|
-
* @returns 用于数据库查询的条件对象。
|
|
34
|
-
*/
|
|
35
|
-
export declare function getScopeQuery(session: Session, config: Config): object;
|
|
36
|
-
/**
|
|
37
|
-
* @description 获取下一个可用的回声洞 ID。
|
|
38
|
-
* 实现了三阶段逻辑:优先使用回收ID -> 扫描空闲ID -> 获取最大ID+1。
|
|
39
|
-
* @param ctx Koishi 上下文。
|
|
40
|
-
* @param query 查询范围条件,用于分群模式。
|
|
41
|
-
* @param reusableIds 可复用 ID 的内存缓存。
|
|
42
|
-
* @returns 可用的新 ID。
|
|
43
|
-
*/
|
|
44
|
-
export declare function getNextCaveId(ctx: Context, query: object, reusableIds: Set<number>): Promise<number>;
|
|
45
|
-
/**
|
|
46
|
-
* @description 检查用户是否处于指令冷却中。
|
|
47
|
-
* @returns 若在冷却中则返回提示字符串,否则返回 null。
|
|
48
|
-
*/
|
|
49
|
-
export declare function checkCooldown(session: Session, config: Config, lastUsed: Map<string, number>): string | null;
|
|
50
|
-
/**
|
|
51
|
-
* @description 更新指定频道的指令使用时间戳。
|
|
52
|
-
*/
|
|
53
|
-
export declare function updateCooldownTimestamp(session: Session, config: Config, lastUsed: Map<string, number>): void;
|
|
54
|
-
/**
|
|
55
|
-
* @description 解析消息元素,分离出文本和待下载的媒体文件。
|
|
56
|
-
* @param sourceElements - 原始的 Koishi 消息元素数组。
|
|
57
|
-
* @param newId - 这条回声洞的新 ID。
|
|
58
|
-
* @param channelId - 频道 ID。
|
|
59
|
-
* @param userId - 用户 ID。
|
|
60
|
-
* @returns 一个包含数据库元素和待保存媒体列表的对象。
|
|
61
|
-
*/
|
|
62
|
-
export declare function processMessageElements(sourceElements: h[], newId: number, channelId: string, userId: string): Promise<{
|
|
63
|
-
finalElementsForDb: StoredElement[];
|
|
64
|
-
mediaToSave: {
|
|
65
|
-
sourceUrl: string;
|
|
66
|
-
fileName: string;
|
|
67
|
-
}[];
|
|
68
|
-
}>;
|
|
69
|
-
/**
|
|
70
|
-
* @description 异步处理文件上传、查重和状态更新的后台任务。
|
|
71
|
-
* @param ctx - Koishi 上下文。
|
|
72
|
-
* @param config - 插件配置。
|
|
73
|
-
* @param fileManager - FileManager 实例,用于保存文件。
|
|
74
|
-
* @param logger - 日志记录器实例。
|
|
75
|
-
* @param reviewManager - ReviewManager 实例,用于提交审核。
|
|
76
|
-
* @param cave - 刚刚在数据库中创建的 `preload` 状态的回声洞对象。
|
|
77
|
-
* @param mediaToSave - 需要下载和处理的媒体文件列表。
|
|
78
|
-
* @param reusableIds - 可复用 ID 的内存缓存。
|
|
79
|
-
* @param session - 触发此操作的用户会话,用于发送反馈。
|
|
80
|
-
* @param hashManager - HashManager 实例,如果启用则用于哈希计算和比较。
|
|
81
|
-
* @param textHashesToStore - 已预先计算好的、待存入数据库的文本哈希对象数组。
|
|
82
|
-
*/
|
|
83
|
-
export declare function handleFileUploads(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, reviewManager: any, cave: CaveObject, mediaToSave: {
|
|
84
|
-
sourceUrl: string;
|
|
85
|
-
fileName: string;
|
|
86
|
-
}[], reusableIds: Set<number>, session: Session, hashManager: HashManager | null, textHashesToStore: Omit<CaveHashObject, 'cave'>[]): Promise<void>;
|
package/lib/index.d.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Context, Schema } from 'koishi';
|
|
2
|
-
export declare const name = "best-cave";
|
|
3
|
-
export declare const inject: string[];
|
|
4
|
-
export declare const usage = "\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #4a6ee0;\">\uD83D\uDCCC \u63D2\u4EF6\u8BF4\u660E</h2>\n <p>\uD83D\uDCD6 <strong>\u4F7F\u7528\u6587\u6863</strong>\uFF1A\u8BF7\u70B9\u51FB\u5DE6\u4E0A\u89D2\u7684 <strong>\u63D2\u4EF6\u4E3B\u9875</strong> \u67E5\u770B\u63D2\u4EF6\u4F7F\u7528\u6587\u6863</p>\n <p>\uD83D\uDD0D <strong>\u66F4\u591A\u63D2\u4EF6</strong>\uFF1A\u53EF\u8BBF\u95EE <a href=\"https://github.com/YisRime\" style=\"color:#4a6ee0;text-decoration:none;\">\u82E1\u6DDE\u7684 GitHub</a> \u67E5\u770B\u672C\u4EBA\u7684\u6240\u6709\u63D2\u4EF6</p>\n</div>\n<div style=\"border-radius: 10px; border: 1px solid #ddd; padding: 16px; margin-bottom: 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n <h2 style=\"margin-top: 0; color: #e0574a;\">\u2764\uFE0F \u652F\u6301\u4E0E\u53CD\u9988</h2>\n <p>\uD83C\uDF1F \u559C\u6B22\u8FD9\u4E2A\u63D2\u4EF6\uFF1F\u8BF7\u5728 <a href=\"https://github.com/YisRime\" style=\"color:#e0574a;text-decoration:none;\">GitHub</a> \u4E0A\u7ED9\u6211\u4E00\u4E2A Star\uFF01</p>\n <p>\uD83D\uDC1B \u9047\u5230\u95EE\u9898\uFF1F\u8BF7\u901A\u8FC7 <strong>Issues</strong> \u63D0\u4EA4\u53CD\u9988\uFF0C\u6216\u52A0\u5165 QQ \u7FA4 <a href=\"https://qm.qq.com/q/PdLMx9Jowq\" style=\"color:#e0574a;text-decoration:none;\"><strong>855571375</strong></a> \u8FDB\u884C\u4EA4\u6D41</p>\n</div>\n";
|
|
5
|
-
/**
|
|
6
|
-
* @description 存储在数据库中的单个消息元素。
|
|
7
|
-
*/
|
|
8
|
-
export interface StoredElement {
|
|
9
|
-
type: 'text' | 'image' | 'video' | 'audio' | 'file';
|
|
10
|
-
content?: string;
|
|
11
|
-
file?: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @description 数据库 `cave` 表的完整对象模型。
|
|
15
|
-
*/
|
|
16
|
-
export interface CaveObject {
|
|
17
|
-
id: number;
|
|
18
|
-
elements: StoredElement[];
|
|
19
|
-
channelId: string;
|
|
20
|
-
userId: string;
|
|
21
|
-
userName: string;
|
|
22
|
-
status: 'active' | 'delete' | 'pending' | 'preload';
|
|
23
|
-
time: Date;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* @description 数据库 `cave_hash` 表的完整对象模型。
|
|
27
|
-
*/
|
|
28
|
-
export interface CaveHashObject {
|
|
29
|
-
cave: number;
|
|
30
|
-
hash: string;
|
|
31
|
-
type: 'text' | 'image';
|
|
32
|
-
subType: 'shingle' | 'pHash' | 'subImage';
|
|
33
|
-
}
|
|
34
|
-
declare module 'koishi' {
|
|
35
|
-
interface Tables {
|
|
36
|
-
cave: CaveObject;
|
|
37
|
-
cave_hash: CaveHashObject;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export interface Config {
|
|
41
|
-
coolDown: number;
|
|
42
|
-
perChannel: boolean;
|
|
43
|
-
adminChannel: string;
|
|
44
|
-
enableProfile: boolean;
|
|
45
|
-
enableIO: boolean;
|
|
46
|
-
enableReview: boolean;
|
|
47
|
-
caveFormat: string;
|
|
48
|
-
enableSimilarity: boolean;
|
|
49
|
-
textThreshold: number;
|
|
50
|
-
imageThreshold: number;
|
|
51
|
-
localPath?: string;
|
|
52
|
-
enableS3: boolean;
|
|
53
|
-
endpoint?: string;
|
|
54
|
-
region?: string;
|
|
55
|
-
accessKeyId?: string;
|
|
56
|
-
secretAccessKey?: string;
|
|
57
|
-
bucket?: string;
|
|
58
|
-
publicUrl?: string;
|
|
59
|
-
}
|
|
60
|
-
export declare const Config: Schema<Config>;
|
|
61
|
-
export declare function apply(ctx: Context, config: Config): void;
|