PerfectTimeToSleepAndSalatTime

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.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();
})();