koishi-plugin-best-cave 2.7.15 → 2.7.16

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/index.js CHANGED
@@ -1144,23 +1144,17 @@ var AIManager = class {
1144
1144
  * @returns {Promise<number>} 一个 Promise,解析为成功分析和存储的条目数。
1145
1145
  */
1146
1146
  async analyzeAndStore(caves, mediaBuffers) {
1147
- try {
1148
- const mediaMap = mediaBuffers ? new Map(mediaBuffers.map((m) => [m.fileName, m.buffer])) : void 0;
1149
- const results = await this.getAnalyses(caves, mediaMap);
1150
- if (!results?.length) return 0;
1151
- const caveMetaObjects = results.map((res) => ({
1152
- cave: res.cave,
1153
- keywords: res.keywords || [],
1154
- description: res.description || "",
1155
- rating: Math.max(0, Math.min(100, res.rating || 0))
1156
- }));
1157
- await this.ctx.database.upsert("cave_meta", caveMetaObjects);
1158
- return caveMetaObjects.length;
1159
- } catch (error) {
1160
- const caveIds = caves.map((c) => c.id).join(", ");
1161
- this.logger.error(`分析回声洞 (${caveIds}) 出错:`, error);
1162
- throw error;
1163
- }
1147
+ const mediaMap = mediaBuffers ? new Map(mediaBuffers.map((m) => [m.fileName, m.buffer])) : void 0;
1148
+ const results = await this.getAnalyses(caves, mediaMap);
1149
+ if (!results?.length) return 0;
1150
+ const caveMetaObjects = results.map((res) => ({
1151
+ cave: res.cave,
1152
+ keywords: res.keywords || [],
1153
+ description: res.description || "",
1154
+ rating: Math.max(0, Math.min(100, res.rating || 0))
1155
+ }));
1156
+ await this.ctx.database.upsert("cave_meta", caveMetaObjects);
1157
+ return caveMetaObjects.length;
1164
1158
  }
1165
1159
  /**
1166
1160
  * @description 调用 AI 判断两个回声洞内容是否重复或高度相似。
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-best-cave",
3
3
  "description": "功能强大、高度可定制的回声洞。支持丰富的媒体类型、内容查重、人工审核、用户昵称、数据迁移以及本地/S3 双重文件存储后端。",
4
- "version": "2.7.15",
4
+ "version": "2.7.16",
5
5
  "contributors": [
6
6
  "Yis_Rime <yis_rime@outlook.com>"
7
7
  ],
@@ -1,92 +0,0 @@
1
- import { Context, Logger } from 'koishi';
2
- import { Config, CaveObject, StoredElement } from './index';
3
- import { FileManager } from './FileManager';
4
- /**
5
- * @description 定义了数据库 `cave_meta` 表的结构模型。
6
- * @property {number} cave - 关联的回声洞 `id`,作为外键和主键。
7
- * @property {string[]} keywords - AI 从回声洞内容中提取的核心关键词数组。
8
- * @property {string} description - AI 生成的对回声洞内容的简洁摘要或描述。
9
- * @property {number} rating - AI 对内容质量、趣味性或相关性的综合评分,范围为 0 到 100。
10
- */
11
- export interface CaveMetaObject {
12
- cave: number;
13
- keywords: string[];
14
- description: string;
15
- rating: number;
16
- }
17
- declare module 'koishi' {
18
- interface Tables {
19
- cave_meta: CaveMetaObject;
20
- }
21
- }
22
- /**
23
- * @class AIManager
24
- * @description AI 管理器,连接 AI 服务与回声洞功能的核心模块。
25
- */
26
- export declare class AIManager {
27
- private ctx;
28
- private config;
29
- private logger;
30
- private fileManager;
31
- private http;
32
- private requestCount;
33
- private rateLimitResetTime;
34
- /**
35
- * @constructor
36
- * @param {Context} ctx - Koishi 的上下文对象,提供框架核心功能。
37
- * @param {Config} config - 插件的配置对象。
38
- * @param {Logger} logger - 日志记录器实例,用于输出日志。
39
- * @param {FileManager} fileManager - 文件管理器实例,用于处理媒体文件。
40
- */
41
- constructor(ctx: Context, config: Config, logger: Logger, fileManager: FileManager);
42
- /**
43
- * @description 注册所有与 AIManager 功能相关的 Koishi 命令。
44
- * @param {any} cave - Koishi 命令实例,用于挂载子命令。
45
- */
46
- registerCommands(cave: any): void;
47
- /**
48
- * @description 对新提交的内容执行 AI 驱动的查重检查。
49
- * @param {StoredElement[]} newElements - 新提交的内容元素数组。
50
- * @param {{ fileName: string; buffer: Buffer }[]} [mediaBuffers] - 可选的媒体文件缓冲区数组。
51
- * @returns {Promise<{ duplicate: boolean; ids?: number[] }>} 一个 Promise,解析为一个对象,指示内容是否重复以及重复的回声洞 ID 数组(如果存在)。
52
- */
53
- checkForDuplicates(newElements: StoredElement[], mediaBuffers?: {
54
- fileName: string;
55
- buffer: Buffer;
56
- }[]): Promise<{
57
- duplicate: boolean;
58
- ids?: number[];
59
- }>;
60
- /**
61
- * @description 对单个或批量回声洞执行完整的分析和存储流程。
62
- * @param {CaveObject[]} caves - 要分析的回声洞对象数组。
63
- * @param {{ fileName: string; buffer: Buffer }[]} [mediaBuffers] - 可选的媒体文件缓冲区数组,仅在分析新内容时使用。
64
- * @returns {Promise<number>} 一个 Promise,解析为成功分析和存储的条目数。
65
- */
66
- analyzeAndStore(caves: CaveObject[], mediaBuffers?: {
67
- fileName: string;
68
- buffer: Buffer;
69
- }[]): Promise<number>;
70
- /**
71
- * @description 调用 AI 判断两个回声洞内容是否重复或高度相似。
72
- * @param {CaveObject} caveA - 第一个回声洞对象。
73
- * @param {CaveObject} caveB - 第二个回声洞对象。
74
- * @returns {Promise<boolean>} 如果内容相似则返回 true,否则返回 false。
75
- */
76
- private isContentDuplicateAI;
77
- /**
78
- * @description 为一批回声洞准备内容,并向 AI 发送单个请求以获取所有分析结果。
79
- * @param {CaveObject[]} caves - 要分析的回声洞对象数组。
80
- * @param {Map<string, Buffer>} [mediaBufferMap] - 可选的媒体文件名到其缓冲区的映射。
81
- * @returns {Promise<CaveMetaObject[]>} 一个 Promise,解析为 AI 返回的分析结果数组。
82
- */
83
- private getAnalyses;
84
- /**
85
- * @description 封装了向 OpenAI 兼容的 API 发送请求的底层逻辑,并稳健地解析 JSON 响应。
86
- * @param {any[]} messages - 发送给 AI 的消息数组,遵循 OpenAI 格式。
87
- * @param {string} systemPrompt - 系统提示词,用于指导 AI 的行为。
88
- * @returns {Promise<T>} 一个 Promise,解析为从 AI 接收到的、解析后的 JSON 对象。
89
- * @throws {Error} 当 AI 返回空或无效内容时抛出错误。
90
- */
91
- private requestAI;
92
- }
@@ -1,36 +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
- /**
14
- * @constructor
15
- * @param ctx Koishi 上下文,用于数据库操作。
16
- * @param config 插件配置。
17
- * @param fileManager 文件管理器实例。
18
- * @param logger 日志记录器实例。
19
- */
20
- constructor(ctx: Context, config: Config, fileManager: FileManager, logger: Logger);
21
- /**
22
- * @description 注册 `.export` 和 `.import` 子命令。
23
- * @param cave - 主 `cave` 命令实例。
24
- */
25
- registerCommands(cave: any): void;
26
- /**
27
- * @description 导出所有 'active' 状态的回声洞数据到 `cave.json`。
28
- * @returns 描述导出结果的消息字符串。
29
- */
30
- exportData(): Promise<string>;
31
- /**
32
- * @description 从 `cave.json` 文件导入回声洞数据。
33
- * @returns 描述导入结果的消息字符串。
34
- */
35
- importData(): Promise<string>;
36
- }
@@ -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
- }
@@ -1,80 +0,0 @@
1
- import { Context, Logger } from 'koishi';
2
- import { Config } from './index';
3
- import { FileManager } from './FileManager';
4
- /**
5
- * @description 数据库 `cave_hash` 表的完整对象模型。
6
- */
7
- export interface CaveHashObject {
8
- cave: number;
9
- hash: string;
10
- type: 'text' | 'image';
11
- }
12
- /**
13
- * @class HashManager
14
- * @description 负责生成、存储和比较文本与图片的哈希值。
15
- * 实现了基于 Simhash 的文本查重和基于 DCT 感知哈希 (pHash) 的图片查重方案。
16
- */
17
- export declare class HashManager {
18
- private ctx;
19
- private config;
20
- private logger;
21
- private fileManager;
22
- /**
23
- * @constructor
24
- * @param ctx - Koishi 上下文,用于数据库操作。
25
- * @param config - 插件配置,用于获取相似度阈值等。
26
- * @param logger - 日志记录器实例。
27
- * @param fileManager - 文件管理器实例,用于读取图片文件。
28
- */
29
- constructor(ctx: Context, config: Config, logger: Logger, fileManager: FileManager);
30
- /**
31
- * @description 注册与哈希功能相关的 `.hash` 和 `.check` 子命令。
32
- * @param cave - 主 `cave` 命令实例。
33
- */
34
- registerCommands(cave: any): void;
35
- /**
36
- * @description 扫描并修复单个图片 Buffer,移除文件结束符之后的多余数据。
37
- * @param imageBuffer - 原始的图片 Buffer。
38
- * @returns 修复后的图片 Buffer。如果无需修复,则返回原始 Buffer。
39
- */
40
- sanitizeImageBuffer(imageBuffer: Buffer): Buffer;
41
- /**
42
- * @description 执行一维离散余弦变换 (DCT-II) 的方法。
43
- * @param input - 输入的数字数组。
44
- * @returns DCT 变换后的数组。
45
- */
46
- private dct1D;
47
- /**
48
- * @description 执行二维离散余弦变换 (DCT-II) 的方法。
49
- * 通过对行和列分别应用一维 DCT 来实现。
50
- * @param matrix - 输入的 N x N 像素亮度矩阵。
51
- * @returns DCT 变换后的 N x N 系数矩阵。
52
- */
53
- private dct2D;
54
- /**
55
- * @description pHash 算法核心实现,使用 Jimp 和自定义 DCT。
56
- * @param imageBuffer - 图片的 Buffer。
57
- * @returns 64位十六进制 pHash 字符串。
58
- */
59
- generatePHash(imageBuffer: Buffer): Promise<string>;
60
- /**
61
- * @description 计算两个十六进制哈希字符串之间的汉明距离 (不同位的数量)。
62
- * @param hex1 - 第一个哈希。
63
- * @param hex2 - 第二个哈希。
64
- * @returns 汉明距离。
65
- */
66
- calculateHammingDistance(hex1: string, hex2: string): number;
67
- /**
68
- * @description 根据汉明距离计算相似度百分比。
69
- * @param hex1 - 第一个哈希。
70
- * @param hex2 - 第二个哈希。
71
- * @returns 相似度 (0-100)。
72
- */
73
- calculateSimilarity(hex1: string, hex2: string): number;
74
- /**
75
- * @description 为文本生成 64 位 Simhash 字符串。
76
- * @param text - 需要处理的文本。
77
- * @returns 16位十六进制 Simhash 字符串。
78
- */
79
- generateTextSimhash(text: string): string;
80
- }
@@ -1,45 +0,0 @@
1
- import { Context } from 'koishi';
2
- /** 数据库 `cave_user` 表的结构。 */
3
- export interface UserName {
4
- userId: string;
5
- nickname: string;
6
- }
7
- declare module 'koishi' {
8
- interface Tables {
9
- cave_user: UserName;
10
- }
11
- }
12
- /**
13
- * @class NameManager
14
- * @description 负责管理用户在回声洞中的自定义昵称。
15
- */
16
- export declare class NameManager {
17
- private ctx;
18
- /**
19
- * @constructor
20
- * @param ctx - Koishi 上下文,用于初始化数据库模型。
21
- */
22
- constructor(ctx: Context);
23
- /**
24
- * @description 注册 `.name` 子命令,用于管理用户昵称。
25
- * @param cave - 主 `cave` 命令实例。
26
- */
27
- registerCommands(cave: any): void;
28
- /**
29
- * @description 设置或更新指定用户的昵称。
30
- * @param userId - 目标用户的 ID。
31
- * @param nickname - 要设置的新昵称。
32
- */
33
- setNickname(userId: string, nickname: string): Promise<void>;
34
- /**
35
- * @description 获取指定用户的昵称。
36
- * @param userId - 目标用户的 ID。
37
- * @returns 用户的昵称字符串或 null。
38
- */
39
- getNickname(userId: string): Promise<string | null>;
40
- /**
41
- * @description 清除指定用户的昵称设置。
42
- * @param userId - 目标用户的 ID。
43
- */
44
- clearNickname(userId: string): Promise<void>;
45
- }
@@ -1,32 +0,0 @@
1
- import { Context, Logger } from 'koishi';
2
- import { CaveObject, Config } from './index';
3
- import { FileManager } from './FileManager';
4
- /**
5
- * @class PendManager
6
- * @description 负责处理回声洞的审核流程,处理新洞的提交、审核通知和审核操作。
7
- */
8
- export declare class PendManager {
9
- private ctx;
10
- private config;
11
- private fileManager;
12
- private logger;
13
- private reusableIds;
14
- /**
15
- * @param ctx Koishi 上下文。
16
- * @param config 插件配置。
17
- * @param fileManager 文件管理器实例。
18
- * @param logger 日志记录器实例。
19
- * @param reusableIds 可复用 ID 的内存缓存。
20
- */
21
- constructor(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, reusableIds: Set<number>);
22
- /**
23
- * @description 注册与审核相关的子命令。
24
- * @param cave - 主 `cave` 命令实例。
25
- */
26
- registerCommands(cave: any): void;
27
- /**
28
- * @description 将新回声洞提交到管理群组以供审核。
29
- * @param cave 新创建的、状态为 'pending' 的回声洞对象。
30
- */
31
- sendForPend(cave: CaveObject): Promise<void>;
32
- }
package/lib/Utils.d.ts DELETED
@@ -1,91 +0,0 @@
1
- import { Context, h, Logger, Session } from 'koishi';
2
- import { CaveObject, Config, StoredElement } from './index';
3
- import { FileManager } from './FileManager';
4
- import { HashManager, CaveHashObject } from './HashManager';
5
- /**
6
- * @description 构建一条用于发送的完整回声洞消息,处理不同存储后端的资源链接。
7
- * @param cave 回声洞对象。
8
- * @param config 插件配置。
9
- * @param fileManager 文件管理器实例。
10
- * @param logger 日志记录器实例。
11
- * @param platform 目标平台名称 (e.g., 'onebot')。
12
- * @param prefix 可选的消息前缀 (e.g., '已删除', '待审核')。
13
- * @returns 包含多条消息的数组,每条消息是一个 (string | h)[] 数组。
14
- */
15
- export declare function buildCaveMessage(cave: CaveObject, config: Config, fileManager: FileManager, logger: Logger, platform?: string, prefix?: string): Promise<(string | h)[][]>;
16
- /**
17
- * @description 清理数据库中标记为 'delete' 状态的回声洞及其关联文件和哈希。
18
- * @param ctx Koishi 上下文。
19
- * @param fileManager 文件管理器实例。
20
- * @param logger 日志记录器实例。
21
- * @param reusableIds 可复用 ID 的内存缓存。
22
- */
23
- export declare function cleanupPendingDeletions(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, reusableIds: Set<number>): Promise<void>;
24
- /**
25
- * @description 根据配置和会话,生成数据库查询的范围条件。
26
- * @param session 当前会话。
27
- * @param config 插件配置。
28
- * @param includeStatus 是否包含 status: 'active' 条件,默认为 true。
29
- * @returns 数据库查询条件对象。
30
- */
31
- export declare function getScopeQuery(session: Session, config: Config, includeStatus?: boolean): object;
32
- /**
33
- * @description 获取下一个可用的回声洞 ID,采用“回收ID > 扫描空缺 > 最大ID+1”策略。
34
- * @param ctx Koishi 上下文。
35
- * @param reusableIds 可复用 ID 的内存缓存。
36
- * @returns 可用的新 ID。
37
- */
38
- export declare function getNextCaveId(ctx: Context, reusableIds: Set<number>): Promise<number>;
39
- /**
40
- * @description 解析消息元素,分离出文本和待下载的媒体文件。
41
- * @param sourceElements 原始的 Koishi 消息元素数组。
42
- * @param newId 这条回声洞的新 ID。
43
- * @param session 触发操作的会话。
44
- * @param config 插件配置。
45
- * @param logger 日志实例。
46
- * @param creationTime 统一的创建时间戳,用于生成文件名。
47
- * @returns 包含数据库元素和待保存媒体列表的对象。
48
- */
49
- export declare function processMessageElements(sourceElements: h[], newId: number, session: Session, creationTime: Date): Promise<{
50
- finalElementsForDb: StoredElement[];
51
- mediaToSave: {
52
- sourceUrl: string;
53
- fileName: string;
54
- }[];
55
- }>;
56
- /**
57
- * @description 执行文本 (Simhash) 和图片 (pHash) 相似度查重。
58
- * @returns 一个对象,指示是否发现重复项;如果未发现,则返回生成的哈希。
59
- */
60
- export declare function performSimilarityChecks(ctx: Context, config: Config, hashManager: HashManager, logger: Logger, finalElementsForDb: StoredElement[], downloadedMedia: {
61
- fileName: string;
62
- buffer: Buffer;
63
- }[]): Promise<{
64
- duplicate: boolean;
65
- message?: string;
66
- textHashesToStore?: Omit<CaveHashObject, 'cave'>[];
67
- imageHashesToStore?: Omit<CaveHashObject, 'cave'>[];
68
- }>;
69
- /**
70
- * @description 异步处理文件上传,并在成功后更新回声洞状态。
71
- * @param ctx - Koishi 上下文。
72
- * @param config - 插件配置。
73
- * @param fileManager - FileManager 实例,用于保存文件。
74
- * @param logger - 日志记录器实例。
75
- * @param cave - 刚刚在数据库中创建的 `preload` 状态的回声洞对象。
76
- * @param downloadedMedia - 需要保存的媒体文件及其 Buffer。
77
- * @param reusableIds - 可复用 ID 的内存缓存。
78
- * @param session - 触发此操作的用户会话。
79
- * @returns 成功则返回最终状态 ('pending' or 'active'),失败则返回 'delete'。
80
- */
81
- export declare function handleFileUploads(ctx: Context, config: Config, fileManager: FileManager, logger: Logger, cave: CaveObject, downloadedMedia: {
82
- fileName: string;
83
- buffer: Buffer;
84
- }[], reusableIds: Set<number>, needsReview: boolean): Promise<'pending' | 'active'>;
85
- /**
86
- * @description 校验会话是否来自指定的管理群组。
87
- * @param session 当前会话。
88
- * @param config 插件配置。
89
- * @returns 如果校验不通过,返回错误信息字符串;如果通过,返回 null。
90
- */
91
- export declare function requireAdmin(session: Session, config: Config): string | null;
package/lib/index.d.ts DELETED
@@ -1,67 +0,0 @@
1
- import { Context, Schema } from 'koishi';
2
- import { CaveHashObject } from './HashManager';
3
- import { CaveMetaObject } from './AIManager';
4
- export declare const name = "best-cave";
5
- export declare const inject: string[];
6
- 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";
7
- /**
8
- * @description 存储在合并转发中的单个节点的数据结构。
9
- */
10
- export interface ForwardNode {
11
- userId: string;
12
- userName: string;
13
- elements: StoredElement[];
14
- }
15
- /**
16
- * @description 存储在数据库中的单个消息元素。
17
- */
18
- export interface StoredElement {
19
- type: 'text' | 'image' | 'video' | 'audio' | 'file' | 'at' | 'forward' | 'reply' | 'face';
20
- content?: string | ForwardNode[];
21
- file?: string;
22
- }
23
- /**
24
- * @description 数据库 `cave` 表的完整对象模型。
25
- */
26
- export interface CaveObject {
27
- id: number;
28
- elements: StoredElement[];
29
- channelId: string;
30
- userId: string;
31
- userName: string;
32
- status: 'active' | 'delete' | 'pending' | 'preload';
33
- time: Date;
34
- }
35
- declare module 'koishi' {
36
- interface Tables {
37
- cave: CaveObject;
38
- cave_hash: CaveHashObject;
39
- cave_meta: CaveMetaObject;
40
- }
41
- }
42
- export interface Config {
43
- perChannel: boolean;
44
- adminChannel: string;
45
- enableName: boolean;
46
- enableIO: boolean;
47
- enablePend: boolean;
48
- caveFormat: string;
49
- enableSimilarity: boolean;
50
- textThreshold: number;
51
- imageThreshold: number;
52
- localPath?: string;
53
- enableS3: boolean;
54
- endpoint?: string;
55
- region?: string;
56
- accessKeyId?: string;
57
- secretAccessKey?: string;
58
- bucket?: string;
59
- publicUrl?: string;
60
- enableAI: boolean;
61
- aiEndpoint?: string;
62
- aiApiKey?: string;
63
- aiModel?: string;
64
- aiRPM?: number;
65
- }
66
- export declare const Config: Schema<Config>;
67
- export declare function apply(ctx: Context, config: Config): void;