mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-18 22:20:06 +08:00
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package libcore
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
geosites "github.com/sagernet/sing-box/common/geosite"
|
|
C "github.com/sagernet/sing-box/constant"
|
|
"github.com/sagernet/sing-box/nekoutils"
|
|
"github.com/sagernet/sing-box/option"
|
|
)
|
|
|
|
type geosite struct {
|
|
geositeReader *geosites.Reader
|
|
}
|
|
|
|
func (g *geosite) Open(path string) error {
|
|
geositeReader, _, err := geosites.Open(path)
|
|
g.geositeReader = geositeReader
|
|
return err
|
|
}
|
|
|
|
func (g *geosite) Rules(code string) ([]option.HeadlessRule, error) {
|
|
sourceSet, err := g.geositeReader.Read(code)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to read geosite code %s :%w", code, err)
|
|
}
|
|
|
|
var headlessRule option.DefaultHeadlessRule
|
|
|
|
defaultRule := geosites.Compile(sourceSet)
|
|
|
|
headlessRule.Domain = defaultRule.Domain
|
|
headlessRule.DomainSuffix = defaultRule.DomainSuffix
|
|
headlessRule.DomainKeyword = defaultRule.DomainKeyword
|
|
headlessRule.DomainRegex = defaultRule.DomainRegex
|
|
|
|
return []option.HeadlessRule{
|
|
{
|
|
Type: C.RuleTypeDefault,
|
|
DefaultOptions: headlessRule,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func init() {
|
|
nekoutils.GetGeoSiteHeadlessRules = func(name string) ([]option.HeadlessRule, error) {
|
|
g := new(geosite)
|
|
if err := g.Open(filepath.Join(externalAssetsPath, "geosite.db")); err != nil {
|
|
return nil, err
|
|
}
|
|
return g.Rules(name)
|
|
}
|
|
}
|