-
Notifications
You must be signed in to change notification settings - Fork 0
/
APIData.cs
115 lines (96 loc) · 3.92 KB
/
APIData.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
using System;
using System.Net.Http;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using Newtonsoft.Json;
using System.Text.RegularExpressions;
namespace Weather_Data
{
public class APIData
{
public string AccessToken { get; private set; }
public string StationName { get; set; }
public string Country { get; set; }
private Dictionary<string, string> data;
public APIData(string token, string weatherStationName, string countryCode = "pl")
{
AccessToken = token.ToLower();
StationName = weatherStationName.ToUpper();
Country = countryCode.ToLower();
Console.WriteLine("Data downloaded");
if (!new Regex("^[0-9a-f]+$").IsMatch(AccessToken))
{
DialogResult result = MessageBox.Show("API token is not valid. Your token is invalid. Do you want to enter it?", "API token error", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (result == DialogResult.Yes)
{
AccessToken = Microsoft.VisualBasic.Interaction.InputBox("Enter your API token", "API token", "");
_ = new APIData(AccessToken, StationName, Country);
}
else
Environment.Exit(1);
}
data = DownloadData();
}
private Dictionary<string, string> DownloadData()
{
string url = "https://api.synopticdata.com/v2/stations/latest?&" +
$"token={AccessToken}&" +
$"stid={StationName}&" +
$"country={Country}&" +
"obtimezone=local&" +
"timeformat=%d.%m.%Yr.&" +
"units=speed|kph";
HttpClient client = new HttpClient();
Dictionary<string, string> observationsDict = new Dictionary<string, string>();
try
{
HttpResponseMessage response = client.GetAsync(url).Result;
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
JObject json = JObject.Parse(responseBody);
#region Checking response code
string responseMessage = (string)json["SUMMARY"]["RESPONSE_MESSAGE"];
if (responseMessage != "OK")
{
throw new JsonSerializationException(responseMessage);
}
#endregion
JObject station = (JObject)json["STATION"][0];
JObject observations = (JObject)station["OBSERVATIONS"];
foreach (var observation in observations)
{
JObject observationValue = (JObject)observation.Value;
string value = observationValue["value"].ToString();
observationsDict.Add(observation.Key, value);
}
}
catch(JsonSerializationException eJson)
{
MessageBox.Show($"An exception occurred:\nMake sure your API token, weather station name and country is correct\n\nError content: {eJson.Message}\n", "Data exception",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(1);
}
catch (Exception e)
{
MessageBox.Show($"An exception occurred:\n{e.Message}", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(1);
}
return observationsDict;
}
public void Refresh()
{
data = DownloadData();
}
public string GetData(string index)
{
string output = "--";
try
{
output = data[index];
}
catch (KeyNotFoundException) { }
return output;
}
}
}