public ZeroTierAPI(API_Settings api_settings, Network_Settings network_Settings, bool StartZeroTier = false)
 {
     if (ZeroTierHandler == null)
     {
         ZeroTierHandler = new APIHandler();
     }
     ZeroTierHandler.AddEventHandler(ZeroTierHandler_NetworkChangeEvent);
     NetworkInfoLog("[ZeroTier] [API] API Created!");
     if (api_settings != null)
     {
         API_Settings = api_settings;
     }
     if (network_Settings != null)
     {
         Network_Settings = network_Settings;
     }
     // start zero teir
     Process[] Zero = Process.GetProcessesByName("ZeroTier One");
     if (StartZeroTier && Zero.Length <= 0)
     {
         Process proccess = new Process();
         proccess.StartInfo.FileName         = ZeroTierEXEPath;
         proccess.StartInfo.WindowStyle      = ProcessWindowStyle.Hidden;
         proccess.StartInfo.WorkingDirectory = ZeroTierFolderPath;
         proccess.StartInfo.CreateNoWindow   = true;
         proccess.Start();
         NetworkInfoLog("[ZeroTier] [CLI] ZeroTier Started!");
     }
 }
        public async Task StartServerAsync(string Network = null)
        {
            // get zero teir process(es) and kill em
            Process[] Zero = Process.GetProcessesByName("ZeroTier One");
            foreach (var item in Zero)
            {
                item.Kill(); item.WaitForExit();
            }
            NetworkInfoLog("[ZeroTier] [API] Stopped all ZeroTier processes");
            NetworkInfoLog("[ZeroTier] [API] Locating...");
            // Delete all network history
            DeleteAllNonConnectedNetworks();
            // start zero teir
            Process proccess = new Process();

            proccess.StartInfo.FileName       = ZeroTierEXEPath;
            proccess.StartInfo.WindowStyle    = ProcessWindowStyle.Hidden;
            proccess.StartInfo.CreateNoWindow = true;
            proccess.Start();
            // log sum info
            NetworkInfoLog("[ZeroTier] [API] Initialized!");
            NetworkInfoLog("[ZeroTier] [API] Loading API...");
            // instantiate the API manager if it has not been done already
            if (ZeroTierHandler == null)
            {
                ZeroTierHandler = new APIHandler();
                ZeroTierHandler.AddEventHandler(ZeroTierHandler_NetworkChangeEvent);
                NetworkInfoLog("[ZeroTier] [API] API Created!");
            }
            else
            {
                NetworkInfoLog("[ZeroTier] [API] API Loaded!");
            }
            // if there is a network provided, dont create one
            if (Network == null)
            {
                Network = await CreateNewNetwork();
            }
            NetworkInfoLog("[ZeroTier] [API-NET] P2P Network Created!");
            // leave any joined networks
            foreach (var LocalNet in ZeroTierHandler.GetNetworks())
            {
                ZeroTierHandler.LeaveNetwork(LocalNet.NetworkId);
            }
            // make sure the network is added, and joined properly
            bool Connected = false;

            while (!Connected)
            {
                foreach (var LocalNet in ZeroTierHandler.GetNetworks())
                {
                    if (LocalNet.NetworkId == Network)
                    {
                        if (LocalNet.IsConnected == true && LocalNet.NetworkStatus.Equals("OK"))
                        {
                            Connected = true;
                        }
                    }
                }
                if (!Connected)
                {
                    ZeroTierHandler.JoinNetwork(Network);
                }
            }
            Network_Settings.Network_Id = Network;
            NetworkInfoLog("[ZeroTier] [Network] Joined Network: " + Network_Settings.Network_Id);
            NetworkInfoLog("[ZeroTier] [Network] P2P Connection Established!");
        }