node-karin 0.12.0 → 0.12.2-5.pr.206.027f2f2

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.
Files changed (254) hide show
  1. package/CHANGELOG.md +1029 -0
  2. package/default/comment/config.json +34 -0
  3. package/default/comment/friendDirect.json +10 -0
  4. package/default/comment/groupGuild.json +11 -0
  5. package/default/comment/server.json +17 -0
  6. package/default/config/adapter.json +28 -0
  7. package/default/config/config.json +47 -0
  8. package/default/config/groups.json +47 -0
  9. package/default/config/groups.yaml +70 -0
  10. package/default/config/pm2.json +16 -0
  11. package/default/config/privates.json +23 -0
  12. package/default/config/privates.yaml +31 -0
  13. package/default/config/redis.json +10 -0
  14. package/default/config/render.json +19 -0
  15. package/default/view/group.yaml +73 -0
  16. package/dist/index.d.ts +9869 -0
  17. package/dist/index.js +12643 -0
  18. package/dist/module/art-template.cjs +11 -0
  19. package/dist/module/art-template.d.ts +1 -0
  20. package/dist/module/axios.cjs +22 -0
  21. package/dist/module/axios.d.ts +2 -0
  22. package/dist/module/chalk.cjs +22 -0
  23. package/dist/module/chalk.d.ts +2 -0
  24. package/dist/module/chokidar.cjs +22 -0
  25. package/dist/module/chokidar.d.ts +2 -0
  26. package/dist/module/commander.cjs +35 -0
  27. package/dist/module/commander.d.ts +3 -0
  28. package/dist/module/commander.js +3 -0
  29. package/dist/module/dotenv.cjs +22 -0
  30. package/dist/module/dotenv.d.ts +2 -0
  31. package/dist/module/dotenv.js +2 -0
  32. package/dist/module/express.cjs +112 -0
  33. package/dist/module/express.d.ts +1 -0
  34. package/dist/module/express.js +1 -0
  35. package/dist/module/level.cjs +22 -0
  36. package/dist/module/level.d.ts +2 -0
  37. package/dist/module/lodash.cjs +11 -0
  38. package/dist/module/lodash.d.ts +1 -0
  39. package/dist/module/log4js.cjs +22 -0
  40. package/dist/module/log4js.d.ts +2 -0
  41. package/dist/module/moment.cjs +11 -0
  42. package/dist/module/moment.d.ts +1 -0
  43. package/dist/module/node-schedule.cjs +22 -0
  44. package/dist/module/node-schedule.d.ts +2 -0
  45. package/dist/module/redis.cjs +22 -0
  46. package/dist/module/redis.d.ts +2 -0
  47. package/dist/module/ws.cjs +28 -0
  48. package/dist/module/ws.d.ts +1 -0
  49. package/dist/module/ws.js +1 -0
  50. package/dist/module/yaml.cjs +22 -0
  51. package/dist/module/yaml.d.ts +2 -0
  52. package/dist/root.d.ts +40 -0
  53. package/dist/root.js +44 -0
  54. package/package.json +142 -128
  55. package/LICENSE +0 -674
  56. package/README.md +0 -56
  57. package/config/defSet/App.yaml +0 -42
  58. package/config/defSet/config.yaml +0 -65
  59. package/config/defSet/group.yaml +0 -56
  60. package/config/defSet/pm2.yaml +0 -21
  61. package/config/defSet/redis.yaml +0 -18
  62. package/config/defSet/server.yaml +0 -42
  63. package/config/view/group.yaml +0 -92
  64. package/lib/adapter/index.d.ts +0 -2
  65. package/lib/adapter/index.js +0 -2
  66. package/lib/adapter/input/index.d.ts +0 -78
  67. package/lib/adapter/input/index.js +0 -205
  68. package/lib/adapter/onebot/11/convert.d.ts +0 -12
  69. package/lib/adapter/onebot/11/convert.js +0 -167
  70. package/lib/adapter/onebot/11/event.d.ts +0 -25
  71. package/lib/adapter/onebot/11/event.js +0 -442
  72. package/lib/adapter/onebot/11/index.d.ts +0 -508
  73. package/lib/adapter/onebot/11/index.js +0 -1047
  74. package/lib/cli/index.d.ts +0 -92
  75. package/lib/cli/index.js +0 -307
  76. package/lib/cli/init.d.ts +0 -2
  77. package/lib/cli/init.js +0 -22
  78. package/lib/cli/karin.d.ts +0 -2
  79. package/lib/cli/karin.js +0 -16
  80. package/lib/cli/pkg.d.ts +0 -4
  81. package/lib/cli/pkg.js +0 -14
  82. package/lib/cli/start.d.ts +0 -1
  83. package/lib/cli/start.js +0 -8
  84. package/lib/core/index.d.ts +0 -10
  85. package/lib/core/index.js +0 -10
  86. package/lib/core/init/config.d.ts +0 -43
  87. package/lib/core/init/config.js +0 -201
  88. package/lib/core/init/dir.d.ts +0 -4
  89. package/lib/core/init/dir.js +0 -7
  90. package/lib/core/init/init.d.ts +0 -1
  91. package/lib/core/init/init.js +0 -47
  92. package/lib/core/karin/karin.d.ts +0 -198
  93. package/lib/core/karin/karin.js +0 -226
  94. package/lib/core/listener/listener.d.ts +0 -145
  95. package/lib/core/listener/listener.js +0 -235
  96. package/lib/core/plugin/base.d.ts +0 -156
  97. package/lib/core/plugin/base.js +0 -131
  98. package/lib/core/plugin/loader.d.ts +0 -141
  99. package/lib/core/plugin/loader.js +0 -618
  100. package/lib/core/process/process.d.ts +0 -18
  101. package/lib/core/process/process.js +0 -96
  102. package/lib/core/server/server.d.ts +0 -25
  103. package/lib/core/server/server.js +0 -295
  104. package/lib/db/index.d.ts +0 -2
  105. package/lib/db/index.js +0 -2
  106. package/lib/db/level/level.d.ts +0 -19
  107. package/lib/db/level/level.js +0 -36
  108. package/lib/db/redis/redis.d.ts +0 -2
  109. package/lib/db/redis/redis.js +0 -135
  110. package/lib/db/redis/redis_level.d.ts +0 -112
  111. package/lib/db/redis/redis_level.js +0 -281
  112. package/lib/event/handler/base.d.ts +0 -42
  113. package/lib/event/handler/base.js +0 -200
  114. package/lib/event/handler/message.d.ts +0 -29
  115. package/lib/event/handler/message.js +0 -307
  116. package/lib/event/handler/notice.d.ts +0 -18
  117. package/lib/event/handler/notice.js +0 -214
  118. package/lib/event/handler/request.d.ts +0 -18
  119. package/lib/event/handler/request.js +0 -115
  120. package/lib/event/handler/review.d.ts +0 -55
  121. package/lib/event/handler/review.js +0 -386
  122. package/lib/event/index.d.ts +0 -5
  123. package/lib/event/index.js +0 -5
  124. package/lib/index.d.ts +0 -8
  125. package/lib/index.js +0 -8
  126. package/lib/modules/art-template.d.ts +0 -1
  127. package/lib/modules/axios.d.ts +0 -2
  128. package/lib/modules/chalk.d.ts +0 -2
  129. package/lib/modules/chokidar.d.ts +0 -2
  130. package/lib/modules/commander.d.ts +0 -2
  131. package/lib/modules/commander.js +0 -2
  132. package/lib/modules/express.d.ts +0 -3
  133. package/lib/modules/express.js +0 -3
  134. package/lib/modules/level.d.ts +0 -2
  135. package/lib/modules/lodash.d.ts +0 -1
  136. package/lib/modules/log4js.d.ts +0 -2
  137. package/lib/modules/moment.d.ts +0 -1
  138. package/lib/modules/node-schedule.d.ts +0 -2
  139. package/lib/modules/redis.d.ts +0 -2
  140. package/lib/modules/ws.d.ts +0 -3
  141. package/lib/modules/ws.js +0 -3
  142. package/lib/modules/yaml.d.ts +0 -2
  143. package/lib/modules.d.ts +0 -15
  144. package/lib/modules.js +0 -15
  145. package/lib/render/app.d.ts +0 -56
  146. package/lib/render/app.js +0 -120
  147. package/lib/render/base.d.ts +0 -30
  148. package/lib/render/base.js +0 -69
  149. package/lib/render/client.d.ts +0 -41
  150. package/lib/render/client.js +0 -238
  151. package/lib/render/http.d.ts +0 -19
  152. package/lib/render/http.js +0 -50
  153. package/lib/render/index.d.ts +0 -6
  154. package/lib/render/index.js +0 -6
  155. package/lib/render/server.d.ts +0 -25
  156. package/lib/render/server.js +0 -101
  157. package/lib/render/wormhole.d.ts +0 -1
  158. package/lib/render/wormhole.js +0 -156
  159. package/lib/types/adapter/api.d.ts +0 -399
  160. package/lib/types/adapter/api.js +0 -1
  161. package/lib/types/adapter/base.d.ts +0 -560
  162. package/lib/types/adapter/base.js +0 -1
  163. package/lib/types/config/config.d.ts +0 -379
  164. package/lib/types/config/config.js +0 -1
  165. package/lib/types/element/element.d.ts +0 -565
  166. package/lib/types/element/element.js +0 -1
  167. package/lib/types/element/qqbot.d.ts +0 -123
  168. package/lib/types/element/qqbot.js +0 -1
  169. package/lib/types/event/contact.d.ts +0 -28
  170. package/lib/types/event/contact.js +0 -1
  171. package/lib/types/event/event.d.ts +0 -305
  172. package/lib/types/event/event.js +0 -1
  173. package/lib/types/event/index.d.ts +0 -12
  174. package/lib/types/event/index.js +0 -7
  175. package/lib/types/event/message.d.ts +0 -109
  176. package/lib/types/event/message.js +0 -74
  177. package/lib/types/event/notice.d.ts +0 -513
  178. package/lib/types/event/notice.js +0 -52
  179. package/lib/types/event/reply.d.ts +0 -50
  180. package/lib/types/event/reply.js +0 -1
  181. package/lib/types/event/request.d.ts +0 -126
  182. package/lib/types/event/request.js +0 -52
  183. package/lib/types/event/sender.d.ts +0 -44
  184. package/lib/types/event/sender.js +0 -1
  185. package/lib/types/index.d.ts +0 -13
  186. package/lib/types/index.js +0 -13
  187. package/lib/types/logger/logger.d.ts +0 -110
  188. package/lib/types/logger/logger.js +0 -1
  189. package/lib/types/onebot11/api.d.ts +0 -53
  190. package/lib/types/onebot11/api.js +0 -1
  191. package/lib/types/onebot11/event.d.ts +0 -619
  192. package/lib/types/onebot11/event.js +0 -2
  193. package/lib/types/onebot11/index.d.ts +0 -6
  194. package/lib/types/onebot11/index.js +0 -6
  195. package/lib/types/onebot11/params.d.ts +0 -609
  196. package/lib/types/onebot11/params.js +0 -1
  197. package/lib/types/onebot11/response.d.ts +0 -516
  198. package/lib/types/onebot11/response.js +0 -1
  199. package/lib/types/onebot11/segment.d.ts +0 -269
  200. package/lib/types/onebot11/segment.js +0 -1
  201. package/lib/types/onebot11/sender.d.ts +0 -59
  202. package/lib/types/onebot11/sender.js +0 -1
  203. package/lib/types/plugin/app.d.ts +0 -71
  204. package/lib/types/plugin/app.js +0 -1
  205. package/lib/types/plugin/plugin.d.ts +0 -473
  206. package/lib/types/plugin/plugin.js +0 -1
  207. package/lib/types/render/render.d.ts +0 -118
  208. package/lib/types/render/render.js +0 -1
  209. package/lib/types/type/global.d.ts +0 -25
  210. package/lib/types/type/global.js +0 -1
  211. package/lib/utils/common/common.d.ts +0 -236
  212. package/lib/utils/common/common.js +0 -708
  213. package/lib/utils/config/config.d.ts +0 -193
  214. package/lib/utils/config/config.js +0 -328
  215. package/lib/utils/config/updateVersion.d.ts +0 -33
  216. package/lib/utils/config/updateVersion.js +0 -145
  217. package/lib/utils/config/yamlEditor.d.ts +0 -101
  218. package/lib/utils/config/yamlEditor.js +0 -330
  219. package/lib/utils/core/handler.d.ts +0 -18
  220. package/lib/utils/core/handler.js +0 -46
  221. package/lib/utils/core/logger.d.ts +0 -3
  222. package/lib/utils/core/logger.js +0 -105
  223. package/lib/utils/core/segment.d.ts +0 -279
  224. package/lib/utils/core/segment.js +0 -451
  225. package/lib/utils/index.d.ts +0 -13
  226. package/lib/utils/index.js +0 -13
  227. package/lib/utils/tools/button.d.ts +0 -2
  228. package/lib/utils/tools/button.js +0 -27
  229. package/lib/utils/tools/exec.d.ts +0 -20
  230. package/lib/utils/tools/exec.js +0 -54
  231. package/lib/utils/tools/ffmpeg.d.ts +0 -12
  232. package/lib/utils/tools/ffmpeg.js +0 -25
  233. package/lib/utils/tools/restart.d.ts +0 -15
  234. package/lib/utils/tools/restart.js +0 -39
  235. package/lib/utils/tools/stop.d.ts +0 -7
  236. package/lib/utils/tools/stop.js +0 -13
  237. package/lib/utils/tools/update.d.ts +0 -67
  238. package/lib/utils/tools/update.js +0 -151
  239. /package/{config → default}/view/App.yaml +0 -0
  240. /package/{config → default}/view/config.yaml +0 -0
  241. /package/{config → default}/view/pm2.yaml +0 -0
  242. /package/{config → default}/view/redis.yaml +0 -0
  243. /package/{config → default}/view/server.yaml +0 -0
  244. /package/{lib/modules → dist/module}/art-template.js +0 -0
  245. /package/{lib/modules → dist/module}/axios.js +0 -0
  246. /package/{lib/modules → dist/module}/chalk.js +0 -0
  247. /package/{lib/modules → dist/module}/chokidar.js +0 -0
  248. /package/{lib/modules → dist/module}/level.js +0 -0
  249. /package/{lib/modules → dist/module}/lodash.js +0 -0
  250. /package/{lib/modules → dist/module}/log4js.js +0 -0
  251. /package/{lib/modules → dist/module}/moment.js +0 -0
  252. /package/{lib/modules → dist/module}/node-schedule.js +0 -0
  253. /package/{lib/modules → dist/module}/redis.js +0 -0
  254. /package/{lib/modules → dist/module}/yaml.js +0 -0
@@ -1,708 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import Yaml from 'yaml';
4
- import axios, { AxiosError } from 'axios';
5
- import lodash from 'lodash';
6
- import { promisify } from 'util';
7
- import { fileURLToPath } from 'url';
8
- import { createRequire } from 'module';
9
- import { pipeline, Readable } from 'stream';
10
- import { logger, segment, YamlEditor } from '../../utils/index.js';
11
- /**
12
- * 常用方法
13
- */
14
- export class Common {
15
- streamPipeline;
16
- constructor() {
17
- this.streamPipeline = promisify(pipeline);
18
- }
19
- /**
20
- * 休眠函数
21
- * @param ms 毫秒
22
- */
23
- sleep(ms) {
24
- return new Promise(resolve => setTimeout(resolve, ms));
25
- }
26
- /**
27
- * 下载保存文件
28
- * @param fileUrl 下载地址
29
- * @param savePath 保存路径
30
- * @param param axios参数
31
- */
32
- async downFile(fileUrl, savePath, param = {}) {
33
- try {
34
- this.mkdir(path.dirname(savePath));
35
- logger.info(`[下载文件] ${fileUrl}`);
36
- const response = await axios.get(fileUrl, { ...param, responseType: 'stream' });
37
- await this.streamPipeline(response.data, fs.createWriteStream(savePath));
38
- return true;
39
- }
40
- catch (err) {
41
- if (err instanceof AxiosError) {
42
- logger.error(`下载文件错误:${err.stack}`);
43
- }
44
- else {
45
- logger.error(`下载文件错误:${err}`);
46
- }
47
- return false;
48
- }
49
- }
50
- /**
51
- * 对axios进行简单封装,超时、错误后返回null,不会抛出异常
52
- * @param url 请求地址
53
- * @param type 请求类型
54
- * @param param axios参数
55
- */
56
- async axios(url, type = 'get', param = {}) {
57
- try {
58
- if (type === 'post')
59
- return await axios.post(url, param.data, param);
60
- return await axios.get(url, param);
61
- }
62
- catch (error) {
63
- error instanceof AxiosError ? logger.debug(error.stack) : logger.debug(error);
64
- return null;
65
- }
66
- }
67
- /**
68
- * 递归创建目录
69
- * @param dirname - 要创建的文件夹路径
70
- */
71
- mkdir(dirname) {
72
- if (fs.existsSync(dirname))
73
- return true;
74
- /** 递归自调用 */
75
- if (this.mkdir(path.dirname(dirname)))
76
- fs.mkdirSync(dirname);
77
- return true;
78
- }
79
- /**
80
- * 标准化文件路径
81
- * @param file - 相对路径
82
- * @param isDir - 返回绝对路径
83
- * @param isFile - 添加file://前缀
84
- * @returns 标准化后的路径
85
- */
86
- absPath(file, isDir = true, isFile = false) {
87
- file = file.replace(/\\/g, '/');
88
- if (file.startsWith('file://')) {
89
- /** linux */
90
- if (path.sep === '/') {
91
- file = file.replace('file://', '');
92
- }
93
- else {
94
- /** windows */
95
- file = file.replace(/^file:[/]{2,3}/g, '');
96
- }
97
- }
98
- file = path.normalize(file);
99
- /** 判断路径是否为绝对路径 否则转为绝对路径 */
100
- if (isDir && !path.isAbsolute(file)) {
101
- file = path.resolve(file);
102
- }
103
- if (isFile)
104
- file = 'file://' + file;
105
- file = file.replace(/\\/g, '/');
106
- return file;
107
- }
108
- /**
109
- * 判断是否为文件夹
110
- * @param path - 路径
111
- * @returns 返回true为文件夹
112
- */
113
- isDir(path) {
114
- try {
115
- return fs.statSync(path).isDirectory();
116
- }
117
- catch {
118
- return false;
119
- }
120
- }
121
- /**
122
- * 判断是否为插件包
123
- * @param path - 路径
124
- * @returns 返回true为插件包
125
- */
126
- isPlugin(path) {
127
- return this.exists(`${path}/package.json`);
128
- }
129
- /**
130
- * 去掉相对路径的前缀和后缀
131
- * @param root - 相对路径路径
132
- */
133
- getRelPath(root) {
134
- return root.replace(/\\+/g, '/').replace(/\.+\/+|\/+$/g, '');
135
- }
136
- /**
137
- * 判断路径是否存在
138
- * @param path - 路径
139
- * @returns 返回true为存在
140
- */
141
- exists(path) {
142
- try {
143
- return fs.existsSync(path);
144
- }
145
- catch {
146
- return false;
147
- }
148
- }
149
- /**
150
- * - 解析json文件
151
- * @param file - 文件路径
152
- * @param isThrow - 解析失败是否抛出错误
153
- */
154
- readJson(file, isThrow = false) {
155
- try {
156
- return JSON.parse(fs.readFileSync(file, 'utf8'));
157
- }
158
- catch (error) {
159
- logger.debug(`[common][error] 读取json文件错误: ${file} ` + error);
160
- if (isThrow)
161
- throw error;
162
- return null;
163
- }
164
- }
165
- /**
166
- * - 写入json文件
167
- * @param file - 文件路径
168
- * @param data - 要写入的数据
169
- */
170
- writeJson(file, data) {
171
- try {
172
- fs.writeFileSync(file, JSON.stringify(data, null, 2));
173
- return true;
174
- }
175
- catch (error) {
176
- logger.error('[common] 写入json文件错误:' + error);
177
- return false;
178
- }
179
- }
180
- /**
181
- * - 解析yaml文件
182
- * @param file - 文件路径
183
- */
184
- readYaml(file) {
185
- try {
186
- return Yaml.parse(fs.readFileSync(file, 'utf8'));
187
- }
188
- catch (error) {
189
- logger.error('[common] 读取yaml文件错误:' + error);
190
- return null;
191
- }
192
- }
193
- /**
194
- * - 写入yaml文件
195
- * @param file - 文件路径
196
- * @param data - 要写入的数据
197
- */
198
- writeYaml(file, data) {
199
- try {
200
- fs.writeFileSync(file, Yaml.stringify(data));
201
- return true;
202
- }
203
- catch (error) {
204
- logger.error('[common] 写入yaml文件错误:' + error);
205
- return false;
206
- }
207
- }
208
- /**
209
- * 传入插件名称 返回解析后的package.json的内容
210
- * @param name - 插件名称
211
- */
212
- pkgJson(name) {
213
- try {
214
- /** 先查git插件 */
215
- const gitPath = `./plugins/${name}`;
216
- if (fs.existsSync(gitPath))
217
- return this.readJson(`${gitPath}/package.json`);
218
- /** 查npm插件 */
219
- const require = createRequire(import.meta.url);
220
- return require(`${name}/package.json`);
221
- }
222
- catch {
223
- return null;
224
- }
225
- }
226
- /**
227
- * 输入包名 返回包根目录的绝对路径 仅简单查找
228
- * @param name - 包名
229
- * @param _path - 导入包的路径 此项适用于在插件中读取插件的依赖包
230
- * @returns - 包根目录的绝对路径
231
- * @example
232
- * common.pkgroot('axios')
233
- * common.pkgroot('axios', import.meta.url)
234
- */
235
- pkgroot(name, _path) {
236
- const require = createRequire(_path || import.meta.url);
237
- let dir = require.resolve(name);
238
- if (fs.existsSync(path.join(dir, 'package.json')))
239
- return path.resolve(dir);
240
- /** 递归查找 如果跳过了node_modules 则返回null */
241
- while (true) {
242
- /** 向上 */
243
- dir = path.dirname(dir);
244
- if (fs.existsSync(path.join(dir, 'package.json')))
245
- return path.resolve(dir);
246
- /** 加个处理 防止无线递归 */
247
- if (dir === path.dirname(dir)) {
248
- throw new Error(`[common] 未找到包${name}的根目录`);
249
- }
250
- }
251
- }
252
- /**
253
- * 根据文件后缀名从指定路径下读取符合要求的文件
254
- * @param path - 路径
255
- * @param ext - 后缀名、或后缀名列表
256
- * @example common.readDir('./plugins', '.js')
257
- * @example common.readDir('./plugins', ['.js', '.ts'])
258
- */
259
- readDir(_path, ext) {
260
- if (!this.isDir(_path))
261
- return null;
262
- const files = fs.readdirSync(_path, { withFileTypes: true });
263
- const list = [];
264
- if (!Array.isArray(ext))
265
- ext = [ext];
266
- files.forEach(v => {
267
- if (v.isDirectory())
268
- return;
269
- if (ext.includes(path.extname(v.name)))
270
- list.push(v.name);
271
- });
272
- return list;
273
- }
274
- /**
275
- * 根据传入的 import.meta.url 计算相对于项目根目录的路径,返回需要的 '../' 层级。
276
- * @param url - import.meta.url
277
- * @returns 相对路径的层级数量,用 '../' 表示
278
- * @example
279
- * // 在 plugins/karin-plugin-example/index.ts 中使用
280
- * common.urlToPath(import.meta.url) // 返回 '../../'
281
- */
282
- urlToPath(url) {
283
- /** 当前文件的绝对路径 */
284
- const filePath = fileURLToPath(url);
285
- /** 当前文件所在目录的绝对路径 */
286
- const dirPath = path.dirname(filePath);
287
- /** 项目根目录 */
288
- const rootPath = process.cwd();
289
- /** 当前文件到项目根目录的相对路径 */
290
- const relativePath = path.relative(dirPath, rootPath);
291
- /** 相对路径的层级数量 */
292
- const upLevelsCount = relativePath.split(path.sep).length;
293
- /** 返回构建的路径 */
294
- const upPath = lodash.repeat('../', upLevelsCount);
295
- return upPath;
296
- }
297
- /**
298
- * 传入相对路径 分割为两部分 1为文件夹路径 2为文件名 文件夹路径无前缀开头
299
- * @param _path - 路径
300
- */
301
- splitPath(_path) {
302
- const list = _path.replace(/\\/g, '/').split('/');
303
- if (list[0] === '.')
304
- list.shift();
305
- const pop = list.pop() || '';
306
- const dir = path.join(...list);
307
- return { dir, pop };
308
- }
309
- /**
310
- * 将文件转换为不带前缀的base64字符串
311
- * @param file - 文件路径或Buffer对象、可读流对象、http地址、base64://字符串
312
- * @param options - 选项 http为true时返回http地址
313
- * @returns 返回base64字符串
314
- */
315
- async base64(file, options = { http: false }) {
316
- /** 非字符串 */
317
- if (typeof file !== 'string') {
318
- if (Buffer.isBuffer(file))
319
- return file.toString('base64');
320
- if (file instanceof Readable)
321
- return (await this.stream(file)).toString('base64');
322
- return file;
323
- }
324
- /** base64:// */
325
- if (file.startsWith('base64://'))
326
- return file.replace('base64://', '');
327
- /** http */
328
- if (file.startsWith('http')) {
329
- if (options.http)
330
- return file;
331
- const response = await axios.get(file, { responseType: 'arraybuffer' });
332
- return Buffer.from(response.data, 'binary').toString('base64');
333
- }
334
- /** file:// */
335
- const files = file.replace(/^file:\/\//, '');
336
- if (fs.existsSync(files))
337
- return fs.readFileSync(files).toString('base64');
338
- /** 无前缀base64:// */
339
- return Buffer.from(file, 'base64').toString('base64');
340
- }
341
- /**
342
- * 将文件转换为Buffer对象 仅支持标准格式
343
- * @param file - 文件路径或Buffer对象、可读流对象、http地址、base64://字符串
344
- * @param options - 选项 http为true时返回http地址
345
- * @returns - 返回Buffer对象
346
- */
347
- async buffer(file, options) {
348
- /** 非字符串 */
349
- if (typeof file !== 'string') {
350
- if (Buffer.isBuffer(file))
351
- return file;
352
- if (file instanceof Readable)
353
- return await this.stream(file);
354
- return file;
355
- }
356
- /** base64 */
357
- if (file.startsWith('base64://')) {
358
- return Buffer.from(file.replace('base64://', ''), 'base64');
359
- }
360
- /** http */
361
- if (file.startsWith('http')) {
362
- if (options?.http)
363
- return file;
364
- const response = await axios.get(file, { responseType: 'arraybuffer' });
365
- return Buffer.from(response.data);
366
- }
367
- /** file:// */
368
- const files = file.replace(/^file:\/\//, '');
369
- if (fs.existsSync(files))
370
- return fs.readFileSync(files);
371
- /** 无前缀base64:// */
372
- return Buffer.from(file, 'base64');
373
- }
374
- /**
375
- * 将数据流对象转换为Buffer对象
376
- * @param {stream.Readable} stream - 要转换的数据流对象
377
- * @returns {Promise<Buffer>} - 返回Buffer
378
- */
379
- stream(stream) {
380
- return new Promise((resolve, reject) => {
381
- const chunks = [];
382
- stream.on('data', chunk => chunks.push(chunk));
383
- stream.on('end', () => resolve(Buffer.concat(chunks)));
384
- stream.on('error', error => reject(error));
385
- });
386
- }
387
- /**
388
- * 标准化发送的消息内容
389
- * @param elements - 消息内容
390
- */
391
- makeMessage(elements) {
392
- if (!Array.isArray(elements))
393
- elements = [elements];
394
- const message = [];
395
- elements.forEach(v => { typeof v === 'string' ? message.push(segment.text(v)) : message.push(v); });
396
- return message;
397
- }
398
- /**
399
- * 制作简单转发,返回segment.node[]。仅简单包装node,也可以自己组装
400
- * @param elements
401
- * @param fakeUin 转发用户的QQ号 必填
402
- * @param fakeNick 转发用户显示的昵称 必填
403
- */
404
- makeForward(elements, fakeUin, fakeNick) {
405
- if (!Array.isArray(elements))
406
- elements = [elements];
407
- return elements.map(element => {
408
- const NodeElement = this.makeMessage(element);
409
- return segment.node(fakeUin, fakeNick, NodeElement);
410
- });
411
- }
412
- /**
413
- * 获取git插件列表
414
- * @param isPack - 是否屏蔽不带package.json的插件,默认为false
415
- */
416
- getPlugins(isPack = false) {
417
- const dir = this.absPath('./plugins', false);
418
- let list = fs.readdirSync(dir, { withFileTypes: true });
419
- /** 忽略非文件夹、非 karin-plugin-开头的文件夹 */
420
- list = list.filter(v => v.isDirectory() && v.name.startsWith('karin-plugin-'));
421
- if (isPack)
422
- list = list.filter(v => fs.existsSync(`${dir}/${v.name}/package.json`));
423
- const arr = [];
424
- list.map(v => arr.push(v.name));
425
- return arr;
426
- }
427
- /**
428
- * 获取git插件列表
429
- * @param isPack - 是否屏蔽不带package.json的插件,默认为false
430
- */
431
- getGitPlugins(isPack = false) {
432
- return this.getPlugins(isPack);
433
- }
434
- /**
435
- * 获取npm插件列表
436
- * @param showDetails - 是否返回详细信息
437
- * 默认只返回插件npm包名,为true时返回详细的{dir, name}[]
438
- */
439
- async getNpmPlugins(showDetails) {
440
- /** 屏蔽的依赖包列表 */
441
- const exclude = ['art-template', 'axios', 'chalk', 'chokidar', 'commander', 'express', 'level', 'lodash', 'log4js', 'moment', 'node-karin', 'node-schedule', 'redis', 'ws', 'yaml'];
442
- const pkg = this.readJson('./package.json');
443
- const dependencies = Object.keys(pkg.dependencies).filter((name) => !exclude.includes(name));
444
- if (!showDetails) {
445
- const list = [];
446
- const readPackageJson = async (name) => {
447
- try {
448
- const pkgPath = path.join(process.cwd(), 'node_modules', name, 'package.json');
449
- const pkg = this.readJson(pkgPath);
450
- if (pkg?.karin)
451
- list.push(name);
452
- }
453
- catch (error) {
454
- logger.error(`[common] 解析 package.json 时出错:${error.stack || error.message || JSON.stringify(error)}`);
455
- }
456
- };
457
- await Promise.all(dependencies.map(readPackageJson));
458
- return list;
459
- }
460
- const list = [];
461
- /** 获取详细的npm信息 */
462
- const readPackageJson = async (files) => {
463
- try {
464
- const root = path.join(process.cwd(), 'node_modules', files);
465
- const pkgPath = path.join(root, 'package.json');
466
- const pkg = this.readJson(pkgPath);
467
- if (!pkg?.karin)
468
- return;
469
- if (pkg?.main) {
470
- list.push({ plugin: files, path: path.dirname(pkg.main), file: path.basename(pkg.main), isMain: true });
471
- }
472
- if (pkg?.karin?.apps?.length) {
473
- pkg.karin.apps.forEach((app) => {
474
- if (!fs.existsSync(path.join(root, app))) {
475
- logger.error(`[common] npm插件${files}的app目录${app}不存在 已跳过`);
476
- return;
477
- }
478
- fs.readdirSync(path.join(root, app)).forEach((filename) => {
479
- /** 忽略非js文件 npm包不考虑ts */
480
- if (!filename.endsWith('.js'))
481
- return;
482
- list.push({ plugin: files, path: app, file: filename, isMain: false });
483
- });
484
- });
485
- }
486
- }
487
- catch (error) {
488
- logger.error(`[common] 获取npm插件列表时出错:${error.stack || error.message || JSON.stringify(error)}`);
489
- }
490
- };
491
- await Promise.all(dependencies.map(readPackageJson));
492
- return list;
493
- }
494
- /**
495
- * 获取运行时间
496
- */
497
- uptime() {
498
- const time = process.uptime();
499
- const day = Math.floor(time / 86400);
500
- const hour = Math.floor((time % 86400) / 3600);
501
- const min = Math.floor((time % 3600) / 60);
502
- const sec = Math.floor(time % 60);
503
- const parts = [day ? `${day}天` : '', hour ? `${hour}小时` : '', min ? `${min}分钟` : '', !day && sec ? `${sec}秒` : ''];
504
- return parts.filter(Boolean).join('');
505
- }
506
- /**
507
- * 传入一个时间戳
508
- * 返回距今已过去的时间
509
- * @param time - 时间戳
510
- *
511
- * @example
512
- * common.formatTime(1620000000)
513
- * // -> '18天'
514
- */
515
- formatTime(time) {
516
- /** 判断是几位时间戳 进行对应处理 */
517
- time = time.toString().length === 10 ? time * 1000 : time;
518
- /** 减去当前时间 */
519
- time = Math.floor((Date.now() - time) / 1000);
520
- const day = Math.floor(time / 86400);
521
- const hour = Math.floor((time % 86400) / 3600);
522
- const min = Math.floor((time % 3600) / 60);
523
- const sec = Math.floor(time % 60);
524
- const parts = [day ? `${day}天` : '', hour ? `${hour}小时` : '', min ? `${min}分钟` : '', !day && sec ? `${sec}秒` : ''];
525
- return parts.filter(Boolean).join('');
526
- }
527
- /**
528
- * 构建消息体日志
529
- * @param - 消息体
530
- */
531
- makeMessageLog(message) {
532
- const logs = [];
533
- for (const val of message) {
534
- switch (val.type) {
535
- case 'text':
536
- logs.push(val.text);
537
- break;
538
- case 'face':
539
- logs.push(`[face: ${val.id}]`);
540
- break;
541
- case 'video':
542
- case 'image':
543
- case 'record':
544
- case 'file': {
545
- let file;
546
- if (Buffer.isBuffer(val.file)) {
547
- file = 'Buffer://...';
548
- }
549
- else if (/^http|^file/.test(val.file)) {
550
- file = val.file;
551
- }
552
- else {
553
- file = 'base64://...';
554
- }
555
- logs.push(`[${val.type}: ${file}]`);
556
- break;
557
- }
558
- case 'at':
559
- logs.push(`[at: ${val.uid}]`);
560
- break;
561
- case 'rps':
562
- logs.push(`[rps: ${val.id}]`);
563
- break;
564
- case 'dice':
565
- logs.push(`[dice: ${val.id}]`);
566
- break;
567
- case 'poke':
568
- logs.push(`[poke: ${val.id}]`);
569
- break;
570
- case 'share':
571
- logs.push(`[share: ${JSON.stringify(val)}]`);
572
- break;
573
- case 'contact':
574
- logs.push(`[contact: ${JSON.stringify(val)}]`);
575
- break;
576
- case 'location':
577
- logs.push(`[location: ${JSON.stringify(val)}]`);
578
- break;
579
- case 'music':
580
- logs.push(`[music: ${JSON.stringify(val)}]`);
581
- break;
582
- case 'reply':
583
- logs.push(`[reply: ${val.message_id}]`);
584
- break;
585
- case 'forward':
586
- logs.push(`[forward: ${val.res_id}]`);
587
- break;
588
- case 'xml':
589
- logs.push(`[xml: ${val.data}]`);
590
- break;
591
- case 'json':
592
- logs.push(`[json: ${val.data}]`);
593
- break;
594
- case 'markdown': {
595
- logs.push(`[markdown: ${val.content}]`);
596
- break;
597
- }
598
- case 'markdown_tpl': {
599
- const params = val.params;
600
- if (!params)
601
- break;
602
- const content = { id: val.custom_template_id };
603
- for (const v of params)
604
- content[v.key] = v.values[0];
605
- logs.push(`[markdown_tpl: ${JSON.stringify(content)}]`);
606
- break;
607
- }
608
- case 'keyboard': {
609
- logs.push(`[rows: ${JSON.stringify(val.rows)}]`);
610
- break;
611
- }
612
- case 'button':
613
- logs.push(`[button: ${JSON.stringify(val.data)}]`);
614
- break;
615
- case 'long_msg':
616
- logs.push(`[long_msg: ${val.id}]`);
617
- break;
618
- default:
619
- logs.push(`[未知: ${JSON.stringify(val)}]`);
620
- }
621
- }
622
- return logs.join('');
623
- }
624
- /**
625
- * 更新yaml文件
626
- * @param filePath - 文件路径
627
- * @param settings - 设置项
628
- */
629
- updateYaml(filePath, settings) {
630
- let yaml = new YamlEditor(filePath);
631
- /** 先添加内容 */
632
- settings.forEach(({ key, val }) => {
633
- try {
634
- if (!yaml.has(key))
635
- yaml.set(key, val);
636
- }
637
- catch (error) {
638
- logger.error(`[common] 更新yaml文件时出错:${error.stack || error.message || error}`);
639
- }
640
- });
641
- /** 先保存 */
642
- yaml.save();
643
- /** 重新解析 再次写入注释 直接写入注释会报错 写入的不是node节点模式 */
644
- yaml = new YamlEditor(filePath);
645
- settings.forEach(({ key, comment }) => {
646
- try {
647
- yaml.comment(key, comment, true);
648
- }
649
- catch (error) {
650
- logger.error(`[common] 更新yaml文件时出错:${error.stack || error.message || error}`);
651
- }
652
- });
653
- yaml.save();
654
- }
655
- /**
656
- * karin按钮转换为QQBot官方按钮 返回官方按钮结构
657
- * @param button - 按钮
658
- */
659
- buttonToQQBot(button) {
660
- let id = 0;
661
- const rows = [];
662
- /** 格式化为多行 */
663
- const list = [];
664
- button.type === 'button' ? list.push(button.data) : list.push(...button.rows);
665
- for (const row of list) {
666
- const buttons = [];
667
- for (const i of row) {
668
- const type = i.link ? 0 : (i.callback ? 1 : i.type ?? 2);
669
- const data = {
670
- id: String(id),
671
- render_data: {
672
- label: i.text,
673
- style: i.style ?? 0,
674
- visited_label: i.show || i.text,
675
- },
676
- action: {
677
- type,
678
- data: i.data || i.link || i.text,
679
- unsupport_tips: i.tips || '.',
680
- permission: { type: 2 },
681
- },
682
- };
683
- if (i.enter)
684
- data.action.enter = true;
685
- if (i.reply)
686
- data.action.reply = true;
687
- if (i.admin)
688
- data.action.permission.type = 1;
689
- if (i.list) {
690
- data.action.permission.type = 0;
691
- data.action.permission.specify_user_ids = i.list;
692
- }
693
- else if (i.role) {
694
- data.action.permission.type = 3;
695
- data.action.permission.specify_role_ids = i.role;
696
- }
697
- buttons.push(data);
698
- id++;
699
- }
700
- rows.push({ buttons });
701
- }
702
- return rows;
703
- }
704
- }
705
- /**
706
- * 常用方法
707
- */
708
- export const common = new Common();