Exemplo n.º 1
0
        public static async Task <DailyData> LoadTideData(DateTime today, Location location)
        {
            var cachedData = FileCache.GetDailyData(today, location);

            if (cachedData != null)
            {
                return(cachedData);
            }

            List <DailyData> data = new List <DailyData>();

            using (var client = new System.Net.WebClient())
            {
                var startDate = today;
                var values    = new System.Collections.Specialized.NameValueCollection();
                values["site"]         = String.Format("Maryland&station_number={0}", ((Int32)location));
                values["month"]        = String.Format("{0}&year={1}", today.Month, today.Year);
                values["start_date"]   = startDate.Day.ToString();
                values["maximum_days"] = "14";
                // get response
                var response = client.UploadValues("http://www.saltwatertides.com/cgi-local/maryland.cgi", values);
                HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
                html.LoadHtml(Encoding.Default.GetString(response));
                var root    = html.DocumentNode;
                var content = root.Descendants("PRE");
                System.IO.StringReader reader = new StringReader(content.First().InnerText);


                var line = string.Empty;

                while (line != null)
                {
                    line = reader.ReadLine();
                    if (String.IsNullOrWhiteSpace(line))
                    {
                        continue;
                    }
                    if (line.StartsWith("Day"))
                    {
                        continue;
                    }
                    if (line.Contains("Sunset"))
                    {
                        continue;
                    }

                    int day = 0;
                    if (!int.TryParse(line.Substring(4, 2), out day))
                    {
                        throw new ApplicationException("Cannot parse day");
                    }

                    DailyData.TideType type = DailyData.TideType.Low;
                    if (!Enum.TryParse <DailyData.TideType>(line.Substring(11, 4), out type))
                    {
                        throw new ApplicationException("Cannot parse tide type");
                    }
                    DateTime timeOfTide = new DateTime();
                    if (!DateTime.TryParse(line.Substring(17, 8), out timeOfTide))
                    {
                        throw new ApplicationException("Cannot parse time of tide");
                    }

                    DateTime?timeOfSun = null;
                    if (line.Length > 42)
                    {
                        DateTime sun;
                        if (!DateTime.TryParse(line.Substring(35, 8), out sun))
                        {
                            throw new ApplicationException("Cannot parse time of sun");
                        }
                        timeOfSun = sun;
                    }
                    DailyData dailyData;
                    //First Record
                    if (!data.Any(x => x.DayOfMonth == day))
                    {
                        data.Add(new DailyData(day, startDate));
                    }

                    dailyData = data.First(x => x.DayOfMonth == day);

                    if (type == DailyData.TideType.Low)
                    {
                        if (dailyData.FirstLowTide.HasValue)
                        {
                            dailyData.SecondLowTide = timeOfTide;
                        }
                        else
                        {
                            dailyData.FirstLowTide = timeOfTide;
                        }
                    }
                    else
                    {
                        if (dailyData.FirstHighTide.HasValue)
                        {
                            dailyData.SecondHighTide = timeOfTide;
                        }
                        else
                        {
                            dailyData.FirstHighTide = timeOfTide;
                        }
                    }

                    if (timeOfSun.HasValue)
                    {
                        if (!dailyData.SunRise.HasValue)
                        {
                            dailyData.SunRise = timeOfSun;
                        }
                        else
                        {
                            dailyData.SunSet = timeOfSun;
                        }
                    }
                }

                Data = data;
            }
            if (data.Any())
            {
                foreach (var d in data)
                {
                    FileCache.StoreDailyData(d, d.Date, location);
                }
            }
            return(data.First());
        }
Exemplo n.º 2
0
        public static async Task<DailyData> LoadTideData(DateTime today, Location location)
        {
            var cachedData = Cache.GetDailyData(today, location);
            if (cachedData != null)
                return cachedData;

            List<DailyData> data = new List<DailyData>();
            //var responseJson = await httpClient.GetStringAsync(url);
            using (var client = HttpClientFactory.Create())
            {
                var startDate = today;
                IList<KeyValuePair<string, string>> nameValueCollection = new List<KeyValuePair<string, string>>();
                nameValueCollection.Add(new KeyValuePair<string, string>("site", String.Format("Maryland&station_number={0}", ((Int32)location))));
                nameValueCollection.Add(new KeyValuePair<string, string>("month", String.Format("{0}&year={1}", today.Month, today.Year)));
                nameValueCollection.Add(new KeyValuePair<string, string>("start_date", startDate.Day.ToString()));
                nameValueCollection.Add(new KeyValuePair<string, string>("maximum_days", "2"));
                // get response
                var response = await client.PostAsync("https://www.saltwatertides.com/cgi-local/maryland.cgi", new FormUrlEncodedContent(nameValueCollection));
                var contents = await response.Content.ReadAsStringAsync();
                HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
                html.LoadHtml(contents);
                var root = html.DocumentNode;
                var content = root.Descendants("PRE");
                System.IO.StringReader reader = new StringReader(content.First().InnerText);


                var line = string.Empty;

                while (line != null)
                {
                    line = reader.ReadLine();
                    if (String.IsNullOrWhiteSpace(line))
                        continue;
                    if (line.StartsWith("Day"))
                        continue;
                    if (line.Contains("Sunset"))
                        continue;

                    int day = 0;
                    if (!int.TryParse(line.Substring(4, 2), out day))
                        throw new Exception("Cannot parse day");

                    DailyData.TideType type = DailyData.TideType.Low;
                    if (!Enum.TryParse<DailyData.TideType>(line.Substring(11, 4), out type))
                        throw new Exception("Cannot parse tide type");
                    DateTime timeOfTide = new DateTime();
                    if (!DateTime.TryParse(line.Substring(17, 8), out timeOfTide))
                        throw new Exception("Cannot parse time of tide");

                    DateTime? timeOfSun = null;
                    if (line.Length > 42)
                    {
                        DateTime sun;
                        if (!DateTime.TryParse(line.Substring(35, 8), out sun))
                            throw new Exception("Cannot parse time of sun");
                        timeOfSun = sun;
                    }
                    DailyData dailyData;
                    //First Record
                    if (!data.Any(x => x.DayOfMonth == day))
                        data.Add(new DailyData(day, startDate));

                    dailyData = data.First(x => x.DayOfMonth == day);

                    if (type == DailyData.TideType.Low)
                    {
                        if (dailyData.FirstLowTide.HasValue)
                            dailyData.SecondLowTide = timeOfTide;
                        else
                            dailyData.FirstLowTide = timeOfTide;
                    }
                    else
                    {
                        if (dailyData.FirstHighTide.HasValue)
                            dailyData.SecondHighTide = timeOfTide;
                        else
                            dailyData.FirstHighTide = timeOfTide;
                    }

                    if (timeOfSun.HasValue)
                    {
                        if (!dailyData.SunRise.HasValue)
                            dailyData.SunRise = timeOfSun;
                        else
                            dailyData.SunSet = timeOfSun;
                    }


                }

                Data = data;
            }
            if (data.Any())
                foreach (var d in data)
                    Cache.StoreDailyData(d, d.Date, location);
            return data.First();
        }