diff --git a/adapter/outboundgroup/fallback.go b/adapter/outboundgroup/fallback.go index 0a4dab413..22ca6db98 100644 --- a/adapter/outboundgroup/fallback.go +++ b/adapter/outboundgroup/fallback.go @@ -132,6 +132,7 @@ func NewFallback(option *GroupCommonOption, providers []provider.ProxyProvider) }, option.Filter, option.ExcludeFilter, + option.ExcludeType, providers, }), disableUDP: option.DisableUDP, diff --git a/adapter/outboundgroup/groupbase.go b/adapter/outboundgroup/groupbase.go index 426a12824..53c08ad63 100644 --- a/adapter/outboundgroup/groupbase.go +++ b/adapter/outboundgroup/groupbase.go @@ -20,6 +20,7 @@ type GroupBase struct { *outbound.Base filterRegs []*regexp2.Regexp excludeFilterReg *regexp2.Regexp + excludeTypeArray []string providers []provider.ProxyProvider failedTestMux sync.Mutex failedTimes int @@ -33,6 +34,7 @@ type GroupBaseOption struct { outbound.BaseOption filter string excludeFilter string + excludeType string providers []provider.ProxyProvider } @@ -41,6 +43,10 @@ func NewGroupBase(opt GroupBaseOption) *GroupBase { if opt.excludeFilter != "" { excludeFilterReg = regexp2.MustCompile(opt.excludeFilter, 0) } + var excludeTypeArray []string + if opt.excludeType!="" { + excludeTypeArray=strings.Split(opt.excludeType,"|") + } var filterRegs []*regexp2.Regexp if opt.filter != "" { @@ -54,6 +60,7 @@ func NewGroupBase(opt GroupBaseOption) *GroupBase { Base: outbound.NewBase(opt.BaseOption), filterRegs: filterRegs, excludeFilterReg: excludeFilterReg, + excludeTypeArray: excludeTypeArray, providers: opt.providers, failedTesting: atomic.NewBool(false), } @@ -148,6 +155,24 @@ func (gb *GroupBase) GetProxies(touch bool) []C.Proxy { } proxies = newProxies } + if gb.excludeTypeArray !=nil{ + var newProxies []C.Proxy + for _, p := range proxies { + mType := p.Type().String() + flag:=false + for i := range gb.excludeTypeArray { + if(strings.EqualFold(mType,gb.excludeTypeArray[i])){ + flag=true + } + + } + if(flag){ + continue + } + newProxies = append(newProxies, p) + } + proxies = newProxies + } if gb.excludeFilterReg != nil { var newProxies []C.Proxy diff --git a/adapter/outboundgroup/loadbalance.go b/adapter/outboundgroup/loadbalance.go index 7f8754518..0098c5058 100644 --- a/adapter/outboundgroup/loadbalance.go +++ b/adapter/outboundgroup/loadbalance.go @@ -229,6 +229,7 @@ func NewLoadBalance(option *GroupCommonOption, providers []provider.ProxyProvide }, option.Filter, option.ExcludeFilter, + option.ExcludeType, providers, }), strategyFn: strategyFn, diff --git a/adapter/outboundgroup/parser.go b/adapter/outboundgroup/parser.go index 53a82a60d..d8c6db51a 100644 --- a/adapter/outboundgroup/parser.go +++ b/adapter/outboundgroup/parser.go @@ -31,6 +31,7 @@ type GroupCommonOption struct { DisableUDP bool `group:"disable-udp,omitempty"` Filter string `group:"filter,omitempty"` ExcludeFilter string `group:"exclude-filter,omitempty"` + ExcludeType string `group:"exclude-type,omitempty"` } func ParseProxyGroup(config map[string]any, proxyMap map[string]C.Proxy, providersMap map[string]types.ProxyProvider) (C.ProxyAdapter, error) { diff --git a/adapter/outboundgroup/relay.go b/adapter/outboundgroup/relay.go index 43ef81c96..908204a57 100644 --- a/adapter/outboundgroup/relay.go +++ b/adapter/outboundgroup/relay.go @@ -191,6 +191,7 @@ func NewRelay(option *GroupCommonOption, providers []provider.ProxyProvider) *Re }, "", "", + "", providers, }), } diff --git a/adapter/outboundgroup/selector.go b/adapter/outboundgroup/selector.go index 71ebacce2..de0e3c505 100644 --- a/adapter/outboundgroup/selector.go +++ b/adapter/outboundgroup/selector.go @@ -100,6 +100,7 @@ func NewSelector(option *GroupCommonOption, providers []provider.ProxyProvider) }, option.Filter, option.ExcludeFilter, + option.ExcludeType, providers, }), selected: "COMPATIBLE", diff --git a/adapter/outboundgroup/urltest.go b/adapter/outboundgroup/urltest.go index 55c1cc7c4..1ded16560 100644 --- a/adapter/outboundgroup/urltest.go +++ b/adapter/outboundgroup/urltest.go @@ -144,6 +144,7 @@ func NewURLTest(option *GroupCommonOption, providers []provider.ProxyProvider, o option.Filter, option.ExcludeFilter, + option.ExcludeType, providers, }), fastSingle: singledo.NewSingle[C.Proxy](time.Second * 10),