-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathweatheralertprovider.js
157 lines (136 loc) · 4.76 KB
/
weatheralertprovider.js
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
/* global Class, performWebRequest */
/* MagicMirror²
* Module: MMM-WeatherAlerts
*
* Based on weatherProvider by Michael Teeuw https://michaelteeuw.nl
* MIT Licensed.
*
* This class is the blueprint for a weather alert provider.
*/
const WeatherAlertProvider = Class.extend({
// Weather Provider Properties
providerName: null,
defaults: {},
// The following properties have accessor methods.
// Try to not access them directly.
currentWeatherObject: null,
weatherForecastArray: null,
weatherHourlyArray: null,
fetchedLocationName: null,
// The following properties will be set automatically.
// You do not need to overwrite these properties.
config: null,
delegate: null,
providerIdentifier: null,
// Weather Provider Methods
// All the following methods can be overwritten, although most are good as they are.
// Called when a weather provider is initialized.
init: function (config) {
this.config = config;
Log.info(`Weather alert provider: ${this.providerName} initialized.`);
},
// Called to set the config, this config is the same as the weather module's config.
setConfig: function (config) {
this.config = config;
Log.info(
`Weather alert provider: ${this.providerName} config set.`,
this.config
);
},
// Called when the weather provider is about to start.
start: function () {
Log.info(`Weather alert provider: ${this.providerName} started.`);
},
// This method should start the API request to fetch the current weather.
// This method should definitely be overwritten in the provider.
fetchCurrentWeatherAlerts: function () {
Log.warn(
`Weather alert provider: ${this.providerName} does not subclass the fetchCurrentWeatherAlerts method.`
);
},
// This returns a WeatherAlerts object for the current weather alerts.
currentWeatherAlerts: function () {
return this.currentWeatherAlertsObject;
},
// This returns the name of the fetched location or an empty string.
fetchedLocation: function () {
return this.fetchedLocationName || "";
},
// Set the currentWeatherAlerts and notify the delegate that new information is available.
setCurrentWeatherAlerts: function (currentWeatherAlertsObject) {
// We should check here if we are passing a WeatherAlert
this.currentWeatherAlertsObject = currentWeatherAlertsObject;
},
// Set the fetched location name.
setFetchedLocation: function (name) {
this.fetchedLocationName = name;
},
// Notify the delegate that new weather is available.
updateAvailable: function () {
this.delegate.updateAvailable(this);
},
/**
* A convenience function to make requests.
*
* @param {string} url the url to fetch from
* @param {string} type what contenttype to expect in the response, can be "json" or "xml"
* @param {Array.<{name: string, value:string}>} requestHeaders the HTTP headers to send
* @param {Array.<string>} expectedResponseHeaders the expected HTTP headers to recieve
* @returns {Promise} resolved when the fetch is done
*/
fetchData: async function (
url,
type = "json",
requestHeaders = undefined,
expectedResponseHeaders = undefined
) {
const mockData = this.config.mockData;
if (mockData) {
const data = mockData.substring(1, mockData.length - 1);
return JSON.parse(data);
}
const useCorsProxy =
typeof this.config.useCorsProxy !== "undefined" &&
this.config.useCorsProxy;
return performWebRequest(
url,
type,
useCorsProxy,
requestHeaders,
expectedResponseHeaders
);
},
});
/**
* Collection of registered weather providers.
*/
WeatherAlertProvider.providers = [];
/**
* Static method to register a new weather provider.
*
* @param {string} providerIdentifier The name of the weather provider
* @param {object} providerDetails The details of the weather provider
*/
WeatherAlertProvider.register = function (providerIdentifier, providerDetails) {
WeatherAlertProvider.providers[providerIdentifier.toLowerCase()] =
WeatherAlertProvider.extend(providerDetails);
};
/**
* Static method to initialize a new weather provider.
*
* @param {string} providerIdentifier The name of the weather provider
* @param {object} delegate The weather module
* @returns {object} The new weather provider
*/
WeatherAlertProvider.initialize = function (providerIdentifier, delegate) {
providerIdentifier = providerIdentifier.toLowerCase();
const provider = new WeatherAlertProvider.providers[providerIdentifier]();
const config = Object.assign({}, provider.defaults, delegate.config);
provider.delegate = delegate;
provider.setConfig(config);
provider.providerIdentifier = providerIdentifier;
if (!provider.providerName) {
provider.providerName = providerIdentifier;
}
return provider;
};