package dispatcher import ( "github.com/Yuzuki616/V2bX/api/panel" "reflect" "sync" ) type Rule struct { Rule *sync.Map // Key: Tag, Value: *panel.DetectRule } func NewRule() *Rule { return &Rule{ Rule: new(sync.Map), } } func (r *Rule) UpdateRule(tag string, newRuleList *panel.DetectRule) error { if value, ok := r.Rule.LoadOrStore(tag, newRuleList); ok { oldRuleList := value.([]panel.DestinationRule) if !reflect.DeepEqual(oldRuleList, newRuleList) { r.Rule.Store(tag, newRuleList) } } return nil } func (r *Rule) Detect(tag string, destination string, protocol string) (reject bool) { reject = false // If we have some rule for this inbound if value, ok := r.Rule.Load(tag); ok { ruleList := value.(*panel.DetectRule) for i, _ := range ruleList.DestinationRule { if ruleList.DestinationRule[i].Pattern.Match([]byte(destination)) { reject = true break } } if !reject { for _, v := range ruleList.ProtocolRule { if v == protocol { return true } } } } return reject }