mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-11-04 06:22:52 +00:00 
			
		
		
		
	add anytls support
This commit is contained in:
		
							parent
							
								
									cee5d0ad89
								
							
						
					
					
						commit
						3e20ef1e8a
					
				
					 25 changed files with 222 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -11,5 +11,6 @@ public enum EConfigType
 | 
			
		|||
    Hysteria2 = 7,
 | 
			
		||||
    TUIC = 8,
 | 
			
		||||
    WireGuard = 9,
 | 
			
		||||
    HTTP = 10
 | 
			
		||||
    HTTP = 10,
 | 
			
		||||
    Anytls = 11
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -169,7 +169,8 @@ public class Global
 | 
			
		|||
            { EConfigType.Trojan, "trojan://" },
 | 
			
		||||
            { EConfigType.Hysteria2, "hysteria2://" },
 | 
			
		||||
            { EConfigType.TUIC, "tuic://" },
 | 
			
		||||
            { EConfigType.WireGuard, "wireguard://" }
 | 
			
		||||
            { EConfigType.WireGuard, "wireguard://" },
 | 
			
		||||
            { EConfigType.Anytls, "anytls://" }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    public static readonly Dictionary<EConfigType, string> ProtocolTypes = new()
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +183,8 @@ public class Global
 | 
			
		|||
            { EConfigType.Trojan, "trojan" },
 | 
			
		||||
            { EConfigType.Hysteria2, "hysteria2" },
 | 
			
		||||
            { EConfigType.TUIC, "tuic" },
 | 
			
		||||
            { EConfigType.WireGuard, "wireguard" }
 | 
			
		||||
            { EConfigType.WireGuard, "wireguard" },
 | 
			
		||||
            { EConfigType.Anytls, "anytls" }
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
    public static readonly List<string> VmessSecurities =
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -259,6 +259,7 @@ public class ConfigHandler
 | 
			
		|||
            EConfigType.Hysteria2 => await AddHysteria2Server(config, item),
 | 
			
		||||
            EConfigType.TUIC => await AddTuicServer(config, item),
 | 
			
		||||
            EConfigType.WireGuard => await AddWireguardServer(config, item),
 | 
			
		||||
            EConfigType.Anytls => await AddAnytlsServer(config, item),
 | 
			
		||||
            _ => -1,
 | 
			
		||||
        };
 | 
			
		||||
        return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -783,6 +784,35 @@ public class ConfigHandler
 | 
			
		|||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Add or edit a Anytls server
 | 
			
		||||
    /// Validates and processes Anytls-specific settings
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="config">Current configuration</param>
 | 
			
		||||
    /// <param name="profileItem">Anytls profile to add</param>
 | 
			
		||||
    /// <param name="toFile">Whether to save to file</param>
 | 
			
		||||
    /// <returns>0 if successful, -1 if failed</returns>
 | 
			
		||||
    public static async Task<int> AddAnytlsServer(Config config, ProfileItem profileItem, bool toFile = true)
 | 
			
		||||
    {
 | 
			
		||||
        profileItem.ConfigType = EConfigType.Anytls;
 | 
			
		||||
        profileItem.CoreType = ECoreType.sing_box;
 | 
			
		||||
 | 
			
		||||
        profileItem.Address = profileItem.Address.TrimEx();
 | 
			
		||||
        profileItem.Id = profileItem.Id.TrimEx();
 | 
			
		||||
        profileItem.Security = profileItem.Security.TrimEx();
 | 
			
		||||
        profileItem.Network = string.Empty;
 | 
			
		||||
        if (profileItem.StreamSecurity.IsNullOrEmpty())
 | 
			
		||||
        {
 | 
			
		||||
            profileItem.StreamSecurity = Global.StreamSecurity;
 | 
			
		||||
        }
 | 
			
		||||
        if (profileItem.Id.IsNullOrEmpty())
 | 
			
		||||
        {
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
        await AddServerCommon(config, profileItem, toFile);
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sort the server list by the specified column
 | 
			
		||||
    /// Updates the sort order in the profile extension data
 | 
			
		||||
| 
						 | 
				
			
			@ -1277,6 +1307,7 @@ public class ConfigHandler
 | 
			
		|||
                EConfigType.Hysteria2 => await AddHysteria2Server(config, profileItem, false),
 | 
			
		||||
                EConfigType.TUIC => await AddTuicServer(config, profileItem, false),
 | 
			
		||||
                EConfigType.WireGuard => await AddWireguardServer(config, profileItem, false),
 | 
			
		||||
                EConfigType.Anytls => await AddAnytlsServer(config, profileItem, false),
 | 
			
		||||
                _ => -1,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ public class CoreHandler
 | 
			
		|||
 | 
			
		||||
    public async Task<int> LoadCoreConfigSpeedtest(List<ServerTestItem> selecteds)
 | 
			
		||||
    {
 | 
			
		||||
        var coreType = selecteds.Exists(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC) ? ECoreType.sing_box : ECoreType.Xray;
 | 
			
		||||
        var coreType = selecteds.Exists(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.Anytls) ? ECoreType.sing_box : ECoreType.Xray;
 | 
			
		||||
        var fileName = string.Format(Global.CoreSpeedtestConfigFileName, Utils.GetGuid(false));
 | 
			
		||||
        var configPath = Utils.GetBinConfigPath(fileName);
 | 
			
		||||
        var result = await CoreConfigHandler.GenerateClientSpeedtestConfig(_config, configPath, selecteds, coreType);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										54
									
								
								v2rayN/ServiceLib/Handler/Fmt/AnytlsFmt.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								v2rayN/ServiceLib/Handler/Fmt/AnytlsFmt.cs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
using static QRCoder.PayloadGenerator;
 | 
			
		||||
 | 
			
		||||
namespace ServiceLib.Handler.Fmt;
 | 
			
		||||
public class AnytlsFmt : BaseFmt
 | 
			
		||||
{
 | 
			
		||||
    public static ProfileItem? Resolve(string str, out string msg)
 | 
			
		||||
    {
 | 
			
		||||
        msg = ResUI.ConfigurationFormatIncorrect;
 | 
			
		||||
 | 
			
		||||
        var parsedUrl = Utils.TryUri(str);
 | 
			
		||||
        if (parsedUrl == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ProfileItem item = new()
 | 
			
		||||
        {
 | 
			
		||||
            ConfigType = EConfigType.Anytls,
 | 
			
		||||
            Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped),
 | 
			
		||||
            Address = parsedUrl.IdnHost,
 | 
			
		||||
            Port = parsedUrl.Port,
 | 
			
		||||
        };
 | 
			
		||||
        var rawUserInfo = Utils.UrlDecode(parsedUrl.UserInfo);
 | 
			
		||||
        item.Id = rawUserInfo;
 | 
			
		||||
 | 
			
		||||
        var query = Utils.ParseQueryString(parsedUrl.Query);
 | 
			
		||||
        item.Sni = query["sni"] ?? Global.None;
 | 
			
		||||
        item.AllowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false";
 | 
			
		||||
 | 
			
		||||
        return item;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static string? ToUri(ProfileItem? item)
 | 
			
		||||
    {
 | 
			
		||||
        if (item == null)
 | 
			
		||||
        {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        var remark = string.Empty;
 | 
			
		||||
        if (item.Remarks.IsNotEmpty())
 | 
			
		||||
        {
 | 
			
		||||
            remark = "#" + Utils.UrlEncode(item.Remarks);
 | 
			
		||||
        }
 | 
			
		||||
        var pw = item.Id;
 | 
			
		||||
        var dicQuery = new Dictionary<string, string>();
 | 
			
		||||
        if (item.Sni.IsNotEmpty())
 | 
			
		||||
        {
 | 
			
		||||
            dicQuery.Add("sni", item.Sni);
 | 
			
		||||
        }
 | 
			
		||||
        dicQuery.Add("insecure", item.AllowInsecure.ToLower() == "true" ? "1" : "0");
 | 
			
		||||
 | 
			
		||||
        return ToUri(EConfigType.Anytls, item.Address, item.Port, pw, dicQuery, remark);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ public class FmtHandler
 | 
			
		|||
                EConfigType.Hysteria2 => Hysteria2Fmt.ToUri(item),
 | 
			
		||||
                EConfigType.TUIC => TuicFmt.ToUri(item),
 | 
			
		||||
                EConfigType.WireGuard => WireguardFmt.ToUri(item),
 | 
			
		||||
                EConfigType.Anytls => AnytlsFmt.ToUri(item),
 | 
			
		||||
                _ => null,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,6 +76,10 @@ public class FmtHandler
 | 
			
		|||
            {
 | 
			
		||||
                return WireguardFmt.Resolve(str, out msg);
 | 
			
		||||
            }
 | 
			
		||||
            else if (str.StartsWith(Global.ProtocolShares[EConfigType.Anytls]))
 | 
			
		||||
            {
 | 
			
		||||
                return AnytlsFmt.Resolve(str, out msg);
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                msg = ResUI.NonvmessOrssProtocol;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										9
									
								
								v2rayN/ServiceLib/Resx/ResUI.Designer.cs
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								v2rayN/ServiceLib/Resx/ResUI.Designer.cs
									
									
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -672,6 +672,15 @@ namespace ServiceLib.Resx {
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///   查找类似 Add [Anytls] Configuration 的本地化字符串。
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static string menuAddAnytlsServer {
 | 
			
		||||
            get {
 | 
			
		||||
                return ResourceManager.GetString("menuAddAnytlsServer", resourceCulture);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        ///   查找类似 Add a custom configuration Configuration 的本地化字符串。
 | 
			
		||||
        /// </summary>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1416,4 +1416,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>صادر کردن سرور</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>Add [Anytls] Configuration</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -1416,4 +1416,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>Export server</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>Add [Anytls] Configuration</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -1416,4 +1416,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>Export Configuration</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>Add [Anytls] Configuration</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -1416,4 +1416,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>Export server</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>Add [Anytls] Configuration</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -1071,13 +1071,13 @@
 | 
			
		|||
  <data name="TbHeaderType8" xml:space="preserve">
 | 
			
		||||
    <value>拥塞控制算法</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvPrevProfile" xml:space="preserve">
 | 
			
		||||
  <data name="LvPrevProfile" xml:space="preserve">
 | 
			
		||||
    <value>前置代理配置文件别名</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvNextProfile" xml:space="preserve">
 | 
			
		||||
  <data name="LvNextProfile" xml:space="preserve">
 | 
			
		||||
    <value>落地代理配置文件別名</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvPrevProfileTip" xml:space="preserve">
 | 
			
		||||
  <data name="LvPrevProfileTip" xml:space="preserve">
 | 
			
		||||
    <value>请确保配置文件别名存在并唯一</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="TbSettingsEnableExInbound" xml:space="preserve">
 | 
			
		||||
| 
						 | 
				
			
			@ -1413,4 +1413,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>导出配置文件</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>添加 [Anytls] 配置文件</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -1071,13 +1071,13 @@
 | 
			
		|||
  <data name="TbHeaderType8" xml:space="preserve">
 | 
			
		||||
    <value>擁塞控制算法</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvPrevProfile" xml:space="preserve">
 | 
			
		||||
  <data name="LvPrevProfile" xml:space="preserve">
 | 
			
		||||
    <value>前置代理設定檔別名</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvNextProfile" xml:space="preserve">
 | 
			
		||||
  <data name="LvNextProfile" xml:space="preserve">
 | 
			
		||||
    <value>落地代理設定檔別名</value>
 | 
			
		||||
  </data>
 | 
			
		||||
    <data name="LvPrevProfileTip" xml:space="preserve">
 | 
			
		||||
  <data name="LvPrevProfileTip" xml:space="preserve">
 | 
			
		||||
    <value>請確保設定檔別名存在並且唯一</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="TbSettingsEnableExInbound" xml:space="preserve">
 | 
			
		||||
| 
						 | 
				
			
			@ -1413,4 +1413,7 @@
 | 
			
		|||
  <data name="menuExportConfig" xml:space="preserve">
 | 
			
		||||
    <value>匯出設定檔</value>
 | 
			
		||||
  </data>
 | 
			
		||||
  <data name="menuAddAnytlsServer" xml:space="preserve">
 | 
			
		||||
    <value>新增 [Anytls] 設定檔</value>
 | 
			
		||||
  </data>
 | 
			
		||||
</root>
 | 
			
		||||
| 
						 | 
				
			
			@ -759,6 +759,11 @@ public class CoreConfigSingboxService
 | 
			
		|||
                        outbound.mtu = node.ShortId.IsNullOrEmpty() ? Global.TunMtus.First() : node.ShortId.ToInt();
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                case EConfigType.Anytls:
 | 
			
		||||
                    {
 | 
			
		||||
                        outbound.password = node.Id;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await GenOutboundTls(node, outbound);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1291,7 +1291,8 @@ public class CoreConfigV2rayService
 | 
			
		|||
            if (prevNode is not null
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.Custom
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.Hysteria2
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.TUIC)
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.TUIC
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.Anytls)
 | 
			
		||||
            {
 | 
			
		||||
                var prevOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
 | 
			
		||||
                await GenOutbound(prevNode, prevOutbound);
 | 
			
		||||
| 
						 | 
				
			
			@ -1309,7 +1310,8 @@ public class CoreConfigV2rayService
 | 
			
		|||
            if (nextNode is not null
 | 
			
		||||
                && nextNode.ConfigType != EConfigType.Custom
 | 
			
		||||
                && nextNode.ConfigType != EConfigType.Hysteria2
 | 
			
		||||
                && nextNode.ConfigType != EConfigType.TUIC)
 | 
			
		||||
                && nextNode.ConfigType != EConfigType.TUIC
 | 
			
		||||
                && prevNode.ConfigType != EConfigType.Anytls)
 | 
			
		||||
            {
 | 
			
		||||
                var nextOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound);
 | 
			
		||||
                await GenOutbound(nextNode, nextOutbound);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -357,8 +357,8 @@ public class SpeedtestService
 | 
			
		|||
    private List<List<ServerTestItem>> GetTestBatchItem(List<ServerTestItem> lstSelected, int pageSize)
 | 
			
		||||
    {
 | 
			
		||||
        List<List<ServerTestItem>> lstTest = new();
 | 
			
		||||
        var lst1 = lstSelected.Where(t => t.ConfigType is not (EConfigType.Hysteria2 or EConfigType.TUIC)).ToList();
 | 
			
		||||
        var lst2 = lstSelected.Where(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC).ToList();
 | 
			
		||||
        var lst1 = lstSelected.Where(t => t.ConfigType is not (EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.Anytls)).ToList();
 | 
			
		||||
        var lst2 = lstSelected.Where(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.Anytls).ToList();
 | 
			
		||||
 | 
			
		||||
        for (var num = 0; num < (int)Math.Ceiling(lst1.Count * 1.0 / pageSize); num++)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ public class MainWindowViewModel : MyReactiveObject
 | 
			
		|||
    public ReactiveCommand<Unit, Unit> AddHysteria2ServerCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddTuicServerCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddWireguardServerCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddAnytlsServerCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddCustomServerCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddServerViaClipboardCmd { get; }
 | 
			
		||||
    public ReactiveCommand<Unit, Unit> AddServerViaScanCmd { get; }
 | 
			
		||||
| 
						 | 
				
			
			@ -111,6 +112,10 @@ public class MainWindowViewModel : MyReactiveObject
 | 
			
		|||
        {
 | 
			
		||||
            await AddServerAsync(true, EConfigType.WireGuard);
 | 
			
		||||
        });
 | 
			
		||||
        AddAnytlsServerCmd = ReactiveCommand.CreateFromTask(async () =>
 | 
			
		||||
        {
 | 
			
		||||
            await AddServerAsync(true, EConfigType.Anytls);
 | 
			
		||||
        });
 | 
			
		||||
        AddCustomServerCmd = ReactiveCommand.CreateFromTask(async () =>
 | 
			
		||||
        {
 | 
			
		||||
            await AddServerAsync(true, EConfigType.Custom);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -481,6 +481,26 @@
 | 
			
		|||
                        HorizontalAlignment="Left"
 | 
			
		||||
                        Watermark="1500" />
 | 
			
		||||
                </Grid>
 | 
			
		||||
                <Grid
 | 
			
		||||
                    x:Name="gridAnytls"
 | 
			
		||||
                    Grid.Row="2"
 | 
			
		||||
                    ColumnDefinitions="180,Auto"
 | 
			
		||||
                    IsVisible="False"
 | 
			
		||||
                    RowDefinitions="Auto,Auto,Auto">
 | 
			
		||||
 | 
			
		||||
                    <TextBlock
 | 
			
		||||
                        Grid.Row="1"
 | 
			
		||||
                        Grid.Column="0"
 | 
			
		||||
                        Margin="{StaticResource Margin4}"
 | 
			
		||||
                        VerticalAlignment="Center"
 | 
			
		||||
                        Text="{x:Static resx:ResUI.TbId3}" />
 | 
			
		||||
                    <TextBox
 | 
			
		||||
                        x:Name="txtId10"
 | 
			
		||||
                        Grid.Row="1"
 | 
			
		||||
                        Grid.Column="1"
 | 
			
		||||
                        Width="400"
 | 
			
		||||
                        Margin="{StaticResource Margin4}" />
 | 
			
		||||
                </Grid>
 | 
			
		||||
 | 
			
		||||
                <Separator
 | 
			
		||||
                    x:Name="sepa2"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -133,6 +133,11 @@ public partial class AddServerWindow : ReactiveWindow<AddServerViewModel>
 | 
			
		|||
                gridTls.IsVisible = false;
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
            case EConfigType.Anytls:
 | 
			
		||||
                gridAnytls.IsVisible = true;
 | 
			
		||||
                cmbCoreType.IsEnabled = false;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        gridTlsMore.IsVisible = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -193,6 +198,10 @@ public partial class AddServerWindow : ReactiveWindow<AddServerViewModel>
 | 
			
		|||
                    this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost9.Text).DisposeWith(disposables);
 | 
			
		||||
                    this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId9.Text).DisposeWith(disposables);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case EConfigType.Anytls:
 | 
			
		||||
                    this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId10.Text).DisposeWith(disposables);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.SelectedValue).DisposeWith(disposables);
 | 
			
		||||
            this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType.SelectedValue).DisposeWith(disposables);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,7 @@
 | 
			
		|||
                        <Separator />
 | 
			
		||||
                        <MenuItem x:Name="menuAddHysteria2Server" Header="{x:Static resx:ResUI.menuAddHysteria2Server}" />
 | 
			
		||||
                        <MenuItem x:Name="menuAddTuicServer" Header="{x:Static resx:ResUI.menuAddTuicServer}" />
 | 
			
		||||
                        <MenuItem x:Name="menuAddAnytlsServer" Header="{x:Static resx:ResUI.menuAddAnytlsServer}" />
 | 
			
		||||
                    </MenuItem>
 | 
			
		||||
 | 
			
		||||
                    <MenuItem Padding="8,0">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,6 +83,7 @@ public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
 | 
			
		|||
            this.BindCommand(ViewModel, vm => vm.AddHysteria2ServerCmd, v => v.menuAddHysteria2Server).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddTuicServerCmd, v => v.menuAddTuicServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddWireguardServerCmd, v => v.menuAddWireguardServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddAnytlsServerCmd, v => v.menuAddAnytlsServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddCustomServerCmd, v => v.menuAddCustomServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddServerViaClipboardCmd, v => v.menuAddServerViaClipboard).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddServerViaScanCmd, v => v.menuAddServerViaScan).DisposeWith(disposables);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -646,6 +646,35 @@
 | 
			
		|||
                        materialDesign:HintAssist.Hint="1500"
 | 
			
		||||
                        Style="{StaticResource DefTextBox}" />
 | 
			
		||||
                </Grid>
 | 
			
		||||
                <Grid
 | 
			
		||||
                    x:Name="gridAnytls"
 | 
			
		||||
                    Grid.Row="2"
 | 
			
		||||
                    Visibility="Hidden">
 | 
			
		||||
                    <Grid.RowDefinitions>
 | 
			
		||||
                        <RowDefinition Height="Auto" />
 | 
			
		||||
                        <RowDefinition Height="Auto" />
 | 
			
		||||
                        <RowDefinition Height="Auto" />
 | 
			
		||||
                    </Grid.RowDefinitions>
 | 
			
		||||
                    <Grid.ColumnDefinitions>
 | 
			
		||||
                        <ColumnDefinition Width="180" />
 | 
			
		||||
                        <ColumnDefinition Width="Auto" />
 | 
			
		||||
                    </Grid.ColumnDefinitions>
 | 
			
		||||
 | 
			
		||||
                    <TextBlock
 | 
			
		||||
                        Grid.Row="1"
 | 
			
		||||
                        Grid.Column="0"
 | 
			
		||||
                        Margin="{StaticResource Margin4}"
 | 
			
		||||
                        VerticalAlignment="Center"
 | 
			
		||||
                        Style="{StaticResource ToolbarTextBlock}"
 | 
			
		||||
                        Text="{x:Static resx:ResUI.TbId3}" />
 | 
			
		||||
                    <TextBox
 | 
			
		||||
                        x:Name="txtId10"
 | 
			
		||||
                        Grid.Row="1"
 | 
			
		||||
                        Grid.Column="1"
 | 
			
		||||
                        Width="400"
 | 
			
		||||
                        Margin="{StaticResource Margin4}"
 | 
			
		||||
                        Style="{StaticResource DefTextBox}" />
 | 
			
		||||
                </Grid>
 | 
			
		||||
 | 
			
		||||
                <Separator
 | 
			
		||||
                    x:Name="sepa2"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -126,6 +126,10 @@ public partial class AddServerWindow
 | 
			
		|||
                gridTransport.Visibility = Visibility.Collapsed;
 | 
			
		||||
                gridTls.Visibility = Visibility.Collapsed;
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
            case EConfigType.Anytls:
 | 
			
		||||
                gridAnytls.Visibility = Visibility.Visible;
 | 
			
		||||
                cmbCoreType.IsEnabled = false;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -187,6 +191,10 @@ public partial class AddServerWindow
 | 
			
		|||
                    this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost9.Text).DisposeWith(disposables);
 | 
			
		||||
                    this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId9.Text).DisposeWith(disposables);
 | 
			
		||||
                    break;
 | 
			
		||||
 | 
			
		||||
                case EConfigType.Anytls:
 | 
			
		||||
                    this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId10.Text).DisposeWith(disposables);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.Text).DisposeWith(disposables);
 | 
			
		||||
            this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType.Text).DisposeWith(disposables);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,6 +107,10 @@
 | 
			
		|||
                                    x:Name="menuAddTuicServer"
 | 
			
		||||
                                    Height="{StaticResource MenuItemHeight}"
 | 
			
		||||
                                    Header="{x:Static resx:ResUI.menuAddTuicServer}" />
 | 
			
		||||
                                <MenuItem
 | 
			
		||||
                                    x:Name="menuAddAnytlsServer"
 | 
			
		||||
                                    Height="{StaticResource MenuItemHeight}"
 | 
			
		||||
                                    Header="{x:Static resx:ResUI.menuAddAnytlsServer}" />
 | 
			
		||||
                            </MenuItem>
 | 
			
		||||
                        </Menu>
 | 
			
		||||
                        <Separator />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -80,6 +80,7 @@ public partial class MainWindow
 | 
			
		|||
            this.BindCommand(ViewModel, vm => vm.AddHysteria2ServerCmd, v => v.menuAddHysteria2Server).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddTuicServerCmd, v => v.menuAddTuicServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddWireguardServerCmd, v => v.menuAddWireguardServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddAnytlsServerCmd, v => v.menuAddAnytlsServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddCustomServerCmd, v => v.menuAddCustomServer).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddServerViaClipboardCmd, v => v.menuAddServerViaClipboard).DisposeWith(disposables);
 | 
			
		||||
            this.BindCommand(ViewModel, vm => vm.AddServerViaScanCmd, v => v.menuAddServerViaScan).DisposeWith(disposables);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue