Greasy Fork

来自缓存

沙琪玛定制ATERNOS

""

// ==UserScript==
// @name         沙琪玛定制ATERNOS
// @namespace    http://tampermonkey.net/
// @version      1.36
// @description  ""
// @author       沙琪玛
// @match        https://aternos.org/sqm/
// @icon         https://www.google.com/s2/favicons?sz=64&domain=aternos.org
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

(function() {
    //前置
    document.querySelector("title").textContent = 'ATERNOS - SQM定制控制台'
    document.querySelector("div.title-label").textContent = "SQM定制控制台"
    document.querySelector("body > div > div > div.body").style.height = (document.body.clientHeight - document.querySelector("div.title").clientHeight) + "px"
    document.querySelector("body > div > div > div.body").style.display = "flex"
    document.querySelector("body > div > div > div.body").style.flexDirection = "column"
    document.querySelector("body > div > div > div.body").style.justifyContent = "space-between"
    document.querySelector("body > div").style.alignItems = 'stretch'
    document.querySelector(".console").style.background = "#272727"
    document.querySelector("body").style.backgroundColor = "#272727"

    //window["AJAX_TOKEN"]=window['document']&&window["Map"][("p" + "r" + "ot" + "ot" + "ype")]&&window[["ut","meo","tTi","se"].reverse().join('')]?["owbYTXC","NIr","771K1kzP5","U"].map(s => s.split('').reverse().join('')).join(''):["ApzVaB","nbjT","bmlybY","u6MG"].join('');
    //密码加密JS
    $.ajax({
        type: "get",
        url: "/panel/js/md5/md5.min.js"
    });
    //发包
    function randomString(length) {
        return Array(length + 1).join((Math.random().toString(36) + '00000000000000000').slice(2, 18)).slice(0, length);
    }
    function generateAjaxToken(url) {
        var key = randomString(16);
        var value = randomString(16);

        document.cookie = "ATERNOS_SEC_" + key + "=" + value + ";path=" + url;

        return key + ":" + value;
    }
    function buildURL(url, data) {
        data.SEC = generateAjaxToken(url);
        data.TOKEN = AJAX_TOKEN;
        return url + "?" + $.param(data);
    }
    function aget(url, data, callback) {
        if (callback === undefined) {
            callback = data;
            data = {};
        }

        $.ajax({
            type: "get",
            url: buildURL(url, {}),
            success: callback,
            error: function(errorback) {ajaxError("get", url, errorback)}
        });
    }
    function apost(url, data, callback) {
        $.ajax({
            type: "post",
            data: data,
            url: buildURL(url, {}),
            success: callback,
            error: function(errorback) {ajaxError("post", url, errorback)}
        });
    }
    function ajaxError(type, url, errorback) {
        if (url == "/panel/ajax/status.php") {
            document.querySelector("div.title-label").textContent = "SQM定制控制台 — 未绑定"
        }
        if (SQMDEBUG) {
            if (url != "/panel/ajax/status.php") {
                out("AJAX错误 - 类型:" + type + ", URL:" + url)
            }
        }
    }

    var SQMDEBUG = false

    //自动开服状态
    var autoStartBool = GM_getValue("autoStartBoolGM")
    //自动开服循环
    var autoStartInterval = null

    function autoStartUpdate() {
        document.querySelector("body > div > div > div.body").style.height = (document.body.clientHeight - document.querySelector("div.title").clientHeight) + "px"
        if (autoStartBool) {
            //获取伺服器信息
            aget('/panel/ajax/status.php', function (data) {
                var serverStatus = JSON.parse(data)

                //如果为离线状态就自动启动(headstart态)
                if (serverStatus.class == 'offline') {
                    apost('/panel/ajax/start.php', {'headstart': 1, 'access-credits': 1})
                }

                //无人只剩十秒倒计时时自动重启伺服器(重启比关闭后开启的开机速度快)
                if (serverStatus.class == 'online' && serverStatus.countdown != null && serverStatus.countdown < 10) {
                    apost('/panel/ajax/restart.php')
                }

                if (SQMDEBUG) {
                    out("      状态:" + serverStatus.class + " 倒计时:" + serverStatus.countdown)
                    out("      离线:" + (serverStatus.class == 'offline') + " 十秒倒计时:" + (serverStatus.class == 'online' && serverStatus.countdown != null && serverStatus.countdown <= 10))
                    if (serverStatus.players > 0) out("      玩家人数:" + serverStatus.players + " 玩家列表" + serverStatus.playerlist)
                    out("")
                }
            })
        }
        aget('/panel/ajax/status.php', function (data) {var serverStatus = JSON.parse(data); document.querySelector("div.title-label").textContent = "SQM定制控制台 — " + serverStatus.label + ((serverStatus.class == 'online')? "(" + ((serverStatus.players > 0)? serverStatus.players + " / " + serverStatus.slots: serverStatus.countdown + "秒") + ")": "")})

    }

    //自初始化动开服按钮
    document.querySelector("div.title-buttons > a").remove()
    let autoStartBtn = document.createElement('a');
    autoStartBtn.id = "autoStart"
    autoStartBtn.className = 'close';
    autoStartBtn.style.backgroundColor = (autoStartBool)? "#1FD78D": ""
    document.querySelector("div.title-buttons").appendChild(autoStartBtn)
    $("#autoStart").append('<i class="fas fa-sync-alt" id="autoStartBtnIcon"></i>')
    document.querySelector("#autoStartBtnIcon").style.color = (autoStartBool)? "#FFFFFF": ""

    //自动开服按钮点击事件
    autoStartBtn.onclick = function() {
        //自动开服状态切换
        GM_setValue("autoStartBoolGM", !GM_getValue("autoStartBoolGM"))
        autoStartBool = GM_getValue("autoStartBoolGM")

        //自动开服按钮Style切换
        autoStartBtn.style.backgroundColor = (autoStartBool)? "#1FD78D": ""
        document.querySelector("#autoStartBtnIcon").style.color = (autoStartBool)? "#FFFFFF": ""

        if (SQMDEBUG) out("自动启动:" + autoStartBool + "\n ")
    }

    //劫持输入栏
    var sqmInput = document.querySelector("#in")
    sqmInput.id = "sqmInput"
    /*
    append = function(raw, delay) {
        if(delay === undefined) {
            delay = 0;
        }
        setTimeout(function(){
            $('#out').append(raw + "<br />");
        }, delay);
    }
*/

    //输入栏回车事件
    sqmInput.onkeyup = function(key){
        if(key.keyCode == 13) {
            var commando = sqmInput.value
            append('> <span class="yeah">'+htmlentities(commando)+'</span>');
            switch (commando.split(" ")[0]) {
                case "start":
                    aget('/panel/ajax/start.php', {'headstart': 1, 'access-credits': 1}, function(data) {out("正在启动")})
                break
                case "stop":
                    aget('/panel/ajax/stop.php', function(data) {out("正在停止")})
                break
                case "restart":
                    aget('/panel/ajax/stop.php', function(data) {out("正在重启")})
                break
                case "status":
                    aget('/panel/ajax/status.php', function(data) {out(JSON.stringify(JSON.parse(data)))})
                break
                case "player":
                    aget('/panel/ajax/status.php', function (data) {
                        var serverStatus = JSON.parse(data)
                        if (serverStatus.players > 0) {out("玩家人数:" + serverStatus.players + " 玩家列表:" + serverStatus.playerlist)} else {out("无玩家在线")}})
                break
                case "acc":
                    var accData = commando.split(" ")
                    if (accData[1] == "set") {
                        if (SQMDEBUG) out("账号为:" + accData[2] + " 密码为:" + accData[3])
                        apost('/panel/ajax/account/login.php', {user: accData[2], password: md5(String(accData[3]))}, function(data){
                            data = JSON.parse(data)
                            if (data.success) {
                                out("登入成功")
                            } else {
                                out("错误:" + data.error)
                            }
                        })
                    } else if (accData[1] == "unset") {
                        apost("/panel/ajax/account/logout.php")
                    }
                break
                case "server":
                    var svData = commando.split(" ")
                    if (svData[1] == "set") {
                        apost('/panel/ajax/friends/access.php', {id: svData[2]}, function (data) {
                            data = JSON.parse(data);
                            if (data.success) {
                                out("设置成功:" + svData[2])
                            } else {
                                out("无效的ID")
                            }
                        })
                    } else if (svData[1] == "unset") {
                        apost('/servers/')
                    }
                break
                case "debug":
                    var dbData = commando.split(" ")
                    var dbCheak = md5(dbData[2])
                    if (dbCheak == 'c51fc0f4cd342e1419e05e53e72d0018') {
                        SQMDEBUG = (dbData[1] == "true" || dbData[1] == "1")
                        out("DEBUG:" + SQMDEBUG)
                    } else {
                        out("凭证错误")
                    }

                break
            }
            sqmInput.value = ""
        }
    }

    window.setInterval(autoStartUpdate, 1000)
})();