Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@monkbroc
Last active November 29, 2018 14:52
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save monkbroc/3f49f6bc6bd15fc9cbd8 to your computer and use it in GitHub Desktop.
Save monkbroc/3f49f6bc6bd15fc9cbd8 to your computer and use it in GitHub Desktop.
What to wear
function forecastUrl(apiKey, location) {
var apiUrl = "https://api.forecast.io/forecast";
var excludeFields = "exclude=minutely,hourly";
return apiUrl + "/" + apiKey + "/" + location + "?" + excludeFields;
}
function getForecast(url) {
var got = require("got");
return got(url)
.then(function (response) {
return JSON.parse(response.body);
});
}
function forecastMapper(weather) {
return {
// Word weather summary for next 24 hours
summary: weather.daily.data[0].summary,
// Snow or rain?
precipitation: weather.daily.data[0].precipType || "none",
precipProbability: weather.daily.data[0].precipProbability || 0,
// Current temperature
temperature: weather.currently.apparentTemperature
};
}
function clothesForWeather(weather) {
if (weather.precipProbability > 0.4) {
var precip = weather.precipitation;
if(precip.match(/rain/i)) {
return "umbrella";
} else if(precip.match(/snow/i)) {
return "shovel";
}
}
var t = weather.temperature;
if(t < 33) {
return "hat";
} else if(t < 55) {
return "jacket";
} else if(t < 70) {
return "sweater";
} else {
return "tshirt";
}
}
function outputMessage(hook, clothes, message) {
if(hook.params.coreid) {
console.log(message);
hook.res.end(clothes);
} else {
hook.res.end(message + "\n");
}
}
module['exports'] = function whatToWear (hook) {
var location = hook.params.location || hook.env.DEFAULT_LOCATION;
var url = forecastUrl(hook.env.FORECAST_IO_API_KEY, location);
getForecast(url)
.then(function (weather) {
var simpleWeather = forecastMapper(weather);
var clothes = clothesForWeather(simpleWeather);
var message = "Wear " + clothes + " for forecast " + JSON.stringify(simpleWeather);
outputMessage(hook, clothes, message);
})
.catch(function (error) {
console.error("Error getting forecast: " + error);
hook.res.end("error");
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment