using System.Net.Sockets; using Starksoft.Aspen.Proxy; namespace MinecraftClient.Proxy { /// /// Automatically handle proxies according to the app Settings. /// Note: Underlying proxy handling is taken from Starksoft, LLC's Biko Library. /// This library is open source and provided under the MIT license. More info at biko.codeplex.com. /// public static class ProxyHandler { public enum Type { HTTP, SOCKS4, SOCKS4a, SOCKS5 }; private static readonly ProxyClientFactory factory = new(); private static IProxyClient? proxy; private static bool proxy_ok = false; /// /// Create a regular TcpClient or a proxied TcpClient according to the app Settings. /// /// Target host /// Target port /// True if the purpose is logging in to a Minecraft account public static TcpClient NewTcpClient(string host, int port, bool login = false) { try { if (login ? Settings.ProxyEnabledLogin : Settings.ProxyEnabledIngame) { ProxyType innerProxytype = ProxyType.Http; switch (Settings.proxyType) { case Type.HTTP: innerProxytype = ProxyType.Http; break; case Type.SOCKS4: innerProxytype = ProxyType.Socks4; break; case Type.SOCKS4a: innerProxytype = ProxyType.Socks4a; break; case Type.SOCKS5: innerProxytype = ProxyType.Socks5; break; } if (Settings.ProxyUsername != "" && Settings.ProxyPassword != "") { proxy = factory.CreateProxyClient(innerProxytype, Settings.ProxyHost, Settings.ProxyPort, Settings.ProxyUsername, Settings.ProxyPassword); } else proxy = factory.CreateProxyClient(innerProxytype, Settings.ProxyHost, Settings.ProxyPort); if (!proxy_ok) { ConsoleIO.WriteLineFormatted(Translations.Get("proxy.connected", Settings.ProxyHost, Settings.ProxyPort)); proxy_ok = true; } return proxy.CreateConnection(host, port); } else return new TcpClient(host, port); } catch (ProxyException e) { ConsoleIO.WriteLineFormatted("§8" + e.Message); proxy = null; throw new SocketException((int)SocketError.HostUnreachable); } } } }