/// <summary>
 /// Constructor
 /// </summary>
 /// <param name="api">API</param>
 /// <param name="customServerInfo">Custom server information</param>
 /// <param name="errorLogPath">Error log path</param>
 /// <param name="host">Host</param>
 /// <param name="ipv4Address">IPv4 address</param>
 /// <param name="logPath">Log path</param>
 /// <param name="method">Method</param>
 /// <param name="port">Port</param>
 /// <param name="referer">Referer</param>
 /// <param name="useHTTPS">Use HTTPS</param>
 /// <param name="userAgent">User agent</param>
 /// <param name="version">Version</param>
 internal AnnouncerClient(EAnnouncerAPI api, string errorLogPath, SAMPServersAPIRequestDataContract customServerInfo, string host, string ipv4Address, string logPath, string method, ushort port, string referer, bool useHTTPS, string userAgent, string version)
 {
     API = api;
     this.errorLogPath = errorLogPath;
     CustomServerInfo  = ((api == EAnnouncerAPI.SAMPServersAPI) ? customServerInfo : null);
     this.host         = host;
     this.ipv4Address  = ipv4Address;
     this.logPath      = logPath;
     this.method       = method;
     Port           = port;
     this.referer   = referer;
     UseHTTPS       = useHTTPS;
     this.userAgent = userAgent;
     this.version   = version;
 }
        /// <summary>
        /// Create announcer
        /// </summary>
        /// <param name="configStream">Configuration stream</param>
        /// <param name="defaultPort">Default port</param>
        /// <param name="disposeConfigStreamWhenDone">Dispose config stream when done</param>
        /// <returns>Announcer if successful, otherwise "null"</returns>
        public static Announcer Create(Stream configStream, ushort defaultPort, bool disposeConfigStreamWhenDone)
        {
            Announcer ret = null;
            if (configStream != null)
            {
                if (configStream.CanRead)
                {
                    ConfigDataContract config = serializer.ReadObject(configStream) as ConfigDataContract;
                    if (config != null)
                    {
                        List<AnnouncerClient> announcer_clients = new List<AnnouncerClient>();
                        string ipv4_address = null;
                        foreach (AnnouncereDataContract announcer in config.Announcers)
                        {
                            if (announcer != null)
                            {
                                if (announcer.Port == 0)
                                {
                                    announcer.Port = defaultPort;
                                }
                                if (announcer.IsValid)
                                {
                                    try
                                    {
                                        if (((announcer.API == EAnnouncerAPI.SAMPServersAPI) || (announcer.API == EAnnouncerAPI.SACNRMonitorAPI)) && (ipv4_address == null))
                                        {
                                            ipv4_address = config.IPv4Address;
                                            if (ipv4_address.Length <= 0)
                                            {
                                                foreach (string ipv4_service_uri in config.IPv4ServiceURIs)
                                                {
                                                    if (!(string.IsNullOrWhiteSpace(ipv4_service_uri)))
                                                    {
                                                        Uri uri = new Uri(ipv4_service_uri.Trim());
                                                        HttpWebRequest ipv4_address_http_web_request = WebRequest.CreateHttp(uri);
                                                        if (ipv4_address_http_web_request != null)
                                                        {
                                                            ipv4_address_http_web_request.Headers.Add(HttpRequestHeader.Accept, "*/*");
                                                            ipv4_address_http_web_request.Headers.Add(HttpRequestHeader.UserAgent, config.UserAgent);
                                                            ipv4_address_http_web_request.Headers.Add(HttpRequestHeader.Host, uri.Host);
                                                            using (HttpWebResponse response = ipv4_address_http_web_request.GetResponse() as HttpWebResponse)
                                                            {

                                                                if (response.StatusCode == HttpStatusCode.OK)
                                                                {
                                                                    using (Stream response_stream = response.GetResponseStream())
                                                                    {
                                                                        using (StreamReader response_reader = new StreamReader(response_stream))
                                                                        {
                                                                            ipv4_address = response_reader.ReadToEnd().Trim();
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        Console.Error.WriteLine(e);
                                    }
                                    if (((announcer.API != EAnnouncerAPI.SAMPServersAPI) && (announcer.API != EAnnouncerAPI.SACNRMonitorAPI)) || (ipv4_address != null))
                                    {
                                        SAMPServersAPIRequestDataContract custom_server_info = (announcer.UseCustomServerInfo ? config.CustomServerInfo : null);
                                        announcer_clients.Add(new AnnouncerClient(announcer.API, config.ErrorLogPath, custom_server_info, announcer.Host, ((announcer.API == EAnnouncerAPI.SAMPServersAPI) || (announcer.API == EAnnouncerAPI.SACNRMonitorAPI)) ? ipv4_address : string.Empty, config.LogPath, (announcer.Method == null) ? ((announcer.API == EAnnouncerAPI.SACNRMonitorAPI) ? WebRequestMethods.Http.Post : ((announcer.API == EAnnouncerAPI.SAMPServersAPI) ? ((custom_server_info == null) ? WebRequestMethods.Http.Post : "PATCH") : WebRequestMethods.Http.Get)) : announcer.Method, announcer.Port, announcer.Referer, announcer.UseHTTPS, announcer.UserAgent, announcer.Version));
                                    }
                                }
                            }
                        }
                        ret = new Announcer(announcer_clients.ToArray());
                        announcer_clients.Clear();
                    }
                }
                if (disposeConfigStreamWhenDone)
                {
                    configStream.Dispose();
                }
            }
            return ret;
        }