dsh-napcat-keeper 2.7.0 → 2.7.2
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/CHANGELOG.md +10 -0
- package/README.md +1 -1
- package/lib/index.js +26 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.7.2 — 根上一点不留
|
|
4
|
+
- **修的什么**:2.7.0 的搬迁兜底扫描会跳过「规范老名字」(`napcat-keeper-state.json` 这种已经安排好去处的),本意是别把刚搬完的东西又归一次档。但碰上**目标位已经有同名文件**的情况(新目录里先躺着一份 `state.json`),根上那份老的既搬不走、也不归档,就永远留在 `~/.dsh` 根上了 —— 正是这次要收拾的那种乱。
|
|
5
|
+
- 现在兜底扫描不再挑名字:只要还留在根上、名字对得上插件的老命名,一律归档进 `legacy/`;被别的进程攥着搬不动的,下次启动再搬。跑完根上一个不剩。
|
|
6
|
+
- 顺带删掉因此没用了的 `CANONICAL_LEGACY` 常量。升级不用改配置。
|
|
7
|
+
|
|
8
|
+
## 2.7.1 — 搬迁时不留半截副本
|
|
9
|
+
- **修的什么**:2.7.0 的自动搬迁里,「rename 失败就复制再删」这两步原先裹在同一个 `try` 里。碰上源文件正被别的进程攥着(比如 QQ 那条 cmd 还在往 `launch.log` 里追加),`copyFileSync` 会成功、`unlinkSync` 会失败 —— 结果目标位落了个**残缺副本**,而且因为「目标已存在就跳过」,以后每次启动都不会再搬它,残缺文件就一直留在那儿。
|
|
10
|
+
- 现在两步分开:删不掉源文件就把刚复制的撤掉,返回「没搬成」,下次启动再试一遍。真正搬不动的文件原地不动,不污染新目录。
|
|
11
|
+
- 行为没别的变化,升级不用改配置。
|
|
12
|
+
|
|
3
13
|
## 2.7.0 — 插件自己的文件收进 `~/.dsh/dsh-napcat-keeper/`
|
|
4
14
|
- **为什么要动这个**:以前插件产生的东西全都摊在 `~/.dsh` 根上(配置、日志、状态、二维码、生成的 bat/vbs、提权脚本),和 DSH 自己的 `AGENT.md`、`profiles/`、一堆别的插件的文件混在一起,压根看不出哪些是它写的。现在一个目录装完自己的全部家当。
|
|
5
15
|
- **新布局**(`~/.dsh/dsh-napcat-keeper/`):
|
package/README.md
CHANGED
|
@@ -239,7 +239,7 @@ QQ 那条进程链挂在本 DSH 实例下面——DSH 开着它就在,DSH 关
|
|
|
239
239
|
```
|
|
240
240
|
|
|
241
241
|
- `env.bat` 只在「记住密码」开启时才有;两份 `autogen*.bat` 只在需要时出现(每次拉起前按当前配置重写,删掉也会自己长回来)。整个目录删掉 = 插件回到没配置过的状态。
|
|
242
|
-
- **从老版本升上来(< 2.7.0)**:第一次启动会自动把原来散在 `~/.dsh` 根上的文件搬进这个目录(`napcat-keeper-config.json` → `config.json` 这种),改名一次就固定;计划任务里写死的旧路径也会一并改指新位置 —— 那一步用 `schtasks /change` 就地改,不结束正在跑的 QQ
|
|
242
|
+
- **从老版本升上来(< 2.7.0)**:第一次启动会自动把原来散在 `~/.dsh` 根上的文件搬进这个目录(`napcat-keeper-config.json` → `config.json` 这种),改名一次就固定;计划任务里写死的旧路径也会一并改指新位置 —— 那一步用 `schtasks /change` 就地改,不结束正在跑的 QQ。老备份、以及搬不动的老文件(目标位已经有同名的那份、或者正被别的进程占着)都归到 `legacy/`,`~/.dsh` 根上不会留东西;实在被占着搬不动的,下次启动再搬一次。
|
|
243
243
|
- `~/.dsh/qq-bridge-state.json` **不在**这个目录里,也不归这个插件:它由 `dsh-qq-bridge` 写,插件只是读一下它的时间戳,判断那边轮询还活着没有。
|
|
244
244
|
|
|
245
245
|
## 出事了先跑体检:`npm run check`
|
package/lib/index.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dsh-napcat-keeper —— NapCat 看门狗 v2.7.
|
|
2
|
+
* dsh-napcat-keeper —— NapCat 看门狗 v2.7.2(可发布通用版)
|
|
3
3
|
*
|
|
4
4
|
* 解决的问题:DSH 是桌面应用,重启 DSH 时 NapCat(QQ 协议端) 不会跟着起来,
|
|
5
5
|
* 于是 dsh-qq-bridge 一直轮询一个死端口,你在 QQ 里说的话就石沉大海。
|
|
6
6
|
*
|
|
7
|
+
* v2.7.2:根上一点不留
|
|
8
|
+
* - 搬迁的兜底扫描原先跳过「规范老名字」,于是目标位已经有同名文件时(比如新目录里
|
|
9
|
+
* 已经躺着一份 state.json),根上那份老文件既搬不走、也不归档,永远留在那儿;
|
|
10
|
+
* - 现在只要名字对得上 LEGACY_LEFTOVER 就归档进 legacy/,搬不动的下次启动再来。
|
|
11
|
+
*
|
|
12
|
+
* v2.7.1:搬迁时别留半截副本
|
|
13
|
+
* - moveOne() 的复制兜底原来一把 try 包着「复制 + 删源」,源文件被别的进程攥着时
|
|
14
|
+
* 会出现「复制成功、删源失败」——目标位落了个残缺文件,之后每次搬迁都因为
|
|
15
|
+
* 「目标已存在」跳过它。现在分开处理:删不掉源就把复制的撤掉,下次启动再试。
|
|
16
|
+
*
|
|
7
17
|
* v2.7.0:自己的东西收进自己的目录(~/.dsh/dsh-napcat-keeper/)
|
|
8
18
|
* - 以前配置、日志、状态、二维码、生成的 bat/vbs、提权脚本全散在 ~/.dsh 根上,
|
|
9
19
|
* 和 DSH 自己的文件混在一起,一眼看不出哪些是插件产生的;
|
|
@@ -122,7 +132,7 @@ import { homedir, tmpdir } from 'node:os'
|
|
|
122
132
|
import path from 'node:path'
|
|
123
133
|
|
|
124
134
|
export const name = 'napcat-keeper'
|
|
125
|
-
export const version = '2.7.
|
|
135
|
+
export const version = '2.7.2'
|
|
126
136
|
|
|
127
137
|
/** tools 用来注册 napcat_* 工具;webServer 用来挂设置界面接口。拿不到也不至于把 DSH 拖崩。 */
|
|
128
138
|
export const inject = ['tools', 'webServer']
|
|
@@ -266,9 +276,8 @@ const LEGACY_FILES = [
|
|
|
266
276
|
['napcat-autogen.bat', 'autogen.bat'],
|
|
267
277
|
]
|
|
268
278
|
const LEGACY_DIRS = [['napcat-keeper-setup', 'setup']]
|
|
269
|
-
/**
|
|
279
|
+
/** 老版本留在 ~/.dsh 根上的东西(没搬走的、配置备份、bom-backup 之类):统一归档进 legacy/ */
|
|
270
280
|
const LEGACY_LEFTOVER = /^(napcat-keeper[.-]|napcat-qr\.|napcat-autogen)/
|
|
271
|
-
const CANONICAL_LEGACY = new Set([...LEGACY_FILES, ...LEGACY_DIRS].map(([oldName]) => oldName))
|
|
272
281
|
|
|
273
282
|
let migratedFor = ''
|
|
274
283
|
/** 上一次搬迁搬了几个(给 apply 写一行日志用) */
|
|
@@ -280,11 +289,21 @@ function moveOne(from, to) {
|
|
|
280
289
|
renameSync(from, to)
|
|
281
290
|
return true
|
|
282
291
|
} catch {
|
|
292
|
+
// 同卷 rename 失败:跨卷,或者文件正被别的进程攥着(cmd 重定向写着日志那种)。
|
|
293
|
+
// 退回复制再删;连删除都不让的话,把复制的半截撤掉 —— 别在目标位留个残缺文件,
|
|
294
|
+
// 它会挡住以后每一次搬迁(目标已存在就跳过)。
|
|
283
295
|
try {
|
|
284
296
|
copyFileSync(from, to)
|
|
297
|
+
} catch {
|
|
298
|
+
return false
|
|
299
|
+
}
|
|
300
|
+
try {
|
|
285
301
|
unlinkSync(from)
|
|
286
302
|
return true
|
|
287
303
|
} catch {
|
|
304
|
+
try {
|
|
305
|
+
unlinkSync(to)
|
|
306
|
+
} catch {}
|
|
288
307
|
return false
|
|
289
308
|
}
|
|
290
309
|
}
|
|
@@ -313,9 +332,11 @@ function migrateLegacyFiles(dir) {
|
|
|
313
332
|
}
|
|
314
333
|
} catch {}
|
|
315
334
|
}
|
|
335
|
+
// 兜底:还留在根上的(目标位已有同名文件、或者正被别的进程占用搬不动)一律归档进 legacy/,
|
|
336
|
+
// 别让它们继续躺在 ~/.dsh 根上冒充「插件还在用老布局」。这一趟搬不动的,下次启动再来。
|
|
316
337
|
try {
|
|
317
338
|
for (const entry of readdirSync(home)) {
|
|
318
|
-
if (
|
|
339
|
+
if (!LEGACY_LEFTOVER.test(entry)) continue
|
|
319
340
|
try {
|
|
320
341
|
mkdirSync(path.join(target, 'legacy'), { recursive: true })
|
|
321
342
|
if (moveOne(path.join(home, entry), path.join(target, 'legacy', entry))) moved += 1
|