koishi-plugin-best-cave 1.4.1 → 1.5.1
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.d.ts +4 -3
- package/lib/index.js +717 -438
- package/lib/utils/AuditManage.d.ts +43 -0
- package/lib/utils/{ImageHasher.d.ts → ContentHash.d.ts} +7 -1
- package/lib/utils/HashManage.d.ts +108 -0
- package/lib/utils/mediaUtils.d.ts +0 -0
- package/package.json +3 -3
- package/readme.md +16 -4
- package/lib/utils/HashStorage.d.ts +0 -92
- /package/lib/utils/{fileHandler.d.ts → FileHandle.d.ts} +0 -0
- /package/lib/utils/{idManager.d.ts → IdManage.d.ts} +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Context } from 'koishi';
|
|
2
|
+
import { Config } from '../index';
|
|
3
|
+
import { IdManager } from './IdManage';
|
|
4
|
+
export interface CaveObject {
|
|
5
|
+
cave_id: number;
|
|
6
|
+
elements: Element[];
|
|
7
|
+
contributor_number: string;
|
|
8
|
+
contributor_name: string;
|
|
9
|
+
}
|
|
10
|
+
interface BaseElement {
|
|
11
|
+
type: 'text' | 'img' | 'video';
|
|
12
|
+
index: number;
|
|
13
|
+
}
|
|
14
|
+
interface TextElement extends BaseElement {
|
|
15
|
+
type: 'text';
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
interface MediaElement extends BaseElement {
|
|
19
|
+
type: 'img' | 'video';
|
|
20
|
+
file?: string;
|
|
21
|
+
fileName?: string;
|
|
22
|
+
fileSize?: string;
|
|
23
|
+
filePath?: string;
|
|
24
|
+
}
|
|
25
|
+
type Element = TextElement | MediaElement;
|
|
26
|
+
export interface PendingCave extends CaveObject {
|
|
27
|
+
}
|
|
28
|
+
export declare class AuditManager {
|
|
29
|
+
private ctx;
|
|
30
|
+
private config;
|
|
31
|
+
private caveDir;
|
|
32
|
+
private idManager;
|
|
33
|
+
private logger;
|
|
34
|
+
constructor(ctx: Context, config: Config, caveDir: string, idManager: IdManager);
|
|
35
|
+
processAudit(pendingData: PendingCave[], isApprove: boolean, caveFilePath: string, resourceDir: string, pendingFilePath: string, session: any, targetId?: number): Promise<string>;
|
|
36
|
+
private handleSingleAudit;
|
|
37
|
+
private handleBatchAudit;
|
|
38
|
+
sendAuditMessage(cave: PendingCave, content: string, session: any): Promise<void>;
|
|
39
|
+
private deleteMediaFiles;
|
|
40
|
+
private cleanElementsForSave;
|
|
41
|
+
private sendMessage;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
@@ -3,7 +3,7 @@ import { Buffer } from 'buffer';
|
|
|
3
3
|
* 图片哈希计算工具类
|
|
4
4
|
* 使用 DCT(离散余弦变换)方法计算图片的感知哈希值,可用于图片相似度比较
|
|
5
5
|
*/
|
|
6
|
-
export declare class
|
|
6
|
+
export declare class ContentHasher {
|
|
7
7
|
/**
|
|
8
8
|
* 计算图片的感知哈希值
|
|
9
9
|
* @param imageBuffer - 图片的二进制数据
|
|
@@ -71,6 +71,12 @@ export declare class ImageHasher {
|
|
|
71
71
|
* @returns 返回0-1之间的相似度值,1表示完全相同,0表示完全不同
|
|
72
72
|
*/
|
|
73
73
|
static calculateSimilarity(hash1: string, hash2: string): number;
|
|
74
|
+
/**
|
|
75
|
+
* 计算文本的哈希值
|
|
76
|
+
* @param text - 输入文本
|
|
77
|
+
* @returns 文本的哈希值(36进制字符串)
|
|
78
|
+
*/
|
|
79
|
+
static calculateTextHash(text: string): string;
|
|
74
80
|
/**
|
|
75
81
|
* 批量比较一个新哈希值与多个已存在哈希值的相似度
|
|
76
82
|
* @param newHash - 新的哈希值
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 哈希存储状态类型
|
|
3
|
+
*/
|
|
4
|
+
interface HashStorageStatus {
|
|
5
|
+
lastUpdated: string;
|
|
6
|
+
entries: Array<{
|
|
7
|
+
caveId: number;
|
|
8
|
+
imageHashes: string[];
|
|
9
|
+
textHashes: string[];
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 图片哈希值存储管理类
|
|
14
|
+
* 负责管理和维护回声洞图片的哈希值
|
|
15
|
+
*/
|
|
16
|
+
export declare class ContentHashManager {
|
|
17
|
+
private readonly caveDir;
|
|
18
|
+
private static readonly HASH_FILE;
|
|
19
|
+
private static readonly CAVE_FILE;
|
|
20
|
+
private static readonly BATCH_SIZE;
|
|
21
|
+
private imageHashes;
|
|
22
|
+
private textHashes;
|
|
23
|
+
private initialized;
|
|
24
|
+
/**
|
|
25
|
+
* 初始化HashManager实例
|
|
26
|
+
* @param caveDir 回声洞数据目录路径
|
|
27
|
+
*/
|
|
28
|
+
constructor(caveDir: string);
|
|
29
|
+
private get filePath();
|
|
30
|
+
private get resourceDir();
|
|
31
|
+
private get caveFilePath();
|
|
32
|
+
/**
|
|
33
|
+
* 初始化哈希存储
|
|
34
|
+
* 读取现有哈希数据或重新构建哈希值
|
|
35
|
+
* @throws 初始化失败时抛出错误
|
|
36
|
+
*/
|
|
37
|
+
initialize(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* 获取当前哈希存储状态
|
|
40
|
+
* @returns 包含最后更新时间和所有条目的状态对象
|
|
41
|
+
*/
|
|
42
|
+
getStatus(): Promise<HashStorageStatus>;
|
|
43
|
+
/**
|
|
44
|
+
* 更新指定回声洞的图片哈希值
|
|
45
|
+
* @param caveId 回声洞ID
|
|
46
|
+
* @param content 图片buffer数组
|
|
47
|
+
*/
|
|
48
|
+
updateCaveContent(caveId: number, content: {
|
|
49
|
+
images?: Buffer[];
|
|
50
|
+
texts?: string[];
|
|
51
|
+
}): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* 更新所有回声洞的哈希值
|
|
54
|
+
* @param isInitialBuild 是否为初始构建
|
|
55
|
+
*/
|
|
56
|
+
updateAllCaves(isInitialBuild?: boolean): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* 查找重复的图片
|
|
59
|
+
* @param content 待查找的图片buffer数组
|
|
60
|
+
* @param thresholds 相似度阈值
|
|
61
|
+
* @returns 匹配结果数组,包含索引、回声洞ID和相似度
|
|
62
|
+
*/
|
|
63
|
+
findDuplicates(content: {
|
|
64
|
+
images?: Buffer[];
|
|
65
|
+
texts?: string[];
|
|
66
|
+
}, thresholds: {
|
|
67
|
+
image: number;
|
|
68
|
+
text: number;
|
|
69
|
+
}): Promise<Array<{
|
|
70
|
+
type: 'image' | 'text';
|
|
71
|
+
index: number;
|
|
72
|
+
caveId: number;
|
|
73
|
+
similarity: number;
|
|
74
|
+
} | null>>;
|
|
75
|
+
private findTextDuplicates;
|
|
76
|
+
private calculateTextSimilarity;
|
|
77
|
+
private findImageDuplicates;
|
|
78
|
+
/**
|
|
79
|
+
* 加载回声洞数据
|
|
80
|
+
* @returns 回声洞数据数组
|
|
81
|
+
* @private
|
|
82
|
+
*/
|
|
83
|
+
private loadCaveData;
|
|
84
|
+
/**
|
|
85
|
+
* 保存哈希数据到文件
|
|
86
|
+
* @private
|
|
87
|
+
*/
|
|
88
|
+
private saveContentHashes;
|
|
89
|
+
/**
|
|
90
|
+
* 构建初始哈希数据
|
|
91
|
+
* @private
|
|
92
|
+
*/
|
|
93
|
+
private buildInitialHashes;
|
|
94
|
+
/**
|
|
95
|
+
* 更新缺失的哈希值
|
|
96
|
+
* @private
|
|
97
|
+
*/
|
|
98
|
+
private updateMissingHashes;
|
|
99
|
+
/**
|
|
100
|
+
* 批量处理数组项
|
|
101
|
+
* @param items 待处理项数组
|
|
102
|
+
* @param processor 处理函数
|
|
103
|
+
* @param batchSize 批处理大小
|
|
104
|
+
* @private
|
|
105
|
+
*/
|
|
106
|
+
private processBatch;
|
|
107
|
+
}
|
|
108
|
+
export {};
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-best-cave",
|
|
3
3
|
"description": "最好的 cave 插件,可开关的审核系统,可引用添加,支持图文混合内容,可查阅投稿列表,完美复刻你的 .cave 体验!",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.5.1",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Yis_Rime <yis_rime@outlook.com>"
|
|
7
7
|
],
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"devDependencies": {},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"koishi": "^4.18.3",
|
|
29
|
-
"sharp": "^0.
|
|
29
|
+
"sharp": "^0.33.5",
|
|
30
30
|
"koishi-plugin-adapter-onebot": "^6.1.3"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"sharp": "^0.
|
|
33
|
+
"sharp": "^0.33.5",
|
|
34
34
|
"koishi-plugin-adapter-onebot": "^6.1.3"
|
|
35
35
|
}
|
|
36
36
|
}
|
package/readme.md
CHANGED
|
@@ -15,6 +15,15 @@
|
|
|
15
15
|
- 引用消息自动解析和保存
|
|
16
16
|
- 支持引用已有内容的布局
|
|
17
17
|
|
|
18
|
+
- **重复检测**
|
|
19
|
+
- 独立的文本与图片查重开关
|
|
20
|
+
- 可配置的文本相似度阈值
|
|
21
|
+
- 可配置的图片相似度阈值
|
|
22
|
+
- 基于感知哈希的图片查重
|
|
23
|
+
- 基于MD5的精确查重
|
|
24
|
+
- 精确重复自动拒绝
|
|
25
|
+
- 相似内容提示预览
|
|
26
|
+
|
|
18
27
|
- **审核机制**
|
|
19
28
|
- 可配置的审核开关与多级权限
|
|
20
29
|
- 完整的黑白名单系统(支持用户/群组/频道)
|
|
@@ -27,9 +36,9 @@
|
|
|
27
36
|
- 智能处理多种类型媒体链接
|
|
28
37
|
- 支持本地图片上传和URL引用
|
|
29
38
|
- 自动文件大小检查与限制
|
|
30
|
-
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
39
|
+
- 视频内容自动单独发送
|
|
40
|
+
- MD5文件名防重复
|
|
41
|
+
- 自动清理无效媒体
|
|
33
42
|
|
|
34
43
|
- **使用体验**
|
|
35
44
|
- 基于群组的调用冷却机制
|
|
@@ -64,7 +73,10 @@
|
|
|
64
73
|
| number | number | 60 | 冷却时间(秒) |
|
|
65
74
|
| enableAudit | boolean | false | 是否启用审核 |
|
|
66
75
|
| imageMaxSize | number | 4 | 图片大小限制(MB) |
|
|
67
|
-
|
|
|
76
|
+
| enableImageDuplicate | boolean | true | 是否启用图片查重 |
|
|
77
|
+
| imageDuplicateThreshold | number | 0.8 | 图片查重阈值(0-1) |
|
|
78
|
+
| enableTextDuplicate | boolean | true | 是否启用文本查重 |
|
|
79
|
+
| textDuplicateThreshold | number | 0.9 | 文本查重阈值(0-1) |
|
|
68
80
|
| allowVideo | boolean | true | 是否允许视频 |
|
|
69
81
|
| videoMaxSize | number | 16 | 视频大小限制(MB) |
|
|
70
82
|
| enablePagination | boolean | false | 是否启用分页 |
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 哈希存储管理类
|
|
3
|
-
* @class HashStorage
|
|
4
|
-
*/
|
|
5
|
-
export declare class HashStorage {
|
|
6
|
-
private readonly caveDir;
|
|
7
|
-
private readonly filePath;
|
|
8
|
-
private readonly resourceDir;
|
|
9
|
-
private readonly caveFilePath;
|
|
10
|
-
private imageHashes;
|
|
11
|
-
private textHashes;
|
|
12
|
-
private initialized;
|
|
13
|
-
/**
|
|
14
|
-
* 创建哈希存储实例
|
|
15
|
-
* @param caveDir - 回声洞数据目录路径
|
|
16
|
-
*/
|
|
17
|
-
constructor(caveDir: string);
|
|
18
|
-
/**
|
|
19
|
-
* 初始化哈希存储
|
|
20
|
-
* @throws 初始化失败时抛出错误
|
|
21
|
-
*/
|
|
22
|
-
initialize(): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* 加载哈希数据
|
|
25
|
-
* @param data - 要加载的哈希数据
|
|
26
|
-
* @private
|
|
27
|
-
*/
|
|
28
|
-
private loadHashData;
|
|
29
|
-
/**
|
|
30
|
-
* 更新指定回声洞的哈希值
|
|
31
|
-
* @param caveId - 回声洞ID
|
|
32
|
-
* @param type - 哈希类型(图像或文本)
|
|
33
|
-
* @param content - 要计算哈希的内容
|
|
34
|
-
*/
|
|
35
|
-
updateHash(caveId: number, type: 'image' | 'text', content: Buffer | string): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* 查找重复项
|
|
38
|
-
* @param type - 查找类型(图像或文本)
|
|
39
|
-
* @param hashes - 要查找的哈希值数组
|
|
40
|
-
* @param threshold - 相似度阈值,默认为1
|
|
41
|
-
* @returns 匹配结果数组
|
|
42
|
-
*/
|
|
43
|
-
findDuplicates(type: 'image' | 'text', hashes: string[], threshold?: number): Promise<Array<{
|
|
44
|
-
index: number;
|
|
45
|
-
caveId: number;
|
|
46
|
-
similarity: number;
|
|
47
|
-
} | null>>;
|
|
48
|
-
/**
|
|
49
|
-
* 清除指定回声洞的所有哈希值
|
|
50
|
-
* @param caveId - 回声洞ID
|
|
51
|
-
*/
|
|
52
|
-
clearHashes(caveId: number): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* 构建初始哈希值
|
|
55
|
-
* @private
|
|
56
|
-
*/
|
|
57
|
-
private buildInitialHashes;
|
|
58
|
-
/**
|
|
59
|
-
* 更新缺失的哈希值
|
|
60
|
-
* @private
|
|
61
|
-
*/
|
|
62
|
-
private updateMissingHashes;
|
|
63
|
-
/**
|
|
64
|
-
* 处理单个回声洞的哈希值
|
|
65
|
-
* @param cave - 回声洞数据
|
|
66
|
-
* @private
|
|
67
|
-
*/
|
|
68
|
-
private processCaveHashes;
|
|
69
|
-
private processCaveTextHashes;
|
|
70
|
-
/**
|
|
71
|
-
* 保存哈希数据到文件
|
|
72
|
-
* @private
|
|
73
|
-
*/
|
|
74
|
-
private saveHashes;
|
|
75
|
-
/**
|
|
76
|
-
* 加载回声洞数据
|
|
77
|
-
* @returns 回声洞数据数组
|
|
78
|
-
* @private
|
|
79
|
-
*/
|
|
80
|
-
private loadCaveData;
|
|
81
|
-
/**
|
|
82
|
-
* 计算文本的哈希值
|
|
83
|
-
* @param text - 要计算哈希的文本
|
|
84
|
-
* @returns MD5哈希值
|
|
85
|
-
*/
|
|
86
|
-
static hashText(text: string): string;
|
|
87
|
-
/**
|
|
88
|
-
* 获取存储统计数据
|
|
89
|
-
* @private
|
|
90
|
-
*/
|
|
91
|
-
private getStorageStats;
|
|
92
|
-
}
|
|
File without changes
|
|
File without changes
|