Lichess Lounger

Include chat in Lichess TV

当前为 2016-07-31 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Lichess Lounger
// @namespace    https://lichess.org/@/Hedgehogs4Me
// @version      0.2
// @description  Include chat in Lichess TV
// @author       Hedgehogs4Me
// @include      https://*lichess.org/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function LoungeBug(message, severity) {
        //Severity 2 is a real bug, severity 1 is a fatal user thing, severity 0 is a thing I put in just in case and would be non-fatal I guess.
        var userWarning = document.createElement("P");
        userWarning.appendChild(document.createTextNode("LOUNGER ERROR: " + message));
        userWarning.style.color=severity===2?"red":severity===1?"orange":severity===0?"teal":"purple";
        //document.body.appendChild(userWarning);
        document.body.insertBefore(userWarning, document.getElementsByClassName("content")[0]);
    }

    //Delayed severity 1 errors. I never said any of this made any organizational sense.
    function severity1() {
                if(boardArray[0].style.height!==""){
                    failed = true;
                    LoungeBug("Lounger isn't working because your board is not the minimum size.", 1);
                }

                if(failed===true){
                    LoungeBug("Just thought, you know, I'd let you know. Sorry 'bout that.", 1);
                    document.getElementsByClassName("lichess_ground")[0].removeChild(document.getElementById("chat_page")); //It's not a problem anyway but just in case remove the thing that doesn't work.
                    return;
                }
            }

    var failed = false;
    var boardArray = document.getElementsByClassName("cg-board-wrap");

    var h = 512; //I've left the former definitions in for archival/curiousity purposes, but the reason this really must be 512 is that there isn't any point in it being anything else.
    // You see, not only does resizing happen *after* the page has loaded, but also, if any board resizing has been done, the board suddenly takes precedence over the chat in small
    // windows! This could *maybe* be worked around by making it a large iframe and covering it up, but then I would have to make the entire thing bigger, and figure out how everything
    // fits together, and then... well, look, I'm not doing it. I made this because I'm so lazy I want to sit back and watch Lichess TV all day and not even have to switch pages to
    // comment, so clearly I'm not going to put in that work. If someone else wants to do it, though, feel free, and I'd love to see your results!

    if(window.self === window.top) {
        if(document.URL.search(/https:\/\/.+lichess\.org\/tv(\/(?!stream)|\/*$)/) != -1) {

            //Severity 2
            if(boardArray.length===0){
                failed = true;
                LoungeBug("Hedgehogs can't even get the board wrapper name right. It's like chemistry class all over again.", 2);
            }
            var sidebarArray = document.getElementsByClassName("lichess_ground");
            if(boardArray.length===0){
                failed = true;
                LoungeBug("Something something list wrapper name. Let's just call it ERROR 683A to sound good.", 2);
            }
            var analysisArray = document.getElementsByClassName("analysis");
            if(analysisArray.length===0){
                failed = true;
                LoungeBug("I don't know why the analysis button class name would be changed, but apparently it was.", 2);
            }
            if(document.getElementById("friend_box")===null){
                failed = true;
                LoungeBug("Can't find the friend box. Literally me IRL.", 2);
            }

            if(failed===true){
                LoungeBug("In other words, you should turn off this userscript.", 2);
                return;
            }

            //var h = (boardArray[0].style.height!=="")?parseInt(boardArray[0].style.height):512;
            sidebarArray[0].style.height=(h+98)+"px"; //98 px is how big the crosstable is and I want to use as much space as I can
            var chatFrame = document.createElement("IFRAME");
            chatFrame.style.overflow="hidden";
            chatFrame.style.border="none";
            // chatFrame.style.height="100%";
            // chatFrame.style.height=(h+98-370)+"px"; //god damn it all, none of this is working
            chatFrame.style.setProperty("height", (h+98-370)+"px", "important");
            chatFrame.scrolling="no";
            chatFrame.id="chat_page";
            chatFrame.src=analysisArray[0].href.slice(0,31)+"#chat";
            sidebarArray[0].appendChild(chatFrame);
            //setTimeout(function(){ sidebarArray[0].appendChild(chatFrame); }, 1000);
            //setTimeout(function(){ chatFrame.scrollLeft = 0; }, 2000); // Well, I tried. Didn't think it'd work.
            setTimeout(function(){ window.scrollTo(0,24);severity1(); }, 1000); //I am literally so lazy I scroll to make the full chat bit visible on my small screen
        }
    } else {
        if(window.top.location.href.search(/https:\/\/.+lichess\.org\/tv(\/(?!stream)|\/*$)/) != -1) {
            //var h = (boardArray[0].style.height!=="")?parseInt(boardArray[0].style.height):512;
            document.getElementById("friend_box").style.display="none";
            var chat = document.getElementById("chat");
            chat.style.setProperty("width", "242px", "important");
            chat.style.setProperty("height", (h+98-370)+"px", "important"); //board height, plus under-thingy height, minus height of the stuff above the chat. Trust me on this one.
            boardArray[0].style.visibility="hidden"; //This bit scares me.
            //setTimeout(function(){ chat.scrollIntoView(); }, 1000);
        }
    }
})();