Torn Chat Timestamp

Displays the time a chat message was sent right by it.

Versión del día 10/3/2021. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name         Torn Chat Timestamp
// @namespace    https://www.torn.com
// @version      1.1
// @description  Displays the time a chat message was sent right by it.
// @author       PhilMe [2590086]
// @match        *.torn.com/*
// @grant        none
// ==/UserScript==


(function() {
    'use strict';
    var timestampColor = {red: 169, green: 169, blue: 169};

    function parseDate (datestring) {
        var re = new RegExp('^([0-2][0-9]):([0-5][0-9]):([0-5][0-9]) - ([0-3][0-9])\/([0-1][0-9])\/([0-9]{2})', 'g');
        var data = re.exec(datestring);
        return `${data[1]}:${data[2]}:${data[3]}`;
    }

    function formatDate(date) {
        var hour = date.getHours().toString().padStart(2, "0");
        var minute = date.getMinutes().toString().padStart(2, "0");
        var second = date.getSeconds().toString().padStart(2, "0");
        return `${hour}:${minute}:${second}`;
    }

    function addTimestamp (element) {
        if (element.getAttribute("class").trim() !== "message_oP8oM") {return;}  // skip non-messages

        var spanElement = element.querySelector('span');
        var timeString = spanElement.getAttribute("title");

        var timeSpan = document.createElement('span');
        timeSpan.innerHTML = parseDate(timeString) + " ";
        timeSpan.style.color = `rgb(${timestampColor.red}, ${timestampColor.green}, ${timestampColor.blue})`;

        var aElement = element.querySelector('a');
        element.insertBefore(timeSpan, aElement);
    }

    function addChatMessageObserver(element) {
        var messageDiv = element.querySelector('.overview_1MoPG');
        if (messageDiv !== null) {
            messageDiv.querySelectorAll(".message_oP8oM").forEach(msg => {addTimestamp(msg);});
            chatMessageObserver.observe(messageDiv, {childList: true});
        }
    }

    // Watches for if any new chats are created
    var chatObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            for (var i = 0; i < mutation.addedNodes.length; i++) {
                chatOpenedObserver.observe(mutation.addedNodes[i], {childList: true});
            }
        })
    });

    // When a chat is opened, timestamps are added
    var chatOpenedObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            for (var i = 0; i < mutation.addedNodes.length; i++) {
                let element = mutation.addedNodes[i];
                if (element.getAttribute("class") !== "chat-box-content_2C5UJ ") {continue;}
                addChatMessageObserver(element);
            }
        })
    });

    // When a new message is sent, add timestamp
    var chatMessageObserver = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            for (var i = 0; i < mutation.addedNodes.length; i++) {
                addTimestamp(mutation.addedNodes[i]);
            }
        })
    });

    var chatRoot = document.querySelector('#chatRoot').firstElementChild;

    Array.from(chatRoot.getElementsByClassName('chat-box_Wjbn9')).forEach(element => {
        addChatMessageObserver(element);
        chatOpenedObserver.observe(element, {childList: true});
    });
    chatObserver.observe(chatRoot, {childList: true});  // watches for new chats

})();