var Promise = require('promise') var requestPromise = require('./helpers/requestPromise.js') var BasePlugin = require('./base.js') const logger = require('../logger') class Weather extends BasePlugin { constructor(config) { super(config) this.name = 'Weather' this.apikey = config.keys.owm.apiKey this.iconCodeToText = { '01d': 'selkeää', '02d': 'puolipilvistä', '03d': 'pilvistä', '04d': 'pilvipeite rakoilee', '09d': 'sadekuuroja', '10d': 'vesisadetta', '11d': 'ukkostaa', '13d': 'lumisadetta', '50d': 'sumua', '01n': 'selkeää', '02n': 'puolipilvistä', '03n': 'pilvistä', '04n': 'pilvipeite rakoilee', '09n': 'sadekuuroja', '10n': 'vesisadetta', '11n': 'ukkostaa', '13n': 'lumisadetta', '50n': 'sumua' } } help() { // | Command | Description return '.saa Antaa sään maapallon tärkeimmistä sijainneista' } test(input) { if (input.match(/^\.saa(.*)/i)) { return true } return false } getTemperature(city, code) { var language = 'fi' var urlArgs = { 'q': city, 'lang': language, 'APPID': this.apikey } var url = 'http://api.openweathermap.org/data/2.5/weather' var promise = requestPromise(url, urlArgs) return promise } getTemperatures(cities, code) { logger.info('getting temperatures ', cities, code) if (typeof code === 'undefined') { code = 'fi' } var language = 'fi' var idList = '' for (var city in cities) { idList += cities[city] + ',' } idList = idList.substring(0, idList.length - 1) var urlArgs = { 'id': idList, 'lang': language, 'APPID': this.apikey } var url = 'http://api.openweathermap.org/data/2.5/group' var promise = requestPromise(url, urlArgs).catch(e => { logger.error('Failed to retrieve openweathermap data') }) return promise } getPenaTemperatures(start, stop, limit) { logger.info('getting pena', start, stop, limit) var urlArgs = {} if (typeof limit === 'undefined') { limit = 1 } urlArgs.limit = limit if (typeof start !== 'undefined' && typeof stop !== 'undefined') { urlArgs.limit = limit urlArgs.start = start urlArgs.stop = stop } var url = 'https://masa.dy.fi/api/temperature.php' var promise = requestPromise(url, urlArgs).catch(e => { logger.error('Failed to retrieve pena temperatures data') }) return promise } getTemperatureString(owmCityIds) { let that = this var promise = new Promise(function (resolve, reject) { Promise.all([ that.getTemperatures(owmCityIds), that.getPenaTemperatures() ]).then(function (results) { var resultString = '' // OWM let weatherData = [] if (results[0] !== undefined) { results[0].list.forEach((data) => { var city = data.name var temp = (data.main.temp - 273.15).toFixed(1) var code = data.weather[0].icon weatherData.push(city + ' (' + temp + ' °C, ' + that.iconCodeToText[code] + ')') }) } if (results[1] !== undefined) { if (results[1].length > 0) { var temp = Number(results[1][0].temp).toFixed(1) weatherData.push('Aura (' + temp + ' °C)') } } resultString = weatherData.join(', ') resolve(resultString) }, (str) => reject(str)) }) return promise } result(input) { // Different cases let that = this var resultPromise = new Promise(function (resolve, reject) { if (input.match(/^\.sää$/i) || input.match(/^\.saa$/i)) { that.getTemperatureString(that.config.owmCityIds).then(function (str) { resolve('Sää: ' + str) }, function (str) { reject(new Error(str)) }) } // Weather var res = input.match(/^\.s(ää|aa) ([^0-9]+)$/i) if (res !== null) { // console.log('kaupunki', res[1]); that.getTemperature(res[2]).then(function (result) { // console.log(result); if (result.code === '404') { // console.log('Eioo: ' + res[1]); // client.say(to, 'Eioo: ' + res[2]) resolve('Eioo: ' + res[2]) } else { var city = result.name var country = result.sys.country var temp = (result.main.temp - 273.15).toFixed(1) var code = result.weather[0].icon // var sunriseDate = new Date(result.sys.sunrise * 1000) // var sunsetDate = new Date(result.sys.sunset * 1000) // var sunrise = sunriseDate.getHours() + '.' + sunriseDate.getMinutes() // var sunset = sunsetDate.getHours() + '.' + sunsetDate.getMinutes() var humidity = result.main.humidity var pressure = result.main.pressure var windspeed = result.wind.speed let str = 'Sää: ' + city + ', ' + country + ' (' + temp + ' °C, ' + that.iconCodeToText[code] + ', ilmankosteus: ' + humidity + ' %, ilmanpaine: ' + pressure + ' hPa, tuulen nopeus: ' + windspeed + ' m/s)' resolve('Sää: ' + str) } }, function (error) { logger.error('ERROR ', error) resolve('Oho! Tapahtui virhe. Yritä myöhemmin uudelleen...') }) } }) return resultPromise } } module.exports = Weather