mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-06-13 21:54:13 +08:00
support multi clash_mode
item in rule item
(cherry picked from commit 2ef85aafb5b94883af2d9305913f35296375b648)
This commit is contained in:
parent
72266f8e2d
commit
1650ab2ae3
@ -55,9 +55,7 @@ func extraClashModeFromRule(rules []option.Rule) []string {
|
||||
for _, rule := range rules {
|
||||
switch rule.Type {
|
||||
case C.RuleTypeDefault:
|
||||
if rule.DefaultOptions.ClashMode != "" {
|
||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode)
|
||||
}
|
||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode...)
|
||||
case C.RuleTypeLogical:
|
||||
clashMode = append(clashMode, extraClashModeFromRule(rule.LogicalOptions.Rules)...)
|
||||
}
|
||||
@ -70,9 +68,7 @@ func extraClashModeFromDNSRule(rules []option.DNSRule) []string {
|
||||
for _, rule := range rules {
|
||||
switch rule.Type {
|
||||
case C.RuleTypeDefault:
|
||||
if rule.DefaultOptions.ClashMode != "" {
|
||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode)
|
||||
}
|
||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode...)
|
||||
case C.RuleTypeLogical:
|
||||
clashMode = append(clashMode, extraClashModeFromDNSRule(rule.LogicalOptions.Rules)...)
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ type _DefaultRule struct {
|
||||
PackageName Listable[string] `json:"package_name,omitempty"`
|
||||
User Listable[string] `json:"user,omitempty"`
|
||||
UserID Listable[int32] `json:"user_id,omitempty"`
|
||||
ClashMode string `json:"clash_mode,omitempty"`
|
||||
ClashMode Listable[string] `json:"clash_mode,omitempty"`
|
||||
WIFISSID Listable[string] `json:"wifi_ssid,omitempty"`
|
||||
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
||||
RuleSet Listable[string] `json:"rule_set,omitempty"`
|
||||
|
@ -93,7 +93,7 @@ type _DefaultDNSRule struct {
|
||||
User Listable[string] `json:"user,omitempty"`
|
||||
UserID Listable[int32] `json:"user_id,omitempty"`
|
||||
Outbound Listable[string] `json:"outbound,omitempty"`
|
||||
ClashMode string `json:"clash_mode,omitempty"`
|
||||
ClashMode Listable[string] `json:"clash_mode,omitempty"`
|
||||
WIFISSID Listable[string] `json:"wifi_ssid,omitempty"`
|
||||
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
||||
RuleSet Listable[string] `json:"rule_set,omitempty"`
|
||||
|
@ -203,7 +203,7 @@ func NewDefaultRule(router adapter.Router, logger log.ContextLogger, options opt
|
||||
rule.items = append(rule.items, item)
|
||||
rule.allItems = append(rule.allItems, item)
|
||||
}
|
||||
if options.ClashMode != "" {
|
||||
if len(options.ClashMode) > 0 {
|
||||
item := NewClashModeItem(router, options.ClashMode)
|
||||
rule.items = append(rule.items, item)
|
||||
rule.allItems = append(rule.allItems, item)
|
||||
|
@ -211,7 +211,7 @@ func NewDefaultDNSRule(router adapter.Router, logger log.ContextLogger, options
|
||||
rule.items = append(rule.items, item)
|
||||
rule.allItems = append(rule.allItems, item)
|
||||
}
|
||||
if options.ClashMode != "" {
|
||||
if len(options.ClashMode) > 0 {
|
||||
item := NewClashModeItem(router, options.ClashMode)
|
||||
rule.items = append(rule.items, item)
|
||||
rule.allItems = append(rule.allItems, item)
|
||||
|
@ -4,19 +4,20 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/sagernet/sing-box/adapter"
|
||||
"github.com/sagernet/sing/common"
|
||||
)
|
||||
|
||||
var _ RuleItem = (*ClashModeItem)(nil)
|
||||
|
||||
type ClashModeItem struct {
|
||||
router adapter.Router
|
||||
mode string
|
||||
modes []string
|
||||
}
|
||||
|
||||
func NewClashModeItem(router adapter.Router, mode string) *ClashModeItem {
|
||||
func NewClashModeItem(router adapter.Router, modes []string) *ClashModeItem {
|
||||
return &ClashModeItem{
|
||||
router: router,
|
||||
mode: mode,
|
||||
modes: modes,
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,9 +26,15 @@ func (r *ClashModeItem) Match(metadata *adapter.InboundContext) bool {
|
||||
if clashServer == nil {
|
||||
return false
|
||||
}
|
||||
return strings.EqualFold(clashServer.Mode(), r.mode)
|
||||
return common.Any(r.modes, func(mode string) bool {
|
||||
return strings.EqualFold(clashServer.Mode(), mode)
|
||||
})
|
||||
}
|
||||
|
||||
func (r *ClashModeItem) String() string {
|
||||
return "clash_mode=" + r.mode
|
||||
modeStr := r.modes[0]
|
||||
if len(r.modes) > 1 {
|
||||
modeStr = "[" + strings.Join(r.modes, ", ") + "]"
|
||||
}
|
||||
return "clash_mode=" + modeStr
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user