UnicoTimer

Показывает время работы банков

目前為 2024-08-06 提交的版本,檢視 最新版本

// ==UserScript==
// @name         UnicoTimer
// @version      3.1
// @description  Показывает время работы банков
// @author       Ебейший 77
// @match        *://web.chat2desk.com/*
// @match        *://web.chat2desk.by/*
// @grant        GM_xmlhttpRequest
// @license      MIT
// @namespace    https://greasyfork.org/users/1338837
// ==/UserScript==

const GITHUB_VERSION_URL = '';
const GITHUB_SCRIPT_URL = '';
const CURRENT_VERSION = '3.1';

function checkForUpdates() {
    GM_xmlhttpRequest({
        method: 'GET',
        url: GITHUB_VERSION_URL,
        onload: function(response) {
            const latestVersion = response.responseText.trim();
            if (latestVersion > CURRENT_VERSION) {
                if (confirm(`Доступна новая версия UnicoTimer (${latestVersion}). Обновить сейчас?`)) {
                    window.location.href = GITHUB_SCRIPT_URL;
                }
            }
        }
    });
}

const script = document.createElement('script');
script.src = 'https://cdnjs.cloudflare.com/ajax/libs/luxon/2.3.0/luxon.min.js';
document.head.appendChild(script);

script.onload = function() {
    const { DateTime } = luxon;

    function createButton() {
        const button = document.createElement('button');
        button.innerHTML = `
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
                <circle cx="12" cy="12" r="10" stroke="white" stroke-width="2"/>
                <line x1="12" y1="12" x2="16" y2="8" stroke="white" stroke-width="2"/>
                <line x1="12" y1="12" x2="12" y2="16" stroke="white" stroke-width="2"/>
            </svg>
        `;
        button.style.position = 'fixed';
        button.style.bottom = '2vh';
        button.style.left = '1vw';
        button.style.zIndex = 1000;
        button.style.width = '60px';
        button.style.height = '60px';
        button.style.backgroundColor = '#808080';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.borderRadius = '50%';
        button.style.cursor = 'pointer';
        button.style.display = 'flex';
        button.style.justifyContent = 'center';
        button.style.alignItems = 'center';
        document.body.appendChild(button);
        button.addEventListener('click', chooseMode);
    }

    function chooseMode() {
        const choice = confirm("Чтобы открыть часы в новом окне Нажмите 'OK' для нового окна или 'Отмена' для виджета на сайте.");
        if (choice) {
            createTimeWindow();
        } else {
            createTimePanel();
        }
    }

    function createTimeWindow() {
        var timeWindow = window.open('', '', 'width=300,height=500');
        if (!timeWindow) {
            alert('Леее, разреши всплывающие окно для этого сайта');
            return;
        }

        var container = timeWindow.document.createElement('div');
        container.id = 'time-widget-container';
        container.style.backgroundColor = 'white';
        container.style.border = '1px solid #ddd';
        container.style.padding = '10px';
        container.style.boxShadow = '0 0 10px rgba(0,0,0,0.1)';
        container.style.borderRadius = '8px';
        container.style.resize = 'both';
        container.style.overflow = 'auto';
        timeWindow.document.body.appendChild(container);

        setupClock(container);
    }

    function createTimePanel() {
        var container = document.createElement('div');
        container.id = 'time-widget-container';
        container.style.position = 'fixed';
        container.style.top = '10px';
        container.style.left = '10px';
        container.style.zIndex = '9999';
        container.style.backgroundColor = 'white';
        container.style.border = '1px solid #ddd';
        container.style.padding = '10px';
        container.style.boxShadow = '0 0 10px rgba(0,0,0,0.1)';
        container.style.borderRadius = '8px';
        container.style.resize = 'both';
        container.style.overflow = 'auto';

        const closeButton = document.createElement('button');
        closeButton.textContent = 'X';
        closeButton.style.position = 'absolute';
        closeButton.style.top = '5px';
        closeButton.style.right = '5px';
        closeButton.style.backgroundColor = 'red';
        closeButton.style.color = 'white';
        closeButton.style.border = 'none';
        closeButton.style.borderRadius = '50%';
        closeButton.style.cursor = 'pointer';
        closeButton.style.width = '20px';
        closeButton.style.height = '20px';
        closeButton.addEventListener('click', () => {
            container.remove();
        });
        container.appendChild(closeButton);

        document.body.appendChild(container);

        setupClock(container);
    }

    function setupClock(container) {
        var countries = {
            'Боливия': 'America/La_Paz',
            'Перу': 'America/Lima',
            'Эквадор': 'America/Guayaquil',
            'Колумбия': 'America/Bogota',
            'Гватемала': 'America/Guatemala',
            'Коста-Рика': 'America/Costa_Rica',
            'Аргентина': 'America/Argentina/Buenos_Aires'
        };

        var bankHours = {
            'Боливия': { open: 9, close: 16, saturdayOpen: 9, saturdayClose: 12 },
            'Перу': { open: 9, close: 17, saturdayOpen: 9, saturdayClose: 13 },
            'Эквадор': { open: 9, close: 17, saturdayOpen: 9, saturdayClose: 13 },
            'Колумбия': { open: 9, close: 16, saturdayOpen: 9, saturdayClose: 13 },
            'Гватемала': { open: 9, close: 16, saturdayOpen: 9, saturdayClose: 12 },
            'Коста-Рика': { open: 8, close: 16, saturdayOpen: 9, saturdayClose: 12 },
            'Аргентина': { open: 10, close: 15, saturdayOpen: 10, saturdayClose: 13 }
        };

        for (var country in countries) {
            var clock = document.createElement('div');
            clock.style.marginBottom = '10px';
            var countryDiv = document.createElement('div');
            countryDiv.textContent = country;
            countryDiv.style.fontSize = '1.2em';
            countryDiv.style.marginBottom = '10px';
            clock.appendChild(countryDiv);
            var timeDiv = document.createElement('div');
            timeDiv.style.fontSize = '2em';
            timeDiv.style.fontWeight = 'bold';
            clock.appendChild(timeDiv);
            container.appendChild(clock);
            clock.timeDiv = timeDiv;
            clock.timeZone = countries[country];
            clock.bankHours = bankHours[country];
        }

        function isBankOpen(now, hours) {
            var day = now.weekday;
            var hour = now.hour;

            if (day >= 1 && day <= 5) {
                return hour >= hours.open && hour < hours.close;
            } else if (day === 6) {
                return hour >= hours.saturdayOpen && hour < hours.saturdayClose;
            } else {
                return false;
            }
        }

        function updateTime() {
            for (var i = 0; i < container.children.length; i++) {
                var clock = container.children[i];
                if (clock.timeDiv) {
                    var now = DateTime.now().setZone(clock.timeZone);
                    clock.timeDiv.textContent = now.toLocaleString(DateTime.TIME_WITH_SECONDS);
                    if (isBankOpen(now, clock.bankHours)) {
                        clock.timeDiv.style.color = 'green';
                    } else {
                        clock.timeDiv.style.color = 'red';
                    }
                }
            }
        }

        setInterval(updateTime, 1000);
        updateTime();

        if (container.id === 'time-widget-container') {
            container.onmousedown = function(event) {
                var shiftX = event.clientX - container.getBoundingClientRect().left;
                var shiftY = event.clientY - container.getBoundingClientRect().top;

                function moveAt(pageX, pageY) {
                    container.style.left = pageX - shiftX + 'px';
                    container.style.top = pageY - shiftY + 'px';
                }

                function onMouseMove(event) {
                    moveAt(event.pageX, event.pageY);
                }

                document.addEventListener('mousemove', onMouseMove);

                container.onmouseup = function() {
                    document.removeEventListener('mousemove', onMouseMove);
                    container.onmouseup = null;
                };
            };

            container.ondragstart = function() {
                return false;
            };
        }
    }

    createButton();
    checkForUpdates();
};