feat: 尝试实现脚本rule

This commit is contained in:
Skyxim
2022-06-05 17:28:19 +08:00
parent 20cb4d0643
commit 55c7c4edb3
4 changed files with 91 additions and 5 deletions

68
rule/common/script.go Normal file
View File

@@ -0,0 +1,68 @@
package common
import (
"github.com/Dreamacro/clash/component/js"
C "github.com/Dreamacro/clash/constant"
"github.com/gofrs/uuid"
)
type Script struct {
*Base
adapter string
name string
}
func (s *Script) RuleType() C.RuleType {
return C.Script
}
func (s *Script) Match(metadata *C.Metadata) bool {
res := false
js.Run(s.name, map[string]any{
"metadata": metadata,
}, func(a any, err error) {
if err != nil {
res = false
}
r, ok := a.(bool)
if !ok {
res = false
}
res = r
})
return res
}
func (s *Script) Adapter() string {
return s.adapter
}
func (s *Script) Payload() string {
return s.adapter
}
func (s *Script) ShouldResolveIP() bool {
return true
}
func NewScript(script string, adapter string) (*Script, error) {
name, err := uuid.NewV4()
if err != nil {
return nil, err
}
if err := js.NewJS(name.String(), script); err != nil {
return nil, err
}
return &Script{
Base: &Base{},
adapter: adapter,
name: name.String(),
}, nil
}
var _ C.Rule = (*Script)(nil)

View File

@@ -43,6 +43,8 @@ func ParseSameRule(tp, payload, target string, params []string) (parsed C.Rule,
parsed, parseErr = RC.NewUid(payload, target)
case "IN-TYPE":
parsed, parseErr = RC.NewInType(payload, target)
case "SCRIPT":
parsed, parseErr = RC.NewScript(payload, target)
default:
parseErr = fmt.Errorf("unsupported rule type %s", tp)
}