diff --git a/model/clash.go b/model/clash.go index 7025cb4..401db6d 100644 --- a/model/clash.go +++ b/model/clash.go @@ -1,5 +1,7 @@ package model +import "github.com/bestnite/sub2clash/parser" + type ClashType int const ( @@ -8,29 +10,19 @@ const ( ) func GetSupportProxyTypes(clashType ClashType) map[string]bool { - if clashType == Clash { - return map[string]bool{ - "ss": true, - "ssr": true, - "vmess": true, - "trojan": true, - "socks5": true, + supportProxyTypes := make(map[string]bool) + + for _, parser := range parser.GetAllParsers() { + if clashType == Clash { + if parser.SupportClash() { + supportProxyTypes[parser.GetType()] = true + } + } else if clashType == ClashMeta { + if parser.SupportMeta() { + supportProxyTypes[parser.GetType()] = true + } } } - if clashType == ClashMeta { - return map[string]bool{ - "ss": true, - "ssr": true, - "vmess": true, - "trojan": true, - "vless": true, - "hysteria": true, - "hysteria2": true, - "socks5": true, - "anytls": true, - } - } - - return nil + return supportProxyTypes } diff --git a/parser/anytls.go b/parser/anytls.go index 64dbadc..1d2ee2c 100644 --- a/parser/anytls.go +++ b/parser/anytls.go @@ -11,6 +11,14 @@ import ( type AnytlsParser struct{} +func (p *AnytlsParser) SupportClash() bool { + return false +} + +func (p *AnytlsParser) SupportMeta() bool { + return true +} + func (p *AnytlsParser) GetPrefixes() []string { return []string{"anytls://"} } diff --git a/parser/hysteria.go b/parser/hysteria.go index 1624220..7da3450 100644 --- a/parser/hysteria.go +++ b/parser/hysteria.go @@ -12,6 +12,14 @@ import ( type HysteriaParser struct{} +func (p *HysteriaParser) SupportClash() bool { + return false +} + +func (p *HysteriaParser) SupportMeta() bool { + return true +} + func (p *HysteriaParser) GetPrefixes() []string { return []string{"hysteria://"} } diff --git a/parser/hysteria2.go b/parser/hysteria2.go index 0734c5d..50685c5 100644 --- a/parser/hysteria2.go +++ b/parser/hysteria2.go @@ -11,6 +11,14 @@ import ( type Hysteria2Parser struct{} +func (p *Hysteria2Parser) SupportClash() bool { + return false +} + +func (p *Hysteria2Parser) SupportMeta() bool { + return true +} + func (p *Hysteria2Parser) GetPrefixes() []string { return []string{"hysteria2://", "hy2://"} } diff --git a/parser/registry.go b/parser/registry.go index 829fbf9..881c4e1 100644 --- a/parser/registry.go +++ b/parser/registry.go @@ -16,6 +16,8 @@ type ProxyParser interface { GetPrefixes() []string // GetType 返回协议类型名称 GetType() string + SupportClash() bool + SupportMeta() bool } // parserRegistry 解析器注册中心 diff --git a/parser/shadowsocks.go b/parser/shadowsocks.go index 240133b..2443f73 100644 --- a/parser/shadowsocks.go +++ b/parser/shadowsocks.go @@ -12,6 +12,14 @@ import ( // ShadowsocksParser Shadowsocks协议解析器 type ShadowsocksParser struct{} +func (p *ShadowsocksParser) SupportClash() bool { + return true +} + +func (p *ShadowsocksParser) SupportMeta() bool { + return true +} + // GetPrefixes 返回支持的协议前缀 func (p *ShadowsocksParser) GetPrefixes() []string { return []string{"ss://"} diff --git a/parser/shadowsocksr.go b/parser/shadowsocksr.go index da68a53..3dbf7ec 100644 --- a/parser/shadowsocksr.go +++ b/parser/shadowsocksr.go @@ -11,6 +11,14 @@ import ( type ShadowsocksRParser struct{} +func (p *ShadowsocksRParser) SupportClash() bool { + return true +} + +func (p *ShadowsocksRParser) SupportMeta() bool { + return true +} + func (p *ShadowsocksRParser) GetPrefixes() []string { return []string{"ssr://"} } diff --git a/parser/socks.go b/parser/socks.go index ec3968d..5fc3985 100644 --- a/parser/socks.go +++ b/parser/socks.go @@ -11,6 +11,13 @@ import ( type SocksParser struct{} +func (p *SocksParser) SupportClash() bool { + return true +} +func (p *SocksParser) SupportMeta() bool { + return true +} + func (p *SocksParser) GetPrefixes() []string { return []string{"socks://"} } diff --git a/parser/trojan.go b/parser/trojan.go index f639c13..674f069 100644 --- a/parser/trojan.go +++ b/parser/trojan.go @@ -11,6 +11,14 @@ import ( type TrojanParser struct{} +func (p *TrojanParser) SupportClash() bool { + return true +} + +func (p *TrojanParser) SupportMeta() bool { + return true +} + func (p *TrojanParser) GetPrefixes() []string { return []string{"trojan://"} } diff --git a/parser/vless.go b/parser/vless.go index ad3a17e..61c8874 100644 --- a/parser/vless.go +++ b/parser/vless.go @@ -11,6 +11,14 @@ import ( type VlessParser struct{} +func (p *VlessParser) SupportClash() bool { + return false +} + +func (p *VlessParser) SupportMeta() bool { + return true +} + func (p *VlessParser) GetPrefixes() []string { return []string{"vless://"} } diff --git a/parser/vmess.go b/parser/vmess.go index 0206f94..3659bf0 100644 --- a/parser/vmess.go +++ b/parser/vmess.go @@ -12,6 +12,14 @@ import ( type VmessParser struct{} +func (p *VmessParser) SupportClash() bool { + return true +} + +func (p *VmessParser) SupportMeta() bool { + return true +} + func (p *VmessParser) GetPrefixes() []string { return []string{"vmess://"} }