11import LoggerCore from "@App/app/logger/core" ;
22import Logger from "@App/app/logger/logger" ;
33import type { Resource } from "@App/app/repo/resource" ;
4- import { type Script , SCRIPT_STATUS_ENABLE , type ScriptDAO } from "@App/app/repo/scripts" ;
4+ import { type Script , SCRIPT_STATUS_DISABLE , SCRIPT_STATUS_ENABLE , type ScriptDAO } from "@App/app/repo/scripts" ;
55import BackupExport from "@App/pkg/backup/export" ;
66import type { BackupData , ResourceBackup , ScriptBackupData , ScriptOptions , ValueStorage } from "@App/pkg/backup/struct" ;
77import type { File } from "@Packages/filesystem/filesystem" ;
@@ -46,15 +46,17 @@ type ScriptcatSync = {
4646 version : string ; // 脚本猫版本
4747 status : {
4848 scripts : {
49- [ key : string ] : {
50- enable : boolean ;
51- sort : number ;
52- updatetime : number ; // 更新时间
53- } ;
49+ [ key : string ] : ScriptcatSyncStatus | undefined ;
5450 } ;
5551 } ;
5652} ;
5753
54+ type ScriptcatSyncStatus = {
55+ enable : boolean ;
56+ sort : number ;
57+ updatetime : number ; // 更新时间
58+ } ;
59+
5860type PushScriptParam = TInstallScriptParams ;
5961
6062export class SynchronizeService {
@@ -367,8 +369,25 @@ export class SynchronizeService {
367369 scriptList . forEach ( ( script ) => {
368370 scriptMap . set ( script . uuid , script ) ;
369371 } ) ;
372+
373+ // 判断文件系统是否有脚本猫同步文件
374+ const file = list . find ( ( file ) => file . name === "scriptcat-sync.json" ) ;
375+ const scriptcatSync = {
376+ version : ExtVersion ,
377+ status : {
378+ scripts : { } ,
379+ } ,
380+ } as ScriptcatSync ;
381+ let cloudStatus : ScriptcatSync [ "status" ] [ "scripts" ] = { } ;
382+ if ( file ) {
383+ // 如果有,则读取文件内容
384+ const cloudScriptCatSync = JSON . parse ( await fs . open ( file ) . then ( ( f ) => f . read ( "string" ) ) ) as ScriptcatSync ;
385+ cloudStatus = cloudScriptCatSync . status . scripts ;
386+ }
387+
370388 // 对比脚本列表和文件列表,进行同步
371389 const result : Promise < void > [ ] = [ ] ;
390+ const updateScript : Map < string , boolean > = new Map ( ) ;
372391 uuidMap . forEach ( ( file , uuid ) => {
373392 const script = scriptMap . get ( uuid ) ;
374393 if ( script ) {
@@ -414,14 +433,16 @@ export class SynchronizeService {
414433 result . push ( this . pushScript ( fs , script ) ) ;
415434 } else {
416435 // 如果脚本更新时间小于文件更新时间,则更新脚本
417- result . push ( this . pullScript ( fs , file as SyncFiles , script ) ) ;
436+ updateScript . set ( uuid , true ) ;
437+ result . push ( this . pullScript ( fs , file as SyncFiles , cloudStatus [ uuid ] , script ) ) ;
418438 }
419439 scriptMap . delete ( uuid ) ;
420440 return ;
421441 }
422442 // 如果脚本不存在,且文件存在,则安装脚本
423443 if ( file . script ) {
424- result . push ( this . pullScript ( fs , file as SyncFiles ) ) ;
444+ updateScript . set ( uuid , true ) ;
445+ result . push ( this . pullScript ( fs , file as SyncFiles , cloudStatus [ uuid ] ) ) ;
425446 }
426447 } ) ;
427448 // 上传剩下的脚本
@@ -432,35 +453,27 @@ export class SynchronizeService {
432453 await Promise . allSettled ( result ) ;
433454 // 同步状态
434455 if ( syncConfig . syncStatus ) {
435- // 判断文件系统是否有脚本猫同步文件
436- const file = list . find ( ( file ) => file . name === "scriptcat-sync.json" ) ;
437- const scriptcatSync = {
438- version : ExtVersion ,
439- status : {
440- scripts : { } ,
441- } ,
442- } as ScriptcatSync ;
443- let cloudStatus : ScriptcatSync [ "status" ] [ "scripts" ] = { } ;
444- if ( file ) {
445- // 如果有,则读取文件内容
446- const cloudScriptCatSync = JSON . parse ( await fs . open ( file ) . then ( ( f ) => f . read ( "string" ) ) ) as ScriptcatSync ;
447- cloudStatus = cloudScriptCatSync . status . scripts ;
448- }
449456 const scriptlist = await this . scriptDAO . all ( ) ;
450457 await Promise . allSettled (
451458 scriptlist . map ( async ( script ) => {
452459 // 判断云端状态是否与本地状态一致
453- if ( ! cloudStatus [ script . uuid ] ) {
460+ const status = cloudStatus [ script . uuid ] ;
461+ if ( ! status ) {
454462 scriptcatSync . status . scripts [ script . uuid ] = {
455463 enable : script . status === SCRIPT_STATUS_ENABLE ,
456464 sort : script . sort ,
457465 updatetime : script . updatetime || script . createtime ,
458466 } ;
459467 } else {
468+ if ( updateScript . has ( script . uuid ) ) {
469+ // 脚本已经更新过了,跳过状态同步
470+ scriptcatSync . status . scripts [ script . uuid ] = status ;
471+ return ;
472+ }
460473 // 判断时间
461474 if ( script . updatetime ) {
462475 // 如果云端状态的更新时间小于本地状态的更新时间,则更新云端状态
463- if ( cloudStatus [ script . uuid ] . updatetime < script . updatetime ) {
476+ if ( status . updatetime < script . updatetime ) {
464477 scriptcatSync . status . scripts [ script . uuid ] = {
465478 enable : script . status === SCRIPT_STATUS_ENABLE ,
466479 sort : script . sort ,
@@ -470,20 +483,20 @@ export class SynchronizeService {
470483 }
471484 }
472485 // 否则采用云端状态
473- scriptcatSync . status . scripts [ script . uuid ] = cloudStatus [ script . uuid ] ;
486+ scriptcatSync . status . scripts [ script . uuid ] = status ;
474487 // 脚本顺序
475- if ( cloudStatus [ script . uuid ] . sort !== script . sort ) {
488+ if ( status . sort !== script . sort ) {
476489 await this . scriptDAO . update ( script . uuid , {
477- sort : cloudStatus [ script . uuid ] . sort ,
490+ sort : status . sort ,
478491 updatetime : Date . now ( ) ,
479492 } ) ;
480493 }
481494 // 脚本状态
482- if ( cloudStatus [ script . uuid ] . enable !== ( script . status === SCRIPT_STATUS_ENABLE ) ) {
495+ if ( status . enable !== ( script . status === SCRIPT_STATUS_ENABLE ) ) {
483496 // 开启脚本
484497 await this . script . enableScript ( {
485498 uuid : script . uuid ,
486- enable : cloudStatus [ script . uuid ] . enable ,
499+ enable : status . enable ,
487500 } ) ;
488501 }
489502 }
@@ -573,7 +586,7 @@ export class SynchronizeService {
573586 return ;
574587 }
575588
576- async pullScript ( fs : FileSystem , file : SyncFiles , existingScript ?: Script ) {
589+ async pullScript ( fs : FileSystem , file : SyncFiles , status : ScriptcatSyncStatus | undefined , existingScript ?: Script ) {
577590 const logger = this . logger . with ( {
578591 uuid : existingScript ?. uuid || "" ,
579592 name : existingScript ?. name || "" ,
@@ -593,6 +606,19 @@ export class SynchronizeService {
593606 existingScript ?. uuid || metaObj . uuid
594607 ) ;
595608 script . origin = script . origin || metaObj . origin ;
609+ if ( status ) {
610+ if ( existingScript ) {
611+ if ( ! existingScript . updatetime || status . updatetime > existingScript . updatetime ) {
612+ // 如果云端状态的更新时间大于本地状态的更新时间,则采用云端状态
613+ script . sort = status . sort ;
614+ script . status = status . enable ? SCRIPT_STATUS_ENABLE : SCRIPT_STATUS_DISABLE ;
615+ }
616+ } else {
617+ // 新安装的脚本采用云端状态
618+ script . sort = status . sort ;
619+ script . status = status . enable ? SCRIPT_STATUS_ENABLE : SCRIPT_STATUS_DISABLE ;
620+ }
621+ }
596622 this . script . installScript ( {
597623 script,
598624 code,
@@ -602,7 +628,6 @@ export class SynchronizeService {
602628 } catch ( e ) {
603629 logger . error ( "pull script error" , Logger . E ( e ) ) ;
604630 }
605- return ;
606631 }
607632
608633 cloudSyncConfigChange ( value : CloudSyncConfig ) {
0 commit comments