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 {
|
for _, rule := range rules {
|
||||||
switch rule.Type {
|
switch rule.Type {
|
||||||
case C.RuleTypeDefault:
|
case C.RuleTypeDefault:
|
||||||
if rule.DefaultOptions.ClashMode != "" {
|
clashMode = append(clashMode, rule.DefaultOptions.ClashMode...)
|
||||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode)
|
|
||||||
}
|
|
||||||
case C.RuleTypeLogical:
|
case C.RuleTypeLogical:
|
||||||
clashMode = append(clashMode, extraClashModeFromRule(rule.LogicalOptions.Rules)...)
|
clashMode = append(clashMode, extraClashModeFromRule(rule.LogicalOptions.Rules)...)
|
||||||
}
|
}
|
||||||
@ -70,9 +68,7 @@ func extraClashModeFromDNSRule(rules []option.DNSRule) []string {
|
|||||||
for _, rule := range rules {
|
for _, rule := range rules {
|
||||||
switch rule.Type {
|
switch rule.Type {
|
||||||
case C.RuleTypeDefault:
|
case C.RuleTypeDefault:
|
||||||
if rule.DefaultOptions.ClashMode != "" {
|
clashMode = append(clashMode, rule.DefaultOptions.ClashMode...)
|
||||||
clashMode = append(clashMode, rule.DefaultOptions.ClashMode)
|
|
||||||
}
|
|
||||||
case C.RuleTypeLogical:
|
case C.RuleTypeLogical:
|
||||||
clashMode = append(clashMode, extraClashModeFromDNSRule(rule.LogicalOptions.Rules)...)
|
clashMode = append(clashMode, extraClashModeFromDNSRule(rule.LogicalOptions.Rules)...)
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ type _DefaultRule struct {
|
|||||||
PackageName Listable[string] `json:"package_name,omitempty"`
|
PackageName Listable[string] `json:"package_name,omitempty"`
|
||||||
User Listable[string] `json:"user,omitempty"`
|
User Listable[string] `json:"user,omitempty"`
|
||||||
UserID Listable[int32] `json:"user_id,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"`
|
WIFISSID Listable[string] `json:"wifi_ssid,omitempty"`
|
||||||
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
||||||
RuleSet Listable[string] `json:"rule_set,omitempty"`
|
RuleSet Listable[string] `json:"rule_set,omitempty"`
|
||||||
|
@ -93,7 +93,7 @@ type _DefaultDNSRule struct {
|
|||||||
User Listable[string] `json:"user,omitempty"`
|
User Listable[string] `json:"user,omitempty"`
|
||||||
UserID Listable[int32] `json:"user_id,omitempty"`
|
UserID Listable[int32] `json:"user_id,omitempty"`
|
||||||
Outbound Listable[string] `json:"outbound,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"`
|
WIFISSID Listable[string] `json:"wifi_ssid,omitempty"`
|
||||||
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
WIFIBSSID Listable[string] `json:"wifi_bssid,omitempty"`
|
||||||
RuleSet Listable[string] `json:"rule_set,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.items = append(rule.items, item)
|
||||||
rule.allItems = append(rule.allItems, item)
|
rule.allItems = append(rule.allItems, item)
|
||||||
}
|
}
|
||||||
if options.ClashMode != "" {
|
if len(options.ClashMode) > 0 {
|
||||||
item := NewClashModeItem(router, options.ClashMode)
|
item := NewClashModeItem(router, options.ClashMode)
|
||||||
rule.items = append(rule.items, item)
|
rule.items = append(rule.items, item)
|
||||||
rule.allItems = append(rule.allItems, 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.items = append(rule.items, item)
|
||||||
rule.allItems = append(rule.allItems, item)
|
rule.allItems = append(rule.allItems, item)
|
||||||
}
|
}
|
||||||
if options.ClashMode != "" {
|
if len(options.ClashMode) > 0 {
|
||||||
item := NewClashModeItem(router, options.ClashMode)
|
item := NewClashModeItem(router, options.ClashMode)
|
||||||
rule.items = append(rule.items, item)
|
rule.items = append(rule.items, item)
|
||||||
rule.allItems = append(rule.allItems, item)
|
rule.allItems = append(rule.allItems, item)
|
||||||
|
@ -4,19 +4,20 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/sagernet/sing-box/adapter"
|
"github.com/sagernet/sing-box/adapter"
|
||||||
|
"github.com/sagernet/sing/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ RuleItem = (*ClashModeItem)(nil)
|
var _ RuleItem = (*ClashModeItem)(nil)
|
||||||
|
|
||||||
type ClashModeItem struct {
|
type ClashModeItem struct {
|
||||||
router adapter.Router
|
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{
|
return &ClashModeItem{
|
||||||
router: router,
|
router: router,
|
||||||
mode: mode,
|
modes: modes,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,9 +26,15 @@ func (r *ClashModeItem) Match(metadata *adapter.InboundContext) bool {
|
|||||||
if clashServer == nil {
|
if clashServer == nil {
|
||||||
return false
|
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 {
|
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