Twitter時計

Twitterに 時計を 表示します。

// ==UserScript==
// @name            Twitter時計
// @name:en         Twitter Clock
// @name:ain        Twitter トケ
// @namespace       http://lit.link/toracatman
// @version         2025-04-14
// @description     Twitterに 時計を 表示します。
// @description:en  Display a Clock on Twitter.
// @description:ain Twitter タ トケ アヌ。
// @author          トラネコマン
// @match           https://x.com/*
// @icon            data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant           none
// @license         MIT
// ==/UserScript==

//言語,ja: 日本語,en: 英語,ain: アイヌ語
//Language, ja: Japanese, en: English, ain: Ainu
//イタㇰ,ja: シサㇺ イタㇰ,en: インキリㇱクㇽ イタㇰ,ain: アヌ イタㇰ
var language = "ja";

/*
曜日の 色
0: 白のみ
1: 日: ピンク,土: 青,他: 白
2: 日: ピンク,月: 紫,火: オレンジ,水: 灰色,木: 緑,金: 黄色,土: 青

Color of Day
0: Only White
1: Sunday: Pink, Saturday: Blue, Other: White
2: Sunday: Pink, Monday: Purple, Tuesday: Orange, Wednesday: Gray, Thursday: Green, Friday: Yellow, Saturday: Blue

ト イロ
0: レタㇻ パテㇰ
1: トカト: ルフレ,トト: シニン,モㇱマ: レタㇻ
2: トカト: ルフレ,クンネト: ペレキナペウㇱ,アペト: ホマネ,ワㇰカト: ルクンネ,チクニト: フキナネ,カネト: シケㇾペペウㇱ,トト: シニン
*/
var day_color = 2;

//true: 12, false: 24
var ap = false;

(() => {
    var mn = {
        ja: ["雅月", "菲月", "瑪月", "艾月", "緬月", "淳月", "茱月", "奥月", "摂月", "憶月", "衲月", "迪月", "繧月"],
        en: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "Irvember"],
        ain: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"]
    };
    var dn = {
        ja: ["日", "月", "火", "水", "木", "金", "土"],
        en: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
        ain: ["トカト", "クンネト", "アペト", "ワㇰカト", "チクニト", "カネト", "トト"]
    };
    var format = {
        ja: "YYYY年 MM DD日<br>WW曜日<br>hh:mm:ss AP",
        en: "hh:mm:ss AP<br>WW<br>MM DD, YYYY",
        ain: "YYYY パ MM  DD ト<br>WW<br>hh:mm:ss AP"
    };
    var dc = ["249, 24, 128", "120, 86, 255", "255, 122, 0", "139, 152, 165", "0, 186, 124", "255, 212, 0", "29, 155, 240"];
    var d;

    var a;
    var b;
    var u = () => {
        if (typeof a === "undefined") {
            var t = document.querySelector('aside:has(a[href^="/i/connect_people"])');
            if (t != null) {
                t = t.parentNode.parentNode;
                a = t.cloneNode(true);
                a.querySelector("div").style.minHeight = "auto";
                a.querySelector("aside").setAttribute("aria-label", "時計");
                b = a.querySelector("aside div");
                b.style.display = "block";
                a.querySelector("ul").remove();
                a.querySelector("a").remove();
            }
        }
        if (typeof a !== "undefined") {
            var t = document.querySelector('div[data-testid="sidebarColumn"] div:has(> nav)');
            if (t != null) {
                d = new Date();

                var day = d.getDay();
                var day_str = day_str = dn[language][day];
                if ((day_color == 1 && (day == 0 || day == 6)) || day_color == 2) {
                    day_str = `<span style="color: rgb(${dc[day]});">${day_str}</span>`;
                }

                var str = format[language];
                str = str.replace("YYYY", d.getFullYear());
                str = str.replace("MM", mn[language][d.getMonth()]);
                str = str.replace("DD", d.getDate());
                str = str.replace("WW", day_str);
                var h = d.getHours();
                str = str.replace("hh", ap ? h % 12 : h);
                str = str.replace("mm", d.getMinutes().toString().padStart(2, "0"));
                str = str.replace("ss", d.getSeconds().toString().padStart(2, "0"));
                str = str.replace("AP", ap ? (h < 12 ? "AM" : "PM") : "");

                b.innerHTML = str.trim();

                var p = t.parentNode.firstElementChild;
                if (p.querySelector("form") != null) p = p.nextElementSibling.nextElementSibling;
                p.before(a);
            }
        }
        d = new Date();
        setTimeout(u, 1000 - d.getMilliseconds());
    }
    d = new Date();
    setTimeout(u, 1000 - d.getMilliseconds());
})();