-
Notifications
You must be signed in to change notification settings - Fork 0
/
RenderWeatherData.cs
202 lines (175 loc) · 9.08 KB
/
RenderWeatherData.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
using Spectre.Console;
using cweather.WeatherData;
using cweather.LocationData;
using System.Collections.Generic;
using Spectre.Console.Rendering;
using System;
namespace cweather
{
public class RenderWeatherData
{
private readonly Weather _weather;
private readonly Location _location;
public RenderWeatherData(Weather weather, Location location)
{
_location = location;
_weather = weather;
}
// get summary of the current weather
// Only location, date. timezone, temperature and wind are shown
// If rain of snow detail is available that is also shown
public void CurrentWeatherSummary()
{
string locationDetail = $"[bold blue] Location:[/] {_location.PlaceName} [[{_location.Coord.Lat}, {_location.Coord.Long}]]";
AnsiConsole.MarkupLine(locationDetail);
string timeDetail = $"[bold blue] Date:[/]{_weather.Current.Date} [bold blue] Timezone:[/] {_weather.TimeZone}";
AnsiConsole.MarkupLine(timeDetail);
string wDetail = $"[bold blue] Weather:[/] {_weather.Current.WDesc[0].Main} / {_weather.Current.WDesc[0].Description}";
AnsiConsole.MarkupLine(wDetail);
AnsiConsole.MarkupLine($"[bold blue] Temperature:[/] {_weather.Current.Temp}ºC");
AnsiConsole.MarkupLine($"[bold blue] Feels Like:[/] {_weather.Current.FeelsLike}ºC");
string windDetail = $"[bold blue] Wind:[/] {_weather.Current.WFactors.Wind.WindSpeed} m/s, {_weather.Current.WFactors.Wind.WindDeg}º";
AnsiConsole.MarkupLine(windDetail);
if(_weather.Hourly[0].Rain != null)
{
string rainDetail = $"[bold blue] Rain:[/] {_weather.Hourly[0].Rain.HourOne} mm";
AnsiConsole.MarkupLine(rainDetail);
}
if(_weather.Hourly[0].Snow != null)
{
string snowDetail = $"[bold blue] Rain:[/] {_weather.Hourly[0].Snow.HourOne} mm";
AnsiConsole.MarkupLine(snowDetail);
}
}
// details like humidity pressure cloud visibility
// that were missing in the CurrentWeatherSummary() is shown here in a table
public void CurrentWeatherDetail()
{
// Important details from summary shown calling CurrentWeatherSummary()
CurrentWeatherSummary();
// Other details are shown using a table rendered using Spectre.Console Table class
var table = new Table();
table.AddColumn(new TableColumn("Pressure").Centered());
table.AddColumn(new TableColumn("Humidity").Centered());
table.AddColumn(new TableColumn("Dew Point").Centered());
table.AddColumn(new TableColumn("UVI").Centered());
table.AddColumn(new TableColumn("Clouds").Centered());
table.AddColumn(new TableColumn("Visibility").Centered());
table.AddRow(
$"{_weather.Current.WFactors.Pressure} hPa",
$"{_weather.Current.WFactors.Humidity} %",
$"{_weather.Current.WFactors.DewPoint}º C",
$"{_weather.Current.WFactors.Uvi}",
$"{_weather.Current.WFactors.Clouds} %",
$"{_weather.Current.WFactors.Visibility??=0} m"
);
AnsiConsole.Write(table);
}
// Forecast weather for next n hours in a table
// A limit is set to next 10 hours only
public void ForecastHourlyWeather(int count)
{
var table = new Table();
table.Title($"Forecast for next {count} hours");
table.AddColumn(new TableColumn("Time").Centered());
table.AddColumn(new TableColumn("Temp (Feels Like)").Centered());
table.AddColumn(new TableColumn("Humidity").Centered());
table.AddColumn(new TableColumn("Wind").Centered());
table.AddColumn(new TableColumn("Description").Centered());
for(int i = 1; i <= count; i++)
{
var row = RenderHourlyWeather(_weather.Hourly[i]);
table.AddRow(row);
}
AnsiConsole.Write(table);
}
// Data of each hour is shown using a row in a table
// This method returns a TableRow row
private static TableRow RenderHourlyWeather(HourlyWeather hourlyWeather)
{
IEnumerable<IRenderable> wList = new List<IRenderable>{
new Markup($"{hourlyWeather.Date.Day}/{hourlyWeather.Date.Month} {hourlyWeather.Date.ToShortTimeString()}"),
new Markup($"{hourlyWeather.Temp}({hourlyWeather.FeelsLike}) ºC"),
new Markup($"{hourlyWeather.wFacts.Humidity} %"),
new Markup($"{hourlyWeather.wFacts.Wind.WindSpeed} m/s, ({hourlyWeather.wFacts.Wind.WindDeg}º)"),
new Markup($"{hourlyWeather.WDesc[0].Description.ToUpper()}")
};
return new TableRow(wList);
}
// Daily forecast forecast for a day in the future
// For example if the date today is 1/1/2022
// and we want to forecast the weather of 3/1/2022
// then the input would be (3-1) or 2
// 6 days are available after the current day
public void ForecastDailyWeather(int i)
{
if(i > 6) {
throw new ArgumentOutOfRangeException(nameof(i), $"Value must be between 1 and 6");
}
string locationDetail = $"[bold blue] Location:[/] {_location.PlaceName} [[{_location.Coord.Lat}, {_location.Coord.Long}]]";
var table = new Table();
table.Border(TableBorder.Double);
table.Title = new TableTitle($"[bold blue] Forecast for {_weather.Daily[i].Date.ToLongDateString()}[/]");
table.AddColumn(new TableColumn(string.Empty));
table.HideHeaders();
table.AddRow(new Markup(locationDetail));
table.AddRow(new Markup($"[bold blue] Weather:[/] {_weather.Daily[i].WDesc[0].Main} / {_weather.Daily[i].WDesc[0].Description}"));
table.AddRow(new Markup($"[bold blue] Max/Min temp: [/] {_weather.Daily[i].Temp.Max}ºC / {_weather.Daily[i].Temp.Min}ºC"));
table.AddRow(new Markup($"[bold blue] Precipitation: [/] {_weather.Daily[i].Precipitation * 100}%"));
if(_weather.Daily[i].Rain != null)
{
table.AddRow(new Markup($"[bold blue] Rain: [/] {_weather.Daily[i].Rain} mm"));
}
if(_weather.Daily[i].Snow != null)
{
table.AddRow(new Markup($"[bold blue] Snow: [/] {_weather.Daily[i].Snow} mm"));
}
table.AddRow(RenderDailyTemp(_weather.Daily[i]));
table.AddRow(RenderDailyDetails(_weather.Daily[i]));
AnsiConsole.Write(table);
}
private static Table RenderDailyDetails(DailyWeather dailyWeather)
{
var table = new Table();
table.Centered();
table.Title("Other Details");
table.AddColumn(new TableColumn("Pressure").Centered());
table.AddColumn(new TableColumn("Humidity").Centered());
table.AddColumn(new TableColumn("Dew Point").Centered());
table.AddColumn(new TableColumn("UVI").Centered());
table.AddColumn(new TableColumn("Clouds").Centered());
table.AddColumn(new TableColumn("Wind").Centered());
table.AddRow(
$"{dailyWeather.wFacts.Pressure} hPa",
$"{dailyWeather.wFacts.Humidity} %",
$"{dailyWeather.wFacts.DewPoint}º C",
$"{dailyWeather.wFacts.Uvi}",
$"{dailyWeather.wFacts.Clouds} %",
$"{dailyWeather.wFacts.Wind.WindSpeed} m/s, ({dailyWeather.wFacts.Wind.WindDeg}º)"
);
return table;
}
private static Table RenderDailyTemp(DailyWeather dailyWeather)
{
var table = new Table();
table.Title("Temperatures Across All Day");
table.AddColumn(new TableColumn("Morning").Centered());
table.AddColumn(new TableColumn("Day").Centered());
table.AddColumn(new TableColumn("Evening").Centered());
table.AddColumn(new TableColumn("Night").Centered());
table.AddRow(new List<IRenderable>{
new Markup($"[blue] Temperature:[/] {dailyWeather.Temp.Morn} ºC"),
new Markup($"[blue] Temperature:[/] {dailyWeather.Temp.Day} ºC"),
new Markup($"[blue] Temperature:[/] {dailyWeather.Temp.Eve} ºC"),
new Markup($"[blue] Temperature:[/] {dailyWeather.Temp.Night} ºC")
});
table.AddRow(new List<IRenderable>{
new Markup($"[blue] Feels Like:[/] {dailyWeather.FeelsLike.Morn} ºC"),
new Markup($"[blue] Feels Like:[/] {dailyWeather.FeelsLike.Day} ºC"),
new Markup($"[blue] Feels Like:[/] {dailyWeather.FeelsLike.Eve} ºC"),
new Markup($"[blue] Feels Like:[/] {dailyWeather.FeelsLike.Night} ºC")
});
return table;
}
}
}