@@ -126,17 +126,19 @@ fun updateSubscription(subscription: RawSubscription) {
126126 val subsId = subscription.id
127127 val subsName = subscription.name
128128 val newMap = subsMapFlow.value.toMutableMap()
129+ val nextSubsRaw: RawSubscription
129130 if (subsId < 0 && newMap[subsId]?.version == subscription.version) {
130- newMap[subsId] = subscription.run {
131+ nextSubsRaw = subscription.run {
131132 copy(
132133 version = version + 1 ,
133134 apps = apps.filterIfNotAll { it.groups.isNotEmpty() }
134135 .distinctByIfAny { it.id },
135136 )
136137 }
137138 } else {
138- newMap[subsId] = subscription
139+ nextSubsRaw = subscription
139140 }
141+ newMap[subsId] = nextSubsRaw
140142 subsMapFlow.value = newMap
141143 if (subsLoadErrorsFlow.value.contains(subsId)) {
142144 subsLoadErrorsFlow.update {
@@ -146,9 +148,10 @@ fun updateSubscription(subscription: RawSubscription) {
146148 }
147149 }
148150 withContext(Dispatchers .IO ) {
151+ cleanupSubsConfig(subsId, nextSubsRaw)
149152 DbSet .subsItemDao.updateMtime(subsId, System .currentTimeMillis())
150153 subsFolder.resolve(" ${subsId} .json" )
151- .writeText(json.encodeToString(newMap[subsId] ))
154+ .writeText(json.encodeToString(nextSubsRaw ))
152155 }
153156 LogUtils .d(" 更新订阅文件:id=${subsId} ,name=${subsName} " )
154157 }
@@ -433,6 +436,29 @@ fun initSubsState() {
433436 }
434437}
435438
439+ private suspend fun cleanupSubsConfig (subsId : Long , subsRaw : RawSubscription ): Int {
440+ val globalGroupKeys = subsRaw.globalGroups.map { it.key }.toHashSet()
441+ val appIdToGroupKeys = subsRaw.apps.associate { a ->
442+ a.id to a.groups.map { g -> g.key }.toHashSet()
443+ }
444+ val configs = DbSet .subsConfigDao.querySubsItemConfig(listOf (subsId))
445+ val deleteList = configs.filter { c ->
446+ when (c.type) {
447+ SubsConfig .AppGroupType -> {
448+ val groupKeys = appIdToGroupKeys[c.appId]
449+ groupKeys == null || ! groupKeys.contains(c.groupKey)
450+ }
451+
452+ SubsConfig .GlobalGroupType -> ! globalGroupKeys.contains(c.groupKey)
453+ else -> false
454+ }
455+ }
456+ if (deleteList.isEmpty()) return 0
457+ DbSet .subsConfigDao.delete(* deleteList.toTypedArray())
458+ LogUtils .d(" 清理已移除规则配置" , " subsId=$subsId , delete=${deleteList.size} " )
459+ return deleteList.size
460+ }
461+
436462val updateSubsMutex = MutexState ()
437463
438464private suspend fun updateSubs (subsEntry : SubsEntry ): RawSubscription ? {
0 commit comments