le js méteo 2 apiexports.action = function(data, callback, config, SARAH){
// Retrieve config
config = config.modules.meteo2;
if (!config.id || !config.day || !config.api_key || config.api_key == '')
{
console.log("Missing Meteo config in prop file");
callback({'tts' : 'configuration invalide'});
return;
}
var url = "http://api.openweathermap.org/data/2.5/forecast/daily?units=metric&lang=fr&APPID=400d0936f53953a8861b5c986d3277f7&units=metric&lang=fr&q=Valdahon,fr"
if (data.dictation)
{
console.log("Dictation : " + data.dictation);
if (data.dictation.length > 0 && data.dictation.indexOf("toi à") >= 0)
{
var position = data.dictation.indexOf("toi à") + 6;
var citySearch = data.dictation.substring(position);
console.log("Ville recherchée : " + citySearch);
url += "&q=" + encodeURIComponent(citySearch);
if (data.countryCode)
{
url += "," + data.countryCode; // Permet de préciser dans l'url le pays de la ville recherchée
}
}
else
{
callback({'tts' : "Je n'ai pas compris"});
return;
}
}
else
{
url += "&id=" + (data.id || config.id);
}
var request = require('request');
request({ 'uri' : url , json : true}, function (err, response, body)
{
if (err || response.statusCode != 200)
{
callback({'tts': "Je n'ai pas trouvé d'information"});
return;
}
var tts = parse(body, data.day || config.day, data.period || false);
callback({'tts' : tts});
});
}
var parse = function(body, day, period)
{
// Récupération du pays avec le Country Code Top-Level Domain
var ccTLD = require('./ccTLD');
var country = ccTLD.getCountryWithCCTLD(body.city.country.toLowerCase());
// --- Ville recherchée ---
var cityName = body.city.name;
// Concaténation de la ville et du pays
if (cityName != '')
{
cityName = " à " + cityName;
if (country != '') {cityName += ", " + country};
};
// --- Récupération du jour de la semaine ---
var numDaySearch = false;
if (day == 'lundi') { numDaySearch = 1;}
else if (day == 'mardi') { numDaySearch = 2;}
else if (day == 'mercredi') { numDaySearch = 3;}
else if (day == 'jeudi') { numDaySearch = 4;}
else if (day == 'vendredi') { numDaySearch = 5;}
else if (day == 'samedi') { numDaySearch = 6;}
else if (day == 'dimanche') { numDaySearch = 0;}
var today = new Date();
var numToday = today.getDay();
var index = 0; // index est égal au jour recherché dans la liste renvoyée par le json
if (numDaySearch === false)
{
index = day; // Dans ce cas, day est un entier (Aujourd'hui : 0), (demain : 1), (après-demain : 2)
}
else
{
if (numDaySearch >= numToday)
{
index = numDaySearch - numToday;
}
else
{
index = 7 - (numToday - numDaySearch);
}
}
// --- Vérification entre la date du jour et la 1ère date renvoyée par le webservice (décalage GMT) ---
var firstTimestamp = body.list[0].dt;
var firstDate = new Date(firstTimestamp*1000);
if ((firstDate.getDay() == numToday - 1) || (firstDate.getDay() == 6 && numToday == 0))
{
index++;
if (index > 6)
{
var tts = "Je n'ai pas encore les prévisions météorologique pour " + firstDate.getDayName();
return tts;
}
}
// --- Récupération de la date souhaitée ---
var timestamp = body.list[index].dt;
var searchDate = new Date(timestamp*1000);
var searchDateString;
var conjonction;
if (searchDate.getDay() == numToday)
{
searchDateString = "aujourd'hui";
conjonction = " est de ";
}
else
{
// ex : Samedi 29 Juin 2013
searchDateString = searchDate.getDayName() + ' ' + searchDate.getDate() + ' ' + searchDate.getMonthName() + ' ' + searchDate.getFullYear();
conjonction = " atteindra ";
}
// --- Récupération des températures ---
var tempString = "";
if (period !== false)
{
var temp = parseInt(body.list[index].temp[period]);
tempString = "La température prévue ";
if (period == 'day')
{
if (searchDate.getDay() == numToday) {tempString = "La témpérature actuelle";} else {tempString += "dans la journée de #DAY#";}
}
else if (period == 'night')
{
if (searchDate.getDay() == numToday) {tempString += "cette nuit";} else {tempString += "dans la nuit de #DAY#";}
}
else if (period == 'eve')
{
if (searchDate.getDay() == numToday) {tempString += "ce soir";} else {tempString += "dans la soirée de #DAY#";}
}
else if (period == 'morn')
{
if (searchDate.getDay() == numToday) {tempString += "ce matin";} else {tempString += "dans la matinée de #DAY#";}
}
else if (period == 'min')
{
if (searchDate.getDay() == numToday) {tempString = "La température minimale prévue";} else {tempString = "La température minimale prévue pour #DAY#";}
}
else if (period == 'max')
{
if (searchDate.getDay() == numToday) {tempString = "La température maximale prévue";} else {tempString = "La température maximale prévue pour #DAY#";}
}
tempString += conjonction + temp + "degrés.";
tempString = tempString.replace('#DAY#', searchDate.getDayName());
}
else
{
var tempMin = Math.round(parseFloat(body.list[index].temp.min));
var tempMax = Math.round(parseFloat(body.list[index].temp.max));
if (searchDate.getDay() == numToday)
{
tempString = "Les températures prévues sont de " + tempMin + " degrés pour les minimales et de " + tempMax + " degrés pour les maximales.";
}
else
{
tempString = "Les températures prévues pour " + searchDate.getDayName() + " atteindront " + tempMin + " degrés pour les minimales";
tempString += " et " + tempMax + " degrés pour les maximales.";
}
}
var tts = "Voici mes prévisions météorologique,";
tts += " " + body.list[index].weather[0].description + " prévu " + searchDateString + cityName + ".";
tts += " " + tempString;
tts += " L'humidité de l'air" + conjonction + body.list[index].humidity + " %.";
tts += " La vitesse du vant" + conjonction + parseInt(body.list[index].speed / 1000 * 3600) + " km/h."; // "vant" = "vent" --> pour une meilleure prononciation
tts += " La pression de l'air" + conjonction + parseInt(body.list[index].pressure) + " mili bar.";
return tts;
}
Date.prototype.getMonthName = function()
{
var m = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'];
return m[this.getMonth()];
}
Date.prototype.getDayName = function()
{
var d = ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'];
return d[this.getDay()];
}
// Retrieve config
config = config.modules.meteo2;
if (!config.id || !config.day || !config.api_key || config.api_key == '')
{
console.log("Missing Meteo config in prop file");
callback({'tts' : 'configuration invalide'});
return;
}
var url = "http://api.openweathermap.org/data/2.5/forecast/daily?units=metric&lang=fr&APPID=400d0936f53953a8861b5c986d3277f7&units=metric&lang=fr&q=Valdahon,fr"
if (data.dictation)
{
console.log("Dictation : " + data.dictation);
if (data.dictation.length > 0 && data.dictation.indexOf("toi à") >= 0)
{
var position = data.dictation.indexOf("toi à") + 6;
var citySearch = data.dictation.substring(position);
console.log("Ville recherchée : " + citySearch);
url += "&q=" + encodeURIComponent(citySearch);
if (data.countryCode)
{
url += "," + data.countryCode; // Permet de préciser dans l'url le pays de la ville recherchée
}
}
else
{
callback({'tts' : "Je n'ai pas compris"});
return;
}
}
else
{
url += "&id=" + (data.id || config.id);
}
var request = require('request');
request({ 'uri' : url , json : true}, function (err, response, body)
{
if (err || response.statusCode != 200)
{
callback({'tts': "Je n'ai pas trouvé d'information"});
return;
}
var tts = parse(body, data.day || config.day, data.period || false);
callback({'tts' : tts});
});
}
var parse = function(body, day, period)
{
// Récupération du pays avec le Country Code Top-Level Domain
var ccTLD = require('./ccTLD');
var country = ccTLD.getCountryWithCCTLD(body.city.country.toLowerCase());
// --- Ville recherchée ---
var cityName = body.city.name;
// Concaténation de la ville et du pays
if (cityName != '')
{
cityName = " à " + cityName;
if (country != '') {cityName += ", " + country};
};
// --- Récupération du jour de la semaine ---
var numDaySearch = false;
if (day == 'lundi') { numDaySearch = 1;}
else if (day == 'mardi') { numDaySearch = 2;}
else if (day == 'mercredi') { numDaySearch = 3;}
else if (day == 'jeudi') { numDaySearch = 4;}
else if (day == 'vendredi') { numDaySearch = 5;}
else if (day == 'samedi') { numDaySearch = 6;}
else if (day == 'dimanche') { numDaySearch = 0;}
var today = new Date();
var numToday = today.getDay();
var index = 0; // index est égal au jour recherché dans la liste renvoyée par le json
if (numDaySearch === false)
{
index = day; // Dans ce cas, day est un entier (Aujourd'hui : 0), (demain : 1), (après-demain : 2)
}
else
{
if (numDaySearch >= numToday)
{
index = numDaySearch - numToday;
}
else
{
index = 7 - (numToday - numDaySearch);
}
}
// --- Vérification entre la date du jour et la 1ère date renvoyée par le webservice (décalage GMT) ---
var firstTimestamp = body.list[0].dt;
var firstDate = new Date(firstTimestamp*1000);
if ((firstDate.getDay() == numToday - 1) || (firstDate.getDay() == 6 && numToday == 0))
{
index++;
if (index > 6)
{
var tts = "Je n'ai pas encore les prévisions météorologique pour " + firstDate.getDayName();
return tts;
}
}
// --- Récupération de la date souhaitée ---
var timestamp = body.list[index].dt;
var searchDate = new Date(timestamp*1000);
var searchDateString;
var conjonction;
if (searchDate.getDay() == numToday)
{
searchDateString = "aujourd'hui";
conjonction = " est de ";
}
else
{
// ex : Samedi 29 Juin 2013
searchDateString = searchDate.getDayName() + ' ' + searchDate.getDate() + ' ' + searchDate.getMonthName() + ' ' + searchDate.getFullYear();
conjonction = " atteindra ";
}
// --- Récupération des températures ---
var tempString = "";
if (period !== false)
{
var temp = parseInt(body.list[index].temp[period]);
tempString = "La température prévue ";
if (period == 'day')
{
if (searchDate.getDay() == numToday) {tempString = "La témpérature actuelle";} else {tempString += "dans la journée de #DAY#";}
}
else if (period == 'night')
{
if (searchDate.getDay() == numToday) {tempString += "cette nuit";} else {tempString += "dans la nuit de #DAY#";}
}
else if (period == 'eve')
{
if (searchDate.getDay() == numToday) {tempString += "ce soir";} else {tempString += "dans la soirée de #DAY#";}
}
else if (period == 'morn')
{
if (searchDate.getDay() == numToday) {tempString += "ce matin";} else {tempString += "dans la matinée de #DAY#";}
}
else if (period == 'min')
{
if (searchDate.getDay() == numToday) {tempString = "La température minimale prévue";} else {tempString = "La température minimale prévue pour #DAY#";}
}
else if (period == 'max')
{
if (searchDate.getDay() == numToday) {tempString = "La température maximale prévue";} else {tempString = "La température maximale prévue pour #DAY#";}
}
tempString += conjonction + temp + "degrés.";
tempString = tempString.replace('#DAY#', searchDate.getDayName());
}
else
{
var tempMin = Math.round(parseFloat(body.list[index].temp.min));
var tempMax = Math.round(parseFloat(body.list[index].temp.max));
if (searchDate.getDay() == numToday)
{
tempString = "Les températures prévues sont de " + tempMin + " degrés pour les minimales et de " + tempMax + " degrés pour les maximales.";
}
else
{
tempString = "Les températures prévues pour " + searchDate.getDayName() + " atteindront " + tempMin + " degrés pour les minimales";
tempString += " et " + tempMax + " degrés pour les maximales.";
}
}
var tts = "Voici mes prévisions météorologique,";
tts += " " + body.list[index].weather[0].description + " prévu " + searchDateString + cityName + ".";
tts += " " + tempString;
tts += " L'humidité de l'air" + conjonction + body.list[index].humidity + " %.";
tts += " La vitesse du vant" + conjonction + parseInt(body.list[index].speed / 1000 * 3600) + " km/h."; // "vant" = "vent" --> pour une meilleure prononciation
tts += " La pression de l'air" + conjonction + parseInt(body.list[index].pressure) + " mili bar.";
return tts;
}
Date.prototype.getMonthName = function()
{
var m = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'];
return m[this.getMonth()];
}
Date.prototype.getDayName = function()
{
var d = ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'];
return d[this.getDay()];
}
Commentaires
Enregistrer un commentaire