Clog (Colourful Gamelog)

adds styles to certain game events

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         Clog (Colourful Gamelog)
// @namespace    blaseball
// @version      1.5.2
// @description  adds styles to certain game events
// @author       Myno (with help from Clair and Quincognito)
// @match        https://blaseball.com/*
// @match        https://www.blaseball.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=blaseball.com
// ==/UserScript==

(function() {
    'use strict';
    const NAMESPACE = "Colourful Gamelog";
//text used to track clog events
    const events = {
        "incin":[" incinerates"],
        "alternate":["'s Alternate!"],
        "swear":[" swear"," Swear"], //ty clair!!
        "curse":[" curse"," Can't Lose"], //ty clair!!
        "favor":[" rules in", " favor"], //ty clair!!
        "rogue":["Rogue Umpire"],
        "mage":["Mage Umpire"],
        "knight":["Knight Umpire"],
        "bard":["Bard Umpire"],
        "crash":[" crashes into"],

        "end_of_top":["End of the top "],
        "end_of_bottom":["End of the bottom "],
        "out":["gets the out", "forced out", "fly out", "Fly out", " groundout", " Groundout", " out.", "makes the catch", "is right there to make the catch.", //ty quincognito!!
              " catch."," catch!"],
        "score":[" scores!"," hits a Home Run!"],
        "ball":["Ball,","Ball."," a walk."," a ball outside"],
        "walk":[" a walk."],
        "hustle":[" hustles "],
        "strike":["Strike,","Strike."," a strike."," strikes ","Foul ball.","Foul tip.", "Foul.", "curls out of play."],
        "new_batter":[" steps up to bat."],
        "single":[" a Single!"," a single!"],
        "double":[" a Double!"," a double!,  hustles all the way to second!"],
        "triple":[" a Triple!"," a triple!"," hustles all the way to third!"],
        "home_run":[" a Home Run!"],
        "drama":["..."]
    }
    //if this text appears, DO NOT treat this as an event
    // eg "can't make the catch..." messages will not be clog_out events even though they contain "catch."
    const ignore_events={
        "out":["catch..."]
    }
//default styling applied to .clog_[event] elements
//these styles can be overwritten by editing them here (not recommended) or creating a css userstyle to change .clog_score, .clog_incin etc etc
    const eventcss = {
        "score":"color: #ff9900; font-weight: 600;",
        "incin":"color: #6666ff; font-weight: 600;",
        "alternate":"color: #ff3333; font-weight: 600;",
        "swear":"color: #ccccee; font-weight: 600;", //ty clair!!
        "curse":"color: #ff9966; font-weight: 600;", //ty clair!!
        "drama":"font-style: italic;"
    }


    var css = "";
    for(let shortclass in eventcss){
        css+=`.clog_`+shortclass+` {`+eventcss[shortclass]+`} `
    }
    var style = document.createElement("style");
    style.type = "text/css";
    style.appendChild(document.createTextNode(css));
    document.head.appendChild(style);

    var nodeprocess = function(node){
        let eventhappen = {};
        if(node.classList && node.classList.contains("game-widget__log")){
            for(let listid in events){
                eventhappen[listid] = false;
                for(let phrase of events[listid]){
                    if(node.innerText.includes(phrase)){
                        node.classList.add("clog_"+listid);
                        eventhappen[listid] = listid;
                    }
                }
                if(!!ignore_events[listid]){
                    for(let phrase of ignore_events[listid]){
                        if(node.innerText.includes(phrase)){
                            if(node.classList.contains("clog_"+listid)){
                                node.classList.remove("clog_"+listid);
                            }
                            eventhappen[listid] = false;
                            break;
                        }
                    }
                }
                if(eventhappen[listid]!=listid && node.classList.contains("clog_"+listid)){
                    node.classList.remove("clog_"+listid)
                }
            }
        }
        console.log(eventhappen)
    };

    const callback = function(mutationsList, observer) {
        var logs = document.querySelectorAll(".game-widget__log");
        for(let log of logs){
            nodeprocess(log)
        }
    };

    if (document.hasOwnProperty("_BLASEBALL_USERSCRIPT_REGISTER")) {
        document._BLASEBALL_USERSCRIPT_REGISTER(NAMESPACE, callback, (mutations) => (document.querySelectorAll(".game-widget")));
    } else {
        const main = document.getElementsByTagName("body")[0];
        const config = { childList: true, subtree: true };
        const mutationCallback = function(mutationsList, observer) {
            callback(mutationsList);
            observer.disconnect();
            observer.observe(main, config);
        };

        const observer = new MutationObserver(mutationCallback);
        observer.observe(main, config);
    }
})();