wsmud_funny

武神传说脚本,内置了许多小功能。

目前為 2019-04-12 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        wsmud_funny
// @namespace   suqing
// @version     0.1.13
// @author      sq
// @match       http://*.wsmud.com/*
// @homepage    https://greasyfork.org/zh-CN/scripts/380709
// @description 武神传说脚本,内置了许多小功能。
// @run-at      document-start
// @require     http://code.jquery.com/jquery-3.3.1.min.js
// @require     https://cdn.bootcss.com/jquery.nicescroll/3.7.6/jquery.nicescroll.min.js
// @grant       unsafeWindow
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_deleteValue
// @grant       GM_getValue
// @grant       GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';
    let funny = {
        scriptName: GM_info.script.name,
        scriptVersion: GM_info.script.version,
        scriptAuthor: GM_info.script.author,
        webSocket: undefined,
        onmessage_fn: undefined,
        role: {
            jy: 0,
            qn: 0,
        },
        skills: {},
        sleep: function(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        },
        scroll: function(className) {
            let a = $(`.${className}`)[0].scrollTop,
                b = $(`.${className}`)[0].scrollHeight,
                h = Math.ceil($(`.${className}`).height()); // 向上取整
            // console.log(`scroll => scrollTop=${a} scrollHeight=${b} height=${h}`);
            if (a < b - h) {
                $(`.${className}`)[0].scrollTop = a + 1;
                setTimeout(`funny.scroll("${className}")`, 1000/120);
            }
        },
        // 向服务器发送消息
        sendmessage: function(message) {
            if (typeof message === "string") {     // 1. 字符串
                send(message);
            } else if (message instanceof Array) { // 2. 数组
                action(message);
                async function action(message) {
                    for (const m of message) {
                        await funny.sleep(1000);
                        send(m);
                    }
                }
            }
            function send(message) { // 发送
                if ($("#sendmessage").attr("cmd")) {
                    $("#sendmessage").attr("cmd", message);
                } else {
                    $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
                }
                $("#sendmessage").click();
            }
        },


        // 截获到的接收的消息
        onmessage: function(message) {
            // 0. 分析处理
            let data = message.data || "error";
            if ((data.includes("{") && data.includes("}")) || (data.includes("[") && data.includes("]"))) {
                data = new Function("return " + data + ";")();
            }
            // 1. 重新连线
            if (/重新连线。|欢迎登陆<HIW>武神传说<\/HIW>/.test(data)) {
                $(".content-message pre").append(`${data}\n`);
                getScore();
                $(".content-message pre").append(`${funny.scriptName} ${funny.scriptVersion}\n`);
                async function getScore() { // 模拟点击
                    await funny.sleep(100);
                    funny.sendmessage("score");        // 属性 1
                    await funny.sleep(100);
                    funny.sendmessage("score2");       // 属性 2
                    await funny.sleep(100);
                    $("[command=skills]").click();     // 点击技能
                    await funny.sleep(100);
                    $("[command=showcombat]").click(); // 点击动作
                    $("[command=showtool]").click();   // 点击菜单
                    await funny.sleep(1000);
                    $("[command=tasks]").click();      // 任务
                    $(".dialog-close").click();        // 关闭窗口
                    // await funny.sleep(3000);
                    if (unsafeWindow.WG) {
                        $("[command=showcombat]").click();
                        $("[command=showtool]").click();
                    }
                    // command=""
                };
                return;
            }
            // 1.2 自动吃养精丹
            if (data.type === "addAction" && data.name === "养精丹") {
                funny.sendmessage(`use ${data.id}`);
            } else if (data.type === "actions") {
                if (data.actions && data.actions instanceof Array) {
                    // funny.sendmessage("stopstate");
                    // data.actions.forEach(item => {
                    //     if (item.name === "养精丹") {
                    //         for (let i = 1; i <= 10; i ++) setTimeout(function() {
                    //             funny.sendmessage(`${item.cmd}`);
                    //         }, i * 500);
                    //     }
                    // });
                    // setTimeout(() => funny.sendmessage("dazuo"), 5000);
                }
            }
            // 1.3 自动查看任务
            if (data.type === "dialog" && data.dialog === "tasks") {
                if (data.items) {
                    $(".content-message pre").append(`- - - - -\n`);
                    data.items.forEach(item => {
                        let array = ["0", "进行中", "可领取", "已完成"];
                        if (item.state === 2) {
                            setTimeout(() => {
                                funny.sendmessage(`taskover ${item.id}`);
                            }, 1000);
                        }
                        $(".content-message pre").append(`${item.title} => ${array[item.state]}\n`);
                    });
                    $(".content-message pre").append(`- - - - -\n`);
                }
            }



            // 2. 经验潜能
            if (/<hig>你获得了.*点经验,.*点潜能.*/.test(data)) {
                // 你获得了1360点经验,1360点潜能,六两白银八十个铜板。
                let array = data.split(/你获得了|点经验,|点潜能/);
                funny.role.jy += parseInt(array[1]);
                funny.role.qn += parseInt(array[2]);
                $(".remove_jyqn").remove();
                $(".content-message pre").append(`${data}\n`);
                $(".content-message pre").append(`<span class="remove_jyqn">共计获得了${funny.role.jy}点经验,${funny.role.qn}点潜能。\n</span>`);
                funny.scroll("content-message");
                return;
            }

            // if (/恭喜你战胜了武道塔守护者,你现在可以进入下一层。/.test(data)) {
            //     funny.sendmessage("go up");
            //     $(".content-message pre").append(`${data}\n`);
            //     return;
            // }
            // 3. 物品收获
            if (/你从.*的尸体里拿出来.*|你获得了|<hig>恭喜你.*/.test(data)) {
                funny.onmessage_fn.apply(this, arguments);
                if (/你获得了.*<wht>|银子/.test(data)) {

                } else {
                    $(".pickup").append(`${data}<br>`);
                    funny.scroll("pickup");
                }
                return;
            }

            // 4. 聊天消息
            if (data.type === "msg") {
                // 补充 => 发送文字表情的时候是没有 name 属性的
                data.name = (data.name === "" || data.name === undefined) ? `` : `${data.name}:`;

                if (data.ch === "chat") {
                    let levels = ["<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hic>闲聊</hic>", "<hiy>宗师</hiy>", "<hiz>武圣</hiz>", "<hio>武帝</hio>", "<hir>武神</hir>"];
                    $(".chat").append(
                        $(`<span cmd="look3 ${data.uid}"><hic>【${levels[data.lv]}】${data.name}${data.content}</hic><br></span>`)
                        .click(function() { funny.sendmessage(`${$(this).attr("cmd")}`); })
                    );
                } else if (data.ch === "fam") {
                    $(".fam").append(
                        $(`<span cmd="look3 ${data.uid}"><hiy>【${data.fam}】${data.name}${data.content}</hiy><br></span>`)
                        .click(function() { funny.sendmessage(`${$(this).attr("cmd")}`); })
                    );
                } else if (data.ch === "pty") {
                    $(".pty").append(
                        $(`<span cmd="look3 ${data.uid}"><hiz>【帮派】${data.name}${data.content}</hiz><br></span>`)
                        .click(function() { funny.sendmessage(`${$(this).attr("cmd")}`); })
                    );
                } else if (data.ch === "tm") {
                    $(".tm").append(`<hig>【队伍】${data.name}${data.content}</hig><br>`);
                } else if (data.ch === "es") {
                    $(".es").append(`<hio>【${data.server}】${data.name}${data.content}</hio><br>`);
                } else if (data.ch === "rumor") {
                    $(".rumor").append(`<him>【谣言】${data.content}</him><br>`);
                    // if (/听说有人得到了.*/.test(data.content)) {
                    //     let array = data.content.split(/听说有人得到了/);
                    //     funny.sendmessage(`chat 恭贺大佬喜提「${array[1]}」!`);
                    // } else if (/听说武帝.*闭关修炼似有所悟,你随之受益获得了.*/.test(data.content)) {
                    //     // 听说武帝xxxx闭关修炼似有所悟,你随之受益获得了xxxx经验,xxxx潜能
                    //     let array = data.content.split(/听说武帝|闭关修炼/);
                    //     funny.sendmessage(`chat 感谢武帝「${array[1]}」的出关奖励!`);
                    // }
                } else if (data.ch === "sys") {
                    $(".sys").append(`<hir>【系统】${data.content}</hir><br>`);
                }
                funny.scroll(data.ch);
                funny.onmessage_fn.apply(this, arguments);
                $(".channel").html("");
                return;
            }

            // 5. 战斗消息
            if (/<hir>看起来.*想杀死你!<\/hir>/.test(data)) {
                let array = data.split(/看起来|想杀死/);
                $(".content-message pre").append(`<hir>${array[1]} => 开始攻击你!<hir>\n`);
                return;
            } else if (/你对著.*喝道:「.*」/.test(data)) {
                // 你对著木头人喝道:「小王八蛋!今日不是你死就是我活!」
                let array = data.split(/你对著|喝道/);
                $(".content-message pre").append(`<hir>你 => 开始攻击${array[1]}!<hir>\n`);
                return;
            } else if (/.*造成<.*>.*<\/.*>点.*/.test(data)) {
                // 结果只是轻轻地碰到,比拍苍蝇稍微重了点,造成<wht>316</wht>点伤害!
                // (木头人<HIG>看起来充满活力,一点也不累。</HIG>)
                let array = data.split(/.*造成<wht>|.*造成<hir>|<\/wht>点|<\/hir>点|伤害|\(|<HIG>.*<\/HIG>|<HIY>.*<\/HIY>|<RED>.*<\/RED>|<HIR>.*<\/HIR>/);
                console.log(data);
                console.log(array);
                // $(".content-message pre").append(`${array.toString()}`);
                $(".content-message pre").append(`${array[4]}受到<wht>${array[1]}</wht>点<hir>${array[2]}</hir>伤害!\n`);
                // $(".content-message pre").append(`${array[4]}受到<wht>${array[2]}</wht>点伤害!\n`);
                return;
            }
            // 6. 房间描述
            if (data.type === "room") {
                funny.onmessage_fn.apply(this, arguments);
                $(".room_desc").css("overflow", "hidden");
                if (/<cmd cmd='.*'>.*<\/cmd>/.test(data.desc)) {
                    $(".room_desc").css("white-space", "normal");
                } else {
                    $(".room_desc").css("white-space", "nowrap");
                }
                return;
            }

            // 7. 屏蔽文本
            if (/.*你轻声吟道:.*/.test(data)) {
                return;
            }


            // 8. 自动击杀
            if (data.type === "itemadd") {
                if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
                    if (data.id) funny.sendmessage(`kill ${data.id}`);
                }
            }

            // 9. 自动分解
            if (data.type === "dialog" && data.dialog === "pack") {
                if (data.name) {
                    if (/☆|★|<hiy>|<hiz>|<hio>|<hir>/.test(data.name)) {
                        // 强化过的装备 黄色 紫色 橙色 红色 都不会分解
                    } else if (/大宋|蒙古|笠子|混天|曙光|鲲鹏|真武|君子|罗汉/.test(data.name)) {
                        funny.sendmessage(`fenjie ${data.id}`);
                    }
                }
            }
            // 10. 打坐时间
            if (/你的最大内力增加了.*点。/.test(data)) {
                let n = parseInt(data.toString().replace(/[^0-9]/ig, "")),
                  max = parseInt(funny.role.max_mp),
                limit = parseInt(funny.role.limit_mp);
                let time = (limit - max) / (n * 6); // X分钟 => X小时X分钟
                let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                $(".role_dazuo_time").html(timeString);
                funny.onmessage_fn.apply(this, arguments);
                $(".remove_dzsj").remove();
                $(".content-message pre").append(`<span class="remove_dzsj">- - - - -\n当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n- - - - -\n</span>`);
                return;
            }
            // 11. 状态屏蔽
            if (data.type === "state" && data.state) {
                funny.state = data.state;
                $(".state-bar").removeClass("hide");
                $(".state-bar").html(`<span class="title">${data.state}</span>`);
                $("[command=stopstate]")[0].style.display = "inline";
                if (data.state === "你正在练习技能") {
                    (async function fn() {
                        funny.sendmessage("score");
                        await funny.sleep(500);
                        funny.sendmessage("score2");
                        await funny.sleep(500);
                        $(".dialog-close").click();
                    })();
                }
                return;
            }
            // 12. 属性
            if (data.type === "dialog" && data.dialog === "score") {
                for (const key in data) funny.role[key] = data[key];
                if (/小昭|哔哩梨/.test(funny.role.name)) funny.role.name = "<hio>小皮鞭抽你丫</hio>";
                for (const key in funny.role) $(`.role_${key}`).html(funny.role[key]);
            }
            // 13. 技能
            if (data.type === "dialog" && data.dialog === "skills") {
                if (data.items) { // 所有技能数据
                    funny.skills = data.items;
                    funny.role["skill_limit"] = data.limit; // 等级上限
                } else if (data.id && data.level) { // 单个技能变动
                    for (const skill of funny.skills) {
                        if (skill.id === data.id) {
                            skill.level = data.level;
                            break;
                        }
                    }
                } else if (data.id && data.exp) {
                    let name = "", k = 0, level = 0;
                    let djsx = parseInt(funny.role.skill_limit); // 等级上限
                    let xxxl = parseInt(funny.role.study_per);   // 学习效率
                    let lxxl = parseInt(funny.role.lianxi_per);  // 练习效率
                    let xtwx = parseInt(funny.role.int);         // 先天悟性
                    let htwx = parseInt(funny.role.int_add);     // 后天悟性
                    if (funny.skills) {
                        for (const skill of funny.skills) {
                            if (skill.id === data.id) {
                                name = skill.name;
                                level = parseInt(skill.level);
                                if (/<wht>.*/.test(name)) k = 1; // 白
                                if (/<hig>.*/.test(name)) k = 2;
                                if (/<hic>.*/.test(name)) k = 3;
                                if (/<hiy>.*/.test(name)) k = 4;
                                if (/<hiz>.*/.test(name)) k = 5;
                                if (/<hio>.*/.test(name)) k = 6; // 橙
                                if (/<hir>.*/.test(name)) k = 7; // 红
                                break;
                            }
                        }
                    }
                    let qianneng = (djsx * djsx - level * level) * 2.5 * k;
                    if (funny.state === "你正在练习技能") {
                        let time = qianneng / (xtwx + htwx) / (1 + lxxl / 100 - xtwx / 100) / 12;
                        let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                        $(".lx").remove();
                        $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
                        $(".content-message pre").append(`<span class="lx">- - - - -\n角色悟性: ${xtwx}+${htwx}\n练习效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n- - - - -\n</span>`);
                        funny.scroll("content-message");
                    }
                }
            }

            funny.onmessage_fn.apply(this, arguments);
            console.log(data);
        },

    };

    // 暴露 funny
    unsafeWindow.funny = funny;
    // 检查 WebSocket
    if (WebSocket) {
        unsafeWindow.WebSocket = function(url) { funny.webSocket = new WebSocket(url); };
        unsafeWindow.WebSocket.prototype = {
            get url() { return funny.webSocket.url; },
            get protocol() { return funny.webSocket.protocol; },
            get readyState() { return funny.webSocket.readyState; },
            get bufferedAmount() { return funny.webSocket.bufferedAmount; },
            get extensions() { return funny.webSocket.extensions; },
            get binaryType() { return funny.webSocket.binaryType; },
            set binaryType(type) { funny.webSocket.binaryType = type; },
            get onerror() { return funny.webSocket.onerror; },
            set onerror(fn) { funny.webSocket.onerror = fn; },
            get onopen() { return funny.webSocket.onopen; },
            set onopen(fn) { funny.webSocket.onopen = fn; },
            get onclose() { return funny.webSocket.onclose; },
            set onclose(fn) { funny.webSocket.onclose = fn; },
            close: function () { funny.webSocket.close(); },
            get onmessage() { return funny.webSocket.onmessage; },
            set onmessage(fn) { // 接收
                funny.onmessage_fn = fn;
                funny.webSocket.onmessage = funny.onmessage;
            },
            send: function (message) { // 发送
                funny.webSocket.send(message);
                // stopstate
                if (message === "stopstate") {
                    $(".state-bar").addClass("hide");
                    $("[command=stopstate]")[0].style.display = "none";
                }
                $(".console").append($(`<div>&nbsp;>>&nbsp;${message}\n</div>`));
                funny.scroll("console");
            },
        };
    } else {
        console.log(`(${funny.scriptName})\nError: 无法获取 window.WebSocket!`);
    }



    // 操作 Document
    $(document).ready(function() {


        // 标记 是否移动端
        let isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent);
        // 移除游戏原聊天频道
        if (!isMobile) GM_addStyle(`.channel{display:none;}`);
        // 移除底部 Info
        $(".signinfo").addClass("hide");
        GM_addStyle(`.content-bottom{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}`); // 屏蔽连击按钮触发复制
        GM_addStyle(`.room-item>.item-name{margin-left: 14px;}`); // 角色列表左侧的外边距
        $(".room_items")[0].style.maxHeight = "240px";            // 房间列表大概可以显示 20 个人物
        // 隐藏部分滚动条
        $(".state-bar")[0].style.overflow = "hidden";
        $(".combat-commands")[0].style.overflow = "hidden";
        $(".dialog-content")[0].style.overflowX = "hidden";

        // 三栏布局
        $("body").append($(`<div class="left box"></div>`));
        $("body").append($(`<div class="right box"></div>`));
        $(".container").addClass("box");
        $(".login-content").addClass("box");
        GM_addStyle(`
            body {
                width: 100%;
                display: flex;
                flex-flow: row no-wrap;
            }
            .box {
                width: 360px;
                flex: 0 0 auto;
            }
            .container, .login-content {
                flex: 1 0 auto;
            }
            .left {
                order: -1;
            }
            .right {
                order: 1;
            }
        `);
        // left


        // combat-panel
        // $(".tool-item").show();
        // $(".combat-panel").removeClass("hide");




        setLeft();
        setRight();
        setNiceScroll();


        function setLeft() {
            $(".left").append(
                $(`<table class="role"></table>`).append(
                    $(`<tr><td colspan="4"><hiy>角色信息</hiy></td></tr>`),
                    $(`<tr><td colspan="4" class="role_name">ROLE_NAME</td></tr>`),
                    $(`<tr><td>ID</td><td colspan="3" class="role_id"></td></tr>`),
                    $(`<tr><td>性别</td><td class="role_gender"></td><td>境界</td><td class="role_level"></td></tr>`),
                    $(`<tr><td>年龄</td><td colspan="3" class="role_age"></td></tr>`),
                    $(`<tr><td>经验</td><td colspan="3"><hig class="role_exp"></hig></td></tr>`),
                    $(`<tr><td>潜能</td><td colspan="3"><hig class="role_pot"></hig></td></tr>`),
                    $(`<tr><td>气血</td><td colspan="3"><span class="role_hp"></span>/<hic class="role_max_hp"></hic></td></tr>`),
                    $(`<tr><td>内力</td><td colspan="3"><span class="role_mp"></span>/<hic class="role_max_mp"></hic></td></tr>`),
                    $(`<tr><td>内力上限</td><td colspan="3"><hic class="role_limit_mp"></hic></td></tr>`),
                    $(`<tr><td>臂力</td><td><hiy class="role_str"></hiy>+<span class="role_str_add"></span></td><td>根骨</td><td><hiy class="role_con"></hiy>+<span class="role_con_add"></span></td></tr>`),
                    $(`<tr><td>身法</td><td><hiy class="role_dex"></hiy>+<span class="role_dex_add"></span></td><td>悟性</td><td><hiy class="role_int"></hiy>+<span class="role_int_add"></span></td></tr>`),
                    $(`<tr><td>攻击</td><td><hig class="role_gj"></hig></td><td>终伤</td><td><hig class="role_add_sh"></hig></td></tr>`),
                    $(`<tr><td>防御</td><td><hig class="role_fy"></hig></td><td>命中</td><td><hig class="role_mz"></hig></td></tr>`),
                    $(`<tr><td>招架</td><td><hig class="role_zj"></hig></td><td>躲闪</td><td><hig class="role_ds"></hig></td></tr>`),
                    $(`<tr><td>暴击</td><td><hig class="role_bj"></hig></td><td>攻速</td><td><hig class="role_gjsd"></hig></td></tr>`),
                    $(`<tr><td>门派</td><td><hic class="role_family"></hic></td><td>功绩</td><td><hic class="role_gongji"></hic></td></tr>`),
                    $(`<tr><td>忽视防御</td><td class="role_diff_fy"></td><td>伤害减免</td><td class="role_diff_sh"></td></tr>`),
                    $(`<tr><td>暴击伤害</td><td class="role_add_bj"></td><td>暴击抵抗</td><td class="role_diff_bj"></td></tr>`),
                    $(`<tr><td>增加忙乱</td><td class="role_busy"></td><td>忽视忙乱</td><td class="role_diff_busy"></td></tr>`),
                    $(`<tr><td>释放速度</td><td class="role_releasetime"></td><td>冷却速度</td><td class="role_distime"></td></tr>`),
                    $(`<tr><td>打坐效率</td><td class="role_dazuo_per"></td><td>内力减耗</td><td class="role_expend_mp"></td></tr>`),
                    $(`<tr><td>练习效率</td><td class="role_lianxi_per"></td><td>学习效率</td><td class="role_study_per"></td></tr>`),
                )
            );
            $(".left").append(`<div class="console"></div>`);
            $(".left").append(
                $(`<div class="send_controller"></div>`).append(
                    $(`<input type="text" autocomplete="off" id="send_value">`).keypress(function(key) {
                        if (key.which == 13) $("#send_btn").click();
                    }),
                    $(`<button type="button" id="send_btn">发送</button>`).click(function() {
                        let value = $("#send_value").val();
                        if (value) funny.sendmessage(value);
                        $("#send_value").val("");
                    }),
                )
            );

            GM_addStyle(`
            .left {
                display: flex;
                flex-direction: column;
            }
            .role {
                order: 0;
                flex: 0 0 auto;
                width: 100%;
                flex: 0 0 auto;
                table-layout: fixed;
                border-collapse: collapse;
            }
            .role td {
                width: 60px;
                overflow: hidden;
                text-align: center;
                white-space: nowrap;
                border: #008000 solid 1px;
            }
            .console {
                order: 5;
                flex: 1 0 auto;
                height: 80px;
                overflow: auto;
            }

            .send_controller {
                order: 6;
                flex: 0 0 auto;
                height: 30px;
                display: flex;
            }
            .send_controller input {
                flex: 1 0 auto;
                height: auto;
            }
            .send_controller button {
                height: auto;
            }
            `);
        }
        function setRight() {
            $(".right").append(
                $(`<div class="msg chat"></div>`),
                $(`<div class="msg tm"></div>`),
                $(`<div class="msg fam"></div>`),
                $(`<div class="msg pty"></div>`),
                $(`<div class="msg es"></div>`),
                $(`<div class="msg sys rumor"></div>`),
                $(`<div class="msg pickup"></div>`),
            );
            GM_addStyle(`.right {
                height: 100%;
                display: flex;
                flex-direction: column;
            }`);
            GM_addStyle(`.msg {
                height: auto;
                overflow:auto;
                flex: 0 0 auto;
                font-size: 14px;
                max-height:calc(14px * 8);
            }`);
            GM_addStyle(`.chat {
                flex: 1 1 auto;
                max-height: 100%;
            }`);
        }
        function setNiceScroll() {
            $("html").niceScroll();
            let scroll = [
                ".room_items", ".state-bar", ".room-commands",
                ".console", ".msg",
            ];
            scroll.forEach(name => {
                $(name).niceScroll({ autohidemode: true });
            });
        }

        checkMobile();
        function checkMobile() {
            if (/Android|iPhone|iPad|iPod/.test(navigator.userAgent)) {
                $(".left").hide();
                $(".right").hide();
                GM_addStyle(`.channel { display:inline; }`);
            }
        }
    });
})();

/* 颜色标签
<wht></wht> 白色
<hig></hig> 绿
<hic></hic> 蓝
<hiy></hiy> 黄
<hiz></hiz> 紫
<hio></hio> 橙
<hir></hir> 红
<him></him> 亮紫色 谣言
*/