Access Control For Maintaining Mindfulness

Create mindful boundaries for website access with a beautiful interface. Set custom hours for meaningful engagement, receive elegant reminders, and maintain digital well-being. Press Ctrl+S to configure settings.

当前为 2024-11-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Access Control For Maintaining Mindfulness
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  Create mindful boundaries for website access with a beautiful interface. Set custom hours for meaningful engagement, receive elegant reminders, and maintain digital well-being. Press Ctrl+S to configure settings.
// @author       KQ yang
// @match        *://*/*
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Default configuration
    const DEFAULT_CONFIG = {
        startHour: 12,
        endHour: 14,
        restrictedSites: {},
        messageStyle: "background-color: white; margin-top: 20vh; margin-left: 100px; margin-right: 100px; font-size:64px"
    };

    // Load configuration from localStorage
    let CONFIG = JSON.parse(localStorage.getItem('mindfulnessConfig')) || DEFAULT_CONFIG;

    // 添加样式
    function addStyles() {
        const styleSheet = document.createElement("style");
        styleSheet.textContent = `
            .mindfulness-panel {
                position: fixed;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                background: white;
                padding: 30px;
                border-radius: 12px;
                box-shadow: 0 10px 25px rgba(0,0,0,0.2);
                z-index: 999999;
                min-width: 380px;
                font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            }

            .mindfulness-panel h2 {
                margin: 0 0 25px 0;
                color: #2c3e50;
                font-size: 24px;
                text-align: center;
                font-weight: 600;
            }

            .mindfulness-panel .setting-group {
                margin-bottom: 20px;
                padding: 15px;
                background: #f8f9fa;
                border-radius: 8px;
            }

            .mindfulness-panel .setting-item {
                margin-bottom: 15px;
            }

            .mindfulness-panel label {
                display: block;
                margin-bottom: 8px;
                color: #495057;
                font-weight: 500;
            }

            .mindfulness-panel input[type="number"] {
                width: 70px;
                padding: 8px;
                border: 2px solid #e9ecef;
                border-radius: 6px;
                font-size: 14px;
                transition: border-color 0.2s;
            }

            .mindfulness-panel input[type="number"]:focus {
                outline: none;
                border-color: #4dabf7;
            }

            .mindfulness-panel .toggle-switch {
                position: relative;
                display: inline-block;
                width: 60px;
                height: 34px;
            }

            .mindfulness-panel .toggle-switch input {
                opacity: 0;
                width: 0;
                height: 0;
            }

            .mindfulness-panel .toggle-slider {
                position: absolute;
                cursor: pointer;
                top: 0;
                left: 0;
                right: 0;
                bottom: 0;
                background-color: #ccc;
                transition: .4s;
                border-radius: 34px;
            }

            .mindfulness-panel .toggle-slider:before {
                position: absolute;
                content: "";
                height: 26px;
                width: 26px;
                left: 4px;
                bottom: 4px;
                background-color: white;
                transition: .4s;
                border-radius: 50%;
            }

            .mindfulness-panel input:checked + .toggle-slider {
                background-color: #2196F3;
            }

            .mindfulness-panel input:checked + .toggle-slider:before {
                transform: translateX(26px);
            }

            .mindfulness-panel .button-group {
                display: flex;
                justify-content: center;
                gap: 15px;
                margin-top: 25px;
            }

            .mindfulness-panel button {
                padding: 10px 20px;
                border: none;
                border-radius: 6px;
                font-size: 14px;
                font-weight: 500;
                cursor: pointer;
                transition: all 0.2s;
            }

            .mindfulness-panel button.save {
                background-color: #228be6;
                color: white;
            }

            .mindfulness-panel button.save:hover {
                background-color: #1c7ed6;
            }

            .mindfulness-panel button.cancel {
                background-color: #e9ecef;
                color: #495057;
            }

            .mindfulness-panel button.cancel:hover {
                background-color: #dee2e6;
            }

            .mindfulness-panel .site-info {
                color: #868e96;
                font-size: 14px;
                text-align: center;
                margin-bottom: 20px;
            }

            .mindfulness-panel .time-inputs {
                display: flex;
                gap: 20px;
                justify-content: center;
            }

            .mindfulness-panel .status-label {
                margin-left: 10px;
                font-size: 14px;
                color: #495057;
            }
        `;
        document.head.appendChild(styleSheet);
    }

    // 创建配置面板
    function createConfigPanel() {
        const panel = document.createElement('div');
        panel.className = 'mindfulness-panel';

        const currentHost = window.location.hostname;
        const isRestricted = CONFIG.restrictedSites[currentHost];

        panel.innerHTML = `
            <h2>Mindfulness Settings</h2>

            <div class="site-info">
                Current Site: ${currentHost}
            </div>

            <div class="setting-group">
                <div class="setting-item">
                    <label class="toggle-switch">
                        <input type="checkbox" id="restrictSite" ${isRestricted ? 'checked' : ''}>
                        <span class="toggle-slider"></span>
                    </label>
                    <span class="status-label">
                        ${isRestricted ? 'Site is restricted' : 'Site is not restricted'}
                    </span>
                </div>

                <div class="setting-item">
                    <label>Access Time Range</label>
                    <div class="time-inputs">
                        <div>
                            <label>Start</label>
                            <input type="number" id="startHour" value="${CONFIG.startHour}" min="0" max="23">
                        </div>
                        <div>
                            <label>End</label>
                            <input type="number" id="endHour" value="${CONFIG.endHour}" min="0" max="23">
                        </div>
                    </div>
                </div>
            </div>

            <div class="button-group">
                <button class="save" id="saveConfig">Save Changes</button>
                <button class="cancel" id="cancelConfig">Cancel</button>
            </div>
        `;

        // 添加事件监听器
        panel.querySelector('#restrictSite').addEventListener('change', function(e) {
            const statusLabel = panel.querySelector('.status-label');
            statusLabel.textContent = e.target.checked ? 'Site is restricted' : 'Site is not restricted';
        });

        panel.querySelector('#saveConfig').addEventListener('click', saveConfiguration);
        panel.querySelector('#cancelConfig').addEventListener('click', () => panel.remove());

        document.body.appendChild(panel);
    }

    // 保存配置
    function saveConfiguration() {
        const panel = document.querySelector('.mindfulness-panel');
        const currentHost = window.location.hostname;

        const newStartHour = parseInt(panel.querySelector('#startHour').value) || 12;
        const newEndHour = parseInt(panel.querySelector('#endHour').value) || 14;
        const newIsRestricted = panel.querySelector('#restrictSite').checked;

        // 保存新配置
        CONFIG.startHour = newStartHour;
        CONFIG.endHour = newEndHour;

        if (newIsRestricted) {
            CONFIG.restrictedSites[currentHost] = true;
        } else {
            delete CONFIG.restrictedSites[currentHost];
        }

        // 保存到 localStorage
        localStorage.setItem('mindfulnessConfig', JSON.stringify(CONFIG));

        // 关闭面板
        panel.remove();

        // 如果网站现在是不受限的,刷新页面恢复访问
        if (!newIsRestricted && wasPreviouslyBlocked()) {
            window.location.reload();
        } else {
            // 检查并应用新的限制
            checkAndApplyRestriction();
        }
    }

    // 检查页面是否之前被阻止
    function wasPreviouslyBlocked() {
        const currentContent = document.body.innerHTML;
        return currentContent.includes("Dear Me!") &&
               currentContent.includes("You preserved this page") &&
               currentContent.includes("maintained mindfulness");
    }

    // 检查并应用访问限制
    function checkAndApplyRestriction() {
        const currentHost = window.location.hostname;

        // 如果当前网站不在限制列表中,直接返回
        if (!CONFIG.restrictedSites[currentHost]) {
            return;
        }

        const now = new Date();
        const hours = now.getHours();
        const minutes = now.getMinutes();

        // 检查是否在允许的时间范围内
        if (hours < CONFIG.startHour || (hours >= CONFIG.endHour && minutes > 0)) {
            // 如果在限制时间内,替换页面内容
            // 设置背景和内容
            document.body.innerHTML = `
                <style>
                    @import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@400;600&display=swap');

                    body {
                        margin: 0;
                        padding: 0;
                        min-height: 100vh;
                        background: linear-gradient(135deg, #1a1a1a 0%, #363636 100%);
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        font-family: 'Cormorant Garamond', serif;
                        color: #d4af37;
                        overflow: hidden;
                    }

                    .sacred-container {
                        text-align: center;
                        width: 90vw;
                        max-width: 1400px;
                        padding: 60px;
                        background: rgba(0, 0, 0, 0.85);
                        border-radius: 30px;
                        box-shadow: 0 0 100px rgba(212, 175, 55, 0.25);
                        border: 3px solid rgba(212, 175, 55, 0.4);
                        position: relative;
                    }

                    .sacred-symbol {
                        font-size: 7em;
                        margin: 20px 0;
                        color: #d4af37;
                    }

                    .lotus-symbol {
                        width: 120px;
                        height: 120px;
                        margin: 20px auto;
                        background: linear-gradient(45deg, #d4af37, #FFD700);
                        -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12,2L9,12L3,14L9,16L12,22L15,16L21,14L15,12L12,2M12,5.5L14,12.5L18,13.75L14,15L12,19L10,15L6,13.75L10,12.5L12,5.5Z'/%3E%3C/svg%3E") center/contain no-repeat;
                        mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12,2L9,12L3,14L9,16L12,22L15,16L21,14L15,12L12,2M12,5.5L14,12.5L18,13.75L14,15L12,19L10,15L6,13.75L10,12.5L12,5.5Z'/%3E%3C/svg%3E") center/contain no-repeat;
                    }

                    .sacred-title {
                        font-size: 7em;
                        margin-bottom: 40px;
                        font-weight: 600;
                        text-transform: uppercase;
                        letter-spacing: 8px;
                        color: #d4af37;
                        text-shadow: 0 0 20px rgba(212, 175, 55, 0.4);
                        line-height: 1.2;
                    }

                    .sacred-message {
                        font-size: 4.5em;
                        line-height: 1.3;
                        margin-bottom: 40px;
                        color: #e5e5e5;
                    }

                    .sacred-quote {
                        font-style: italic;
                        font-size: 4em;
                        color: #d4af37;
                        margin: 40px auto;
                        padding: 30px 40px;
                        border-left: 5px solid #d4af37;
                        text-align: left;
                        max-width: 90%;
                        line-height: 1.3;
                    }

                    .sacred-time {
                        font-size: 4.2em;
                        color: #d4af37;
                        margin-top: 50px;
                        padding: 30px;
                        border-top: 2px solid rgba(212, 175, 55, 0.3);
                        line-height: 1.3;
                    }

                    .time-highlight {
                        font-size: 1.2em;
                        font-weight: 600;
                        text-shadow: 0 0 15px rgba(212, 175, 55, 0.5);
                    }

                    /* 响应式调整 */
                    @media (max-width: 768px) {
                        .sacred-title { font-size: 5em; }
                        .sacred-message { font-size: 3.5em; }
                        .sacred-quote { font-size: 3em; }
                        .sacred-time { font-size: 3.2em; }
                        .lotus-symbol {
                            width: 80px;
                            height: 80px;
                        }
                    }

                    @media (max-width: 480px) {
                        .sacred-container { padding: 30px; }
                        .sacred-title { font-size: 4em; }
                        .sacred-message { font-size: 2.8em; }
                        .sacred-quote { font-size: 2.5em; }
                        .sacred-time { font-size: 2.5em; }
                        .lotus-symbol {
                            width: 60px;
                            height: 60px;
                        }
                    }
                </style>

                <div class="sacred-container">
                    <div class="lotus-symbol"></div>
                    <div class="sacred-title">Sacred Pause</div>

                    <div class="sacred-message">
                        Beloved Self,<br>
                        This boundary reflects your wisdom<br>
                        and commitment to conscious living.
                    </div>

                    <div class="sacred-quote">
                        "Every moment of restraint<br>
                        transforms into inner strength.<br>
                        Your mindful choice ripples through time."
                    </div>

                    <div class="sacred-time">
                        Your space awaits between<br>
                        <span class="time-highlight">${CONFIG.startHour}:00 - ${CONFIG.endHour}:00</span>
                    </div>

                    <div class="lotus-symbol"></div>
                </div>
            `;
        }
    }

    // 添加快捷键监听器
    document.addEventListener('keydown', function(e) {
        if (e.ctrlKey && (e.key === 's' || e.key === 'S')) {
            e.preventDefault();
            createConfigPanel();
        }
    });

    // 初始化
    addStyles();
    checkAndApplyRestriction();
})();