BotB: Show full dates when hovering over countdowns

Show full dates when hovering over countdowns

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         BotB: Show full dates when hovering over countdowns
// @namespace    https://battleofthebits.com/barracks/Profile/uart/
// @version      2024-08-30
// @description  Show full dates when hovering over countdowns
// @author       uart @ botb
// @license      CC0
// @match        *://battleofthebits.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=battleofthebits.com
// @grant        none
// @run-at       document-body
// ==/UserScript==

(function() {
    'use strict';

    /* LOCALE: override locale to use for date formatting. Leave empty for system locale. */
    const LOCALE = "pl-PL";

    function handleCountdownDates(root) {
        const now = new Date();

        const countdowns = root.getElementsByClassName("countdown");
        var countdownHTML, countdownSeconds, countdownDate;

        for (var i = 0; i < countdowns.length; i++) {
            countdownHTML = countdowns[i];
            countdownSeconds = countdownHTML.getAttribute("data-countdown");
            countdownDate = new Date(now.getTime() + (countdownSeconds * 1000));
            if (LOCALE) {
                countdownHTML.setAttribute("title", countdownDate.toLocaleString(LOCALE));
            } else {
                countdownHTML.setAttribute("title", countdownDate.toLocaleString());
            }
        }
    }

    handleCountdownDates(document);

    /* Set up a MutationObserver on ajaxContent in case it gets updated with new countdowns
     * (see e.g. user buttons on homepage). */
    const observer = new MutationObserver(function(mutationList, observer) {
        var done = new Array();
        for (const mutation of mutationList) {
            if (!done.includes(mutation.target)) {
                handleCountdownDates(mutation.target);
                done.push(mutation.target);
            }
        };
    });

    const ajaxContents = document.getElementsByClassName("ajaxContent");

    for (var i = 0; i < ajaxContents.length; i++) {
        observer.observe(ajaxContents[i], { childList: true, subtree: true });
    }
})();