Clash.Meta/rule/geosite.go

82 lines
1.8 KiB
Go
Raw Normal View History

2021-07-01 22:49:29 +08:00
package rules
import (
"fmt"
"github.com/Dreamacro/clash/component/geodata"
"github.com/Dreamacro/clash/component/geodata/router"
2022-02-23 01:00:27 +08:00
_ "github.com/Dreamacro/clash/component/geodata/standard"
2021-07-01 22:49:29 +08:00
C "github.com/Dreamacro/clash/constant"
"github.com/Dreamacro/clash/log"
)
type GEOSITE struct {
country string
adapter string
ruleExtra *C.RuleExtra
matcher *router.DomainMatcher
2021-07-01 22:49:29 +08:00
}
func (gs *GEOSITE) RuleType() C.RuleType {
return C.GEOSITE
}
func (gs *GEOSITE) Match(metadata *C.Metadata) bool {
if metadata.AddrType != C.AtypDomainName {
return false
}
domain := metadata.Host
return gs.matcher.ApplyDomain(domain)
}
func (gs *GEOSITE) Adapter() string {
return gs.adapter
}
func (gs *GEOSITE) Payload() string {
return gs.country
}
func (gs *GEOSITE) ShouldResolveIP() bool {
return false
}
func (gs *GEOSITE) RuleExtra() *C.RuleExtra {
return gs.ruleExtra
2021-07-01 22:49:29 +08:00
}
func NewGEOSITE(country string, adapter string, ruleExtra *C.RuleExtra) (*GEOSITE, error) {
2021-07-01 22:49:29 +08:00
geoLoaderName := "standard"
geoLoader, err := geodata.GetGeoDataLoader(geoLoaderName)
if err != nil {
2021-10-28 00:06:55 +08:00
return nil, fmt.Errorf("load GeoSite data error, %s", err.Error())
2021-07-01 22:49:29 +08:00
}
domains, err := geoLoader.LoadGeoSite(country)
if err != nil {
2021-10-28 00:06:55 +08:00
return nil, fmt.Errorf("load GeoSite data error, %s", err.Error())
2021-07-01 22:49:29 +08:00
}
2021-10-28 00:06:55 +08:00
/**
linear: linear algorithm
matcher, err := router.NewDomainMatcher(domains)
mphminimal perfect hash algorithm
*/
2021-07-01 22:49:29 +08:00
matcher, err := router.NewMphMatcherGroup(domains)
if err != nil {
2021-10-28 00:06:55 +08:00
return nil, fmt.Errorf("load GeoSite data error, %s", err.Error())
2021-07-01 22:49:29 +08:00
}
log.Infoln("Start initial GeoSite rule %s => %s, records: %d", country, adapter, len(domains))
geoSite := &GEOSITE{
country: country,
adapter: adapter,
ruleExtra: ruleExtra,
matcher: matcher,
2021-07-01 22:49:29 +08:00
}
return geoSite, nil
}