@q78kg/koishi-plugin-text-censor 1.0.2 → 1.0.4-beta.10

Sign up to get free protection for your applications and to get access to all the features.
package/lib/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Context, Schema } from 'koishi';
2
2
  export declare const name = "text-censor";
3
3
  export interface Config {
4
- filename: string;
4
+ textDatabase: [string][];
5
5
  removeWords: boolean;
6
6
  transformToUpper: boolean;
7
7
  }
package/lib/index.js CHANGED
@@ -38,41 +38,61 @@ module.exports = __toCommonJS(src_exports);
38
38
  var import_koishi = require("koishi");
39
39
  var import_node_fs = require("node:fs");
40
40
  var import_node_path = require("node:path");
41
- var import_censor = __toESM(require("@koishijs/censor"));
42
41
  var import_mint_filter = __toESM(require("mint-filter"));
42
+ var import_censor = __toESM(require("@koishijs/censor"));
43
43
  var name = "text-censor";
44
- var Config = import_koishi.Schema.object({
45
- filename: import_koishi.Schema.string().description("存储敏感词的文件路径。").default("data/censor.txt"),
46
- removeWords: import_koishi.Schema.boolean().description("是否直接删除敏感词。").default(false),
47
- // 默认不删除敏感词
48
- transformToUpper: import_koishi.Schema.boolean().description("是否将字符转换为大写。").default(false)
49
- // 默认不转换字符为大写
50
- });
44
+ var Config = import_koishi.Schema.intersect([
45
+ import_koishi.Schema.object({
46
+ textDatabase: import_koishi.Schema.array(
47
+ import_koishi.Schema.tuple([
48
+ import_koishi.Schema.string().default("data/text-censor/censor.txt")
49
+ ])
50
+ ).description("敏感词库的文件路径。").default([["data/text-censor/censor.txt"]])
51
+ }),
52
+ import_koishi.Schema.object({
53
+ removeWords: import_koishi.Schema.boolean().description("是否直接删除敏感词。").default(false),
54
+ transformToUpper: import_koishi.Schema.boolean().description("是否将字符转换为大写。").default(false)
55
+ })
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ ]);
51
58
  function apply(ctx, config) {
52
- const filename = (0, import_node_path.resolve)(ctx.baseDir, config.filename);
53
- if (!(0, import_node_fs.existsSync)(filename)) {
54
- ctx.logger.warn("dictionary file not found");
59
+ let words = [];
60
+ for (const [file] of config.textDatabase) {
61
+ const filePath = (0, import_node_path.resolve)(ctx.baseDir, file);
62
+ if (!(0, import_node_fs.existsSync)(filePath)) {
63
+ ctx.logger.warn(
64
+ `dictionary file not found: ${filePath}, creating a new one.`
65
+ );
66
+ const dirPath = (0, import_node_path.dirname)(filePath);
67
+ if (!(0, import_node_fs.existsSync)(dirPath)) {
68
+ (0, import_node_fs.mkdirSync)(dirPath, { recursive: true });
69
+ }
70
+ (0, import_node_fs.writeFileSync)(filePath, "");
71
+ }
72
+ const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
73
+ const fileWords = source.split("\n").map((word) => word.trim()).filter(
74
+ (word) => word && !word.startsWith("//") && !word.startsWith("#")
75
+ );
76
+ words = words.concat(fileWords);
77
+ }
78
+ if (words.length === 0) {
79
+ ctx.logger.warn("no sensitive words found");
55
80
  return;
56
81
  }
57
- const source = (0, import_node_fs.readFileSync)(filename, "utf8");
58
- const words = source.split("\n").map((word) => word.trim()).filter((word) => word && !word.startsWith("//") && !word.startsWith("#"));
59
82
  const mintOptions = {
60
83
  transform: config.transformToUpper ? "capital" : "none"
61
- // 这里我们将值设置为可能的类型
62
84
  };
63
85
  const filter = new import_mint_filter.default(words, mintOptions);
64
86
  ctx.plugin(import_censor.default);
65
87
  ctx.get("censor").intercept({
66
88
  async text(attrs) {
67
- const result = await filter.filter(attrs.content);
89
+ const originalText = attrs.content;
90
+ const result = await filter.filter(originalText);
68
91
  if (typeof result.text !== "string")
69
92
  return [];
70
93
  if (config.removeWords) {
71
- const filteredText = words.reduce((text, word) => {
72
- const regex = new RegExp(`\\b${word}\\b`, "gi");
73
- return text.replace(regex, "");
74
- }, result.text);
75
- return [filteredText.trim()];
94
+ const cleanedText = result.text.replace(/\*/g, "");
95
+ return [cleanedText.trim()];
76
96
  } else {
77
97
  return [result.text];
78
98
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@q78kg/koishi-plugin-text-censor",
3
3
  "description": "A text censor provider for Koishi",
4
- "version": "1.0.2",
4
+ "version": "1.0.4-beta.10",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [