Calculate perfect sleep cycles based on Islamic prayer times (Salat) and the example of Prophet Dawud (David). Automatically detects user's city using IP address.
// ==UserScript==
// @name PerfectTimeToSleepAndSalatTime
// @namespace http://tampermonkey.net/
// @version 1.5
// @description Calculate perfect sleep cycles based on Islamic prayer times (Salat) and the example of Prophet Dawud (David). Automatically detects user's city using IP address.
// @author MeGaMoSbah
// @match *://*/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=google.com
// @grant GM_xmlhttpRequest
// @grant GM_getValue
// @grant GM_setValue
// @connect muslimsalat.com
// @connect ipinfo.io
// ==/UserScript==
(function () {
'use strict';
// Fonction pour convertir une heure au format 12h (AM/PM) en 24h
function convertTo24Hour(time) {
const [timePart, period] = time.split(' ');
let [hours, minutes] = timePart.split(':').map(Number);
if (period === 'pm' && hours !== 12) {
hours += 12;
} else if (period === 'am' && hours === 12) {
hours = 0;
}
return { hours, minutes };
}
// Fonction pour convertir les minutes en heures et minutes
function toHoursAndMinutes(totalMinutes) {
const hours = Math.floor(totalMinutes / 60) % 24; // Assure que les heures restent dans une plage de 24 heures
const minutes = totalMinutes % 60;
return { hours, minutes };
}
// Fonction pour formater l'heure en HH:MM
function formatTime(hours, minutes) {
return `${hours}:${minutes < 10 ? '0' + minutes : minutes}`;
}
// Fonction pour calculer les cycles de sommeil
function calculateSleepCycles(ishaTime, fajrTime) {
// Convertir Isha et Fajr en format 24 heures
const isha = convertTo24Hour(ishaTime);
const fajr = convertTo24Hour(fajrTime);
// Convertir les heures en minutes depuis minuit
const ishaTotalMinutes = isha.hours * 60 + isha.minutes;
const fajrTotalMinutes = fajr.hours * 60 + fajr.minutes;
// Calculer la durée totale de la nuit en minutes
let nightDuration;
if (fajrTotalMinutes > ishaTotalMinutes) {
nightDuration = fajrTotalMinutes - ishaTotalMinutes;
} else {
nightDuration = (24 * 60 - ishaTotalMinutes) + fajrTotalMinutes; // Gestion du passage à minuit
}
// Diviser la nuit en 6 cycles (comme dans l'exemple de Prophet Dawud)
const cycleDuration = Math.floor(nightDuration / 6);
// Calculer les heures de début de chaque cycle
const cycles = [];
for (let i = 0; i <= 6; i++) {
const cycleStartMinutes = ishaTotalMinutes + i * cycleDuration;
const cycleStart = toHoursAndMinutes(cycleStartMinutes % (24 * 60)); // Gestion du passage à minuit
cycles.push(formatTime(cycleStart.hours, cycleStart.minutes));
}
return cycles;
}
// Fonction pour afficher les temps de prière et les cycles de sommeil
function displayPrayerTimesAndSleepCycles(data) {
const times = data.items[0];
// Extraire les temps de prière
const fajrTime = times.fajr;
const chouroukTime = times.shurooq;
const dohrTime = times.dhuhr;
const asrTime = times.asr;
const maghrebTime = times.maghrib;
const ishaTime = times.isha;
console.log("Fajr time is: " + fajrTime);
console.log("Chourouk time is: " + chouroukTime);
console.log("Dohr time is: " + dohrTime);
console.log("Asr time is: " + asrTime);
console.log("Maghreb time is: " + maghrebTime);
console.log("Isha time is: " + ishaTime);
// Calculer les cycles de sommeil
const sleepCycles = calculateSleepCycles(ishaTime, fajrTime);
console.log("Sleep cycles based on Prophet Dawud's example:");
sleepCycles.forEach((cycle, index) => {
console.log(`Cycle ${index + 1} starts at: ${cycle}`);
});
// Calculer le meilleur temps pour dormir (moitié du temps entre Isha et Fajr + dernier 1/6)
const isha = convertTo24Hour(ishaTime);
const fajr = convertTo24Hour(fajrTime);
const ishaTotalMinutes = isha.hours * 60 + isha.minutes;
const fajrTotalMinutes = fajr.hours * 60 + fajr.minutes;
let nightDuration;
if (fajrTotalMinutes > ishaTotalMinutes) {
nightDuration = fajrTotalMinutes - ishaTotalMinutes;
} else {
nightDuration = (24 * 60 - ishaTotalMinutes) + fajrTotalMinutes; // Gestion du passage à minuit
}
// Moitié du temps entre Isha et Fajr
const halfNight = Math.floor(nightDuration / 2);
const halfNightTime = toHoursAndMinutes(ishaTotalMinutes + halfNight);
// Dernier 1/6 du temps entre Isha et Fajr
const lastSixth = Math.floor(nightDuration / 6);
const lastSixthTime = toHoursAndMinutes(ishaTotalMinutes + nightDuration - lastSixth);
console.log("Best time to sleep (half of the night): " + formatTime(halfNightTime.hours, halfNightTime.minutes));
console.log("Best time to sleep (last 1/6 of the night): " + formatTime(lastSixthTime.hours, lastSixthTime.minutes));
}
// Fonction pour récupérer les temps de prière en fonction de la ville
function fetchPrayerTimes(city) {
const url = `https://muslimsalat.com/${city}/daily.json`;
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function (response) {
const data = JSON.parse(response.responseText);
if (data.status_valid === 1) {
displayPrayerTimesAndSleepCycles(data);
} else {
console.error("Failed to fetch prayer times. Please check the city name.");
}
},
onerror: function (error) {
console.error("Error fetching prayer times:", error);
}
});
}
// Fonction pour détecter la ville de l'utilisateur via l'adresse IP
function detectUserCityByIP() {
const ipInfoUrl = "https://ipinfo.io/json";
GM_xmlhttpRequest({
method: "GET",
url: ipInfoUrl,
onload: function (response) {
const data = JSON.parse(response.responseText);
const city = data.city;
if (city) {
console.log("Detected city using IP:", city);
fetchPrayerTimes(city);
} else {
console.error("City not found using IP. Using default city: Oran");
fetchPrayerTimes("Oran"); // Ville par défaut
}
},
onerror: function (error) {
console.error("Error detecting city using IP:", error);
fetchPrayerTimes("Oran"); // Ville par défaut en cas d'erreur
}
});
}
// Démarrer le script
detectUserCityByIP();
})();