using System.Collections.Generic; using System.IO; using Netch.Models; using Newtonsoft.Json; using VMess = Netch.Models.Information.VMess; namespace Netch.Controllers { public class VMessController : EncryptedProxy { public VMessController() { Name = "V2Ray"; MainFile = "v2ray.exe"; StartedKeywords.Add("started"); StoppedKeywords.AddRange(new[] {"config file not readable", "failed to"}); } public override bool Start(Server server, Mode mode) { File.WriteAllText("data\\last.json", JsonConvert.SerializeObject(new VMess.Config { inbounds = new List { new VMess.Inbounds { settings = new VMess.InboundSettings(), port = Socks5LocalPort, listen = LocalAddress } }, outbounds = new List { new VMess.Outbounds { settings = new VMess.OutboundSettings { vnext = new List { new VMess.VNext { address = server.Hostname, port = server.Port, users = new List { new VMess.User { id = server.UserID, alterId = server.AlterID, security = server.EncryptMethod } } } } }, streamSettings = new VMess.StreamSettings { network = server.TransferProtocol, security = server.TLSSecure ? "tls" : string.Empty, wsSettings = server.TransferProtocol == "ws" ? new VMess.WebSocketSettings { path = server.Path == string.Empty ? "/" : server.Path, headers = new VMess.WSHeaders { Host = server.Host == string.Empty ? server.Hostname : server.Host } } : null, tcpSettings = server.FakeType == "http" ? new VMess.TCPSettings { header = new VMess.TCPHeaders { type = server.FakeType, request = new VMess.TCPRequest { path = server.Path == string.Empty ? "/" : server.Path, headers = new VMess.TCPRequestHeaders { Host = server.Host == string.Empty ? server.Hostname : server.Host } } } } : null, kcpSettings = server.TransferProtocol == "kcp" ? new VMess.KCPSettings { header = new VMess.TCPHeaders { type = server.FakeType } } : null, quicSettings = server.TransferProtocol == "quic" ? new VMess.QUICSettings { security = server.QUICSecure, key = server.QUICSecret, header = new VMess.TCPHeaders { type = server.FakeType } } : null, httpSettings = server.TransferProtocol == "h2" ? new VMess.HTTPSettings { host = server.Host == "" ? server.Hostname : server.Host, path = server.Path == "" ? "/" : server.Path } : null, tlsSettings = new VMess.TLSSettings { allowInsecure = true, serverName = server.Host == "" ? server.Hostname : server.Host } }, mux = new VMess.OutboundMux { enabled = server.UseMux } }, mode.Type == 0 || mode.Type == 1 || mode.Type == 2 ? new VMess.Outbounds { tag = "TUNTAP", protocol = "freedom" } : new VMess.Outbounds { tag = "direct", protocol = "freedom" } }, routing = new VMess.Routing { rules = new List { mode.BypassChina ? new VMess.RoutingRules { type = "field", ip = new List { "geoip:cn", "geoip:private" }, domain = new List { "geosite:cn" }, outboundTag = "direct" } : new VMess.RoutingRules { type = "field", ip = new List { "geoip:private" }, outboundTag = "direct" } } } })); if (StartInstanceAuto("-config ..\\data\\last.json")) { if (File.Exists("data\\last.json")) File.Delete("data\\last.json"); return true; } return false; } public override void Stop() { StopInstance(); } } }