2022-02-23 02:38:50 +08:00
|
|
|
|
package geodata
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/Dreamacro/clash/component/geodata/router"
|
2022-06-06 03:13:10 +08:00
|
|
|
|
|
|
|
|
|
"golang.org/x/exp/maps"
|
2022-02-23 02:38:50 +08:00
|
|
|
|
)
|
|
|
|
|
|
2022-06-06 03:13:10 +08:00
|
|
|
|
func loadGeoSiteMatcher(countryCode string) (*router.DomainMatcher, int, error) {
|
2022-02-23 02:38:50 +08:00
|
|
|
|
geoLoaderName := "standard"
|
|
|
|
|
geoLoader, err := GetGeoDataLoader(geoLoaderName)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
domains, err := geoLoader.LoadGeoSite(countryCode)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
linear: linear algorithm
|
|
|
|
|
matcher, err := router.NewDomainMatcher(domains)
|
|
|
|
|
mph:minimal perfect hash algorithm
|
|
|
|
|
*/
|
|
|
|
|
matcher, err := router.NewMphMatcherGroup(domains)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return matcher, len(domains), nil
|
|
|
|
|
}
|
2022-06-06 03:13:10 +08:00
|
|
|
|
|
|
|
|
|
var ruleProviders = make(map[string]*router.DomainMatcher)
|
|
|
|
|
|
|
|
|
|
// HasProvider has geo site provider by county code
|
|
|
|
|
func HasProvider(countyCode string) (ok bool) {
|
|
|
|
|
_, ok = ruleProviders[countyCode]
|
|
|
|
|
return ok
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetProvidersList get geo site providers
|
|
|
|
|
func GetProvidersList(countyCode string) []*router.DomainMatcher {
|
|
|
|
|
return maps.Values(ruleProviders)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetProviderByCode get geo site provider by county code
|
|
|
|
|
func GetProviderByCode(countyCode string) (matcher *router.DomainMatcher, ok bool) {
|
|
|
|
|
matcher, ok = ruleProviders[countyCode]
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func LoadProviderByCode(countyCode string) (matcher *router.DomainMatcher, count int, err error) {
|
|
|
|
|
var ok bool
|
|
|
|
|
matcher, ok = ruleProviders[countyCode]
|
|
|
|
|
if !ok {
|
|
|
|
|
if matcher, count, err = loadGeoSiteMatcher(countyCode); err == nil {
|
|
|
|
|
ruleProviders[countyCode] = matcher
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|