@@ -3,7 +3,7 @@ import { ref } from 'vue'
33import { parse } from 'yaml'
44
55import { Copyfile , Readfile , Writefile , HttpGet , Download , FileExists } from '@/bridge'
6- import { RulesetsFilePath , EmptyRuleSet } from '@/constant'
6+ import { RulesetsFilePath , EmptyRuleSet , RulesetHubFilePath } from '@/constant'
77import { RulesetBehavior , RulesetFormat } from '@/enums/kernel'
88import {
99 debounce ,
@@ -14,7 +14,7 @@ import {
1414 asyncPool ,
1515} from '@/utils'
1616
17- export type RuleSetType = {
17+ export interface RuleSet {
1818 id : string
1919 name : string
2020 updateTime : number
@@ -29,20 +29,30 @@ export type RuleSetType = {
2929 updating ?: boolean
3030}
3131
32+ export interface RulesetHub {
33+ geosite : string
34+ geoip : string
35+ list : { name : string ; type : 'geosite' | 'geoip' ; description : string ; count : number } [ ]
36+ }
37+
3238export const useRulesetsStore = defineStore ( 'rulesets' , ( ) => {
33- const rulesets = ref < RuleSetType [ ] > ( [ ] )
39+ const rulesets = ref < RuleSet [ ] > ( [ ] )
40+ const rulesetHub = ref < RulesetHub > ( { geosite : '' , geoip : '' , list : [ ] } )
3441
3542 const setupRulesets = async ( ) => {
3643 const data = await ignoredError ( Readfile , RulesetsFilePath )
3744 data && ( rulesets . value = parse ( data ) )
45+
46+ const list = await ignoredError ( Readfile , RulesetHubFilePath )
47+ list && ( rulesetHub . value = JSON . parse ( list ) )
3848 }
3949
4050 const saveRulesets = debounce ( async ( ) => {
4151 const r = omitArray ( rulesets . value , [ 'updating' ] )
4252 await Writefile ( RulesetsFilePath , stringifyNoFolding ( r ) )
4353 } , 500 )
4454
45- const addRuleset = async ( r : RuleSetType ) => {
55+ const addRuleset = async ( r : RuleSet ) => {
4656 rulesets . value . push ( r )
4757 try {
4858 await saveRulesets ( )
@@ -64,7 +74,7 @@ export const useRulesetsStore = defineStore('rulesets', () => {
6474 }
6575 }
6676
67- const editRuleset = async ( id : string , r : RuleSetType ) => {
77+ const editRuleset = async ( id : string , r : RuleSet ) => {
6878 const idx = rulesets . value . findIndex ( ( v ) => v . id === id )
6979 if ( idx === - 1 ) return
7080 const backup = rulesets . value . splice ( idx , 1 , r ) [ 0 ]
@@ -76,7 +86,7 @@ export const useRulesetsStore = defineStore('rulesets', () => {
7686 }
7787 }
7888
79- const _doUpdateRuleset = async ( r : RuleSetType ) => {
89+ const _doUpdateRuleset = async ( r : RuleSet ) => {
8090 if ( r . format === RulesetFormat . Yaml ) {
8191 let body = ''
8292 let isExist = true
@@ -140,7 +150,7 @@ export const useRulesetsStore = defineStore('rulesets', () => {
140150 const updateRulesets = async ( ) => {
141151 let needSave = false
142152
143- const update = async ( r : RuleSetType ) => {
153+ const update = async ( r : RuleSet ) => {
144154 try {
145155 r . updating = true
146156 await _doUpdateRuleset ( r )
@@ -159,6 +169,20 @@ export const useRulesetsStore = defineStore('rulesets', () => {
159169 if ( needSave ) saveRulesets ( )
160170 }
161171
172+ const rulesetHubLoading = ref ( false )
173+ const updateRulesetHub = async ( ) => {
174+ rulesetHubLoading . value = true
175+ try {
176+ const { body } = await HttpGet < string > (
177+ 'https://github.com/GUI-for-Cores/Ruleset-Hub/releases/download/latest/meta-full.json' ,
178+ )
179+ rulesetHub . value = JSON . parse ( body )
180+ await Writefile ( RulesetHubFilePath , body )
181+ } finally {
182+ rulesetHubLoading . value = false
183+ }
184+ }
185+
162186 const getRulesetById = ( id : string ) => rulesets . value . find ( ( v ) => v . id === id )
163187
164188 const getRulesetByName = ( name : string ) => rulesets . value . find ( ( v ) => v . name === name )
@@ -174,5 +198,9 @@ export const useRulesetsStore = defineStore('rulesets', () => {
174198 updateRulesets,
175199 getRulesetById,
176200 getRulesetByName,
201+
202+ rulesetHub,
203+ rulesetHubLoading,
204+ updateRulesetHub,
177205 }
178206} )
0 commit comments