wsmud_funny

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

As of 2019-04-16. See the latest version.

// ==UserScript==
// @name        wsmud_funny
// @namespace   suqing
// @version     0.2.2
// @author      sq
// @match       http://www.wsmud.com/*
// @match       http://game.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
// @grant       unsafeWindow
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_deleteValue
// @grant       GM_getValue
// @grant       GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';
    let funny = {
        version: GM_info.script.version,
        role: {},
        skills: {},
        data_skill_limit: 0,
        data_login: 0,
        data_id: "12345678910",
        data_jy: 0,
        data_qn: 0,
        state: "data.state",
        data_autokill_xy: true,
        layout_left: true,
    };
    let fn = {
        send: function(message) {
            if (typeof message === "string") {
                sendmessage(message);
            } else if (message instanceof Array) {
                action(message);
                async function action(message) {
                    for (const m of message) {
                        (typeof m === "number") ? (await fn.sleep(m)) : sendmessage(m);
                    }
                }
            }

            function sendmessage(message) {
                $("#sendmessage").attr("cmd") ? $("#sendmessage").attr("cmd", message) : $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
                $("#sendmessage").click();
            }
        },
        sleep: function(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        },
        scroll: function(name) {
            if (name === undefined) return;
            let a = $(name)[0].scrollTop,
                b = $(name)[0].scrollHeight,
                h = Math.ceil($(name).height()); // 向上取整
                // console.log(`fn.scroll => a=${a} b=${b} h=${h}`);
            if (a < b - h) {
                $(name)[0].scrollTop = a + 1;
                setTimeout(`fn.scroll("${name}")`, 1000/120);
            }
        },
        deepCopy: function (object) {
            let result = {};
            for (const key in object) {
                result[key] = typeof object[key] === "object" ? fn.deepCopy(object[key]) : object[key];
            }
            return result;
        },
    };
    unsafeWindow.fn = fn;
    let listener = {
        onmessage: function(message) {
            let data = message.data;
            if (/{(.*)}/.test(data)) data = (new Function(`return ${data};`))();
            if (typeof data === "string") {
                listener.extends.text.forEach(fn => fn(message));
                return;
            } else if (typeof data === "object") {
                if (data.type === "roles") {

                } else if (data.type === "login") {
                    if (data.id) funny.data_id === data.id;
                } else if (data.type === "room") {
                    console.log(data);
                    if (/cmd cmd=/.test(data.desc)) {
                        data.desc = data.desc.replace("<hig>椅子</hig>", "椅子");
                        let a = data.desc.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
                        a.forEach(desc => data.desc = `<hic>${desc}</hic> ${data.desc}`);
                        let mask = fn.deepCopy(message);
                        mask.data = JSON.stringify(data);
                        funny.onmessage_fn.apply(this, [mask]);
                        return;
                    }
                } else if (data.type === "exits") {

                } else if (data.type === "state") {
                    funny.state = data.state;
                    if (data.desc && data.desc.length > 0) {
                        data.desc = [];
                        let mask = fn.deepCopy(message);
                        mask.data = JSON.stringify(data);
                        funny.onmessage_fn.apply(this, [mask]);
                        return;
                    }
                } else if (data.type === "status") {
                    console.log(data);
                    // {type: "status", action: "remove", id: "kjiv3d6cd56", sid: "force"}
                } else if (data.type === "items") {
                    // 当前房间人物 data.items Array
                } else if (data.type === "itemadd") {
                    if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
                        if (data.id) funny.sendmessage(`kill ${data.id}`);
                    }
                } else if (data.type === "itemremove") {

                } else if (data.type === "perform") {

                } else if (data.type === "msg") {
                    listener.extends.msg.forEach(fn => fn(data));
                    funny.onmessage_fn.apply(this, arguments);
                    $(".channel").html("");
                    return;
                } else if (data.type === "dialog") {
                    funny.onmessage_fn.apply(this, arguments);
                    listener.extends.dialog.forEach(fn => fn(data));
                    return;
                } else if (data.type === "sc") {

                } else if (data.type === "actions") {

                } else if (data.type === "addAction") {
                    if (data.name === "养精丹") fn.send(`use ${data.id}`);
                    console.log(data);
                } else if (data.type === "combat") {
                    // {type: "combat", end: 1}
                } else {
                    console.log(data);
                }
            }
            funny.onmessage_fn.apply(this, arguments);
        },
        sendmessage: function(message) {
            funny.webSocket.send(message);
            $(".console").append(`<div> >> ${message}</div>`);
            fn.scroll(".console");
        },
        extends: {
            text: [],
            dialog: [],
            msg: [],
        },
        addListener: function(type, fn) {
            listener.extends[type].push(fn);
        },
    };

    listener.addListener("text", function(message) {
        let data = message.data;
        if (/重新连线|欢迎登陆/.test(data)) {
            funny.data_login += 1;
            $(".content-message pre").append(`${data}\n`);
            if (funny.data_login === 1) {
                $(".content-message pre").append(`wsmud_funny ${funny.version} 苏轻祝您游戏愉快!\n`);
                getScore();
            }
            async function getScore() {
                $("[command=score]").click();
                await fn.sleep(100);
                $("[for=1]").click();
                await fn.sleep(100);
                $("[for=0]").click();
                await fn.sleep(100);
                $("[command=skills]").click();
                await fn.sleep(100);
                $("[command=pack]").click();
                await fn.sleep(100);
                $("[command=tasks]").click();
                await fn.sleep(100);
                $("[command=showcombat]").click(); // 点击动作
                await fn.sleep(100);
                $("[command=showtool]").click();   // 点击菜单
                await fn.sleep(1000);
                $(".dialog-close").click();
            };
        } else if (/你获得了(.*)点经验,(.*)点潜能/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/你获得了(.*)点经验,(.*)点潜能/);
            funny.data_jy += parseInt(a[1]);
            funny.data_qn += parseInt(a[2]);
            $(".remove_data_jyqn").remove();
            $(".content-message pre").append(
                $(`<span class="remove_data_jyqn"></span>`)
                .append(`合计 => 经验:${funny.data_jy} 潜能:${funny.data_qn}\n`)
            );
        } else if (/你从.*的尸体里拿出来.*|你获得了/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            if (/你获得了(.*)<wht>|银子/.test(data)) {
            } else {
                $(".pickup").append(`${data}<br>`);
                fn.scroll(".pickup");
            }
        } else if (/恭喜你得到一颗/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/恭喜你得到一颗<(.*)>(.*)<(.*)>。/);
            let key = a[2];
            (funny[key] === undefined) ? funny[key] = 1 : funny[key] += 1;
            $(`.remove_${key}`).remove();
            $(".content-message pre").append(
                $(`<span class="remove_${key}"></span>`).append(`合计 => ${key}:${funny[key]}\n`)
            );
        } else if (/你轻声吟道/.test(data)) {
        } else if (/看起来(.*)想杀死你/.test(data)) {
            let a = data.match(/看起来(.*)想杀死你!/);
            $(".content-message pre").append(`<hir>${a[1]} => 开始攻击你!<hir>\n`);
        } else if (/你对著(.*)喝道/.test(data)) {
            let a = data.match(/你对著(.*)喝道/);
            $(".content-message pre").append(`<hir>你 => 开始攻击${a[1]}!<hir>\n`);
        } else if (/造成(.*)点/.test(data)) {
            let a = data.split(/.*造成<wht>|.*造成<hir>|<\/wht>点|<\/hir>点/);
            let b = a[2].split(/伤害|\(|</);
            if (b[0] === "暴击") {
                $(".content-message pre").append(`${b[2]}受到<hir>${a[1]}</hir>点<hir>${b[0]}</hir>伤害!\n`);
            } else {
                $(".content-message pre").append(`${b[2]}受到<wht>${a[1]}</wht>点伤害!\n`);
            }
        } else if (/你的最大内力增加了/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/你的最大内力增加了(.*)点。/);
            let n = parseInt(a[1]),
              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)}分钟`;
            $(".remove_dzsj").remove();
            $(".content-message pre").append(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
        } else {
            funny.onmessage_fn.apply(this, arguments);
            console.log(data);
        }
        fn.scroll(".content-message");
    });
    listener.addListener("msg", function(data) {
        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() { fn.send(`${$(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() { fn.send(`${$(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() { fn.send(`${$(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 (data.content.includes("闭关修炼")) {
                let a = data.content.match(/听说武帝(.*)闭关修炼似有所悟,你随之受益获得了(.*)经验,(.*)潜能/);
                funny.send(`tm 武帝「${a[1]}」出关,奖励经验${a[2]},潜能${a[3]}。`);
            } else if (data.content.includes("有人得到")) {
                let a = data.content.match(/听说有人得到了(.*)。/);
                console.log(a);
            }
        } else if (data.ch === "sys") {
            if (data.content.includes("挖矿技巧")) {
                let a = data.content.match(/(.*)捡到一本挖矿指南/);
                $(".sys").append(`<hir>【系统】${a[1]}使用了挖矿指南!</hir><br>`);
            } else {
                $(".sys").append(`<hir>【系统】${data.content}</hir><br>`);
            }
            // 武神历三千一百五十八年蒙古可汗蒙哥被击杀于襄阳城下,襄阳城大获全胜!
            // 郭大侠犒赏全军,所有玩家获得200军功!
        } else {
            console.log(data);
        }
        fn.scroll(`.${data.ch}`);
    });
    // tasks
    listener.addListener("dialog", function(data) {
        if (data.dialog === "tasks" && data.items) {
            let fb, qa, wd1, wd2, wd3, sm1, sm2, ym1, ym2, yb1, yb2;
            data.items.forEach(item => {
                if (item.id === "signin") {
                    if (item.state === 2) fn.send("taskover signin"); // 签到
                    let a = item.desc.match(/师门任务:(.*),副本:<(.*)>(.*)\/20<(.*)>/);
                    let b = item.desc.match(/(.*)武道塔(.*),进度(.*)\/(.*)<(.*)>,<(.*)>(.*)首席请安。<(.*)>/);
                    (parseInt(a[3]) < 20) ? fb = `<hig>${a[3]}</hig>` : fb = a[3];
                    (parseInt(b[3]) < parseInt(b[4])) ? wd1 = `<hig>${b[3]}</hig>` : wd1 = b[3];
                    wd2 = b[4];
                    /可以重置/.test(b[2]) ? wd3 = "<hig>可以重置</hig>" : wd3 = "已经重置";
                    /已经/.test(b[7]) ? qa = "已经请安" : qa = "<hig>尚未请安</hig>";
                } else if (item.id === "sm") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
                    sm2 = a[2];
                } else if (item.id === "yamen") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
                    ym2 = a[2];
                } else if (item.id === "yunbiao") {
                    let a = item.desc.match(/本周完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? yb1 = `<hig>${a[1]}</hig>` : yb1 = a[1];
                    yb2 = a[2];
                }
            });
            let html = `门派请安 => ${qa}\n武道之塔 => ${wd1}/${wd2} ${wd3}\n`;
            html += `日常副本 => ${fb}/20\n师门任务 => ${sm1}/20 ${sm2}连\n`;
            html += `衙门追捕 => ${ym1}/20 ${ym2}连\n每周运镖 => ${yb1}/20 ${yb2}连\n`;
            $(".remove_tasks").remove();
            $(".content-message pre").append($(`<span class="remove_tasks"><span>`).html(html));
            fn.scroll(".content-message");
        }
    });
    // score skills
    listener.addListener("dialog", function(data) {
        if (data.dialog === "score") {
            for (const key in data) funny.role[key] = data[key];
            for (const key in funny.role) $(`.role_${key}`).html(funny.role[key]);
        } else if (data.dialog === "skills") {
            if (data.items) {
                funny.skills = data.items;
                funny.data_skill_limit = parseInt(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 = funny.data_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)}分钟`;
                    $(".remove_lx").remove();
                    $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
                    $(".content-message pre").append(`<span class="remove_lx">角色悟性: ${xtwx}+${htwx}\n练习效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n</span>`);
                    fn.scroll(".content-message");
                }
            }
        }
    });
    // pack
    listener.addListener("dialog", function(data) {
        if (data.dialog === "pack") {
            if (data.name) {
                // if (/大宋|蒙古|笠子|混天|曙光|鲲鹏|真武|君子|罗汉/.test(data.name)) {
                //     fn.send(`fenjie ${data.id}`);
                // }
            }
        }
    });

    if (WebSocket) {
        console.log(`Complete.`);
        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 = listener.onmessage;
            },
            send: function (message) {
                listener.sendmessage(message);
            },
        };
    } else console.log(`Failed.`);

    $(document).ready(function() {
        // mobile
        let agent = navigator.userAgent.toLowerCase();
        let isMobile = /ipad|iphone|android|mobile/.test(agent);
        if (isMobile) {
            console.log(agent);
            return;
        }
        // 样式优化
        $(".signinfo").addClass("hide");
        GM_addStyle(`.room_desc{overflow:hidden;white-space:nowrap;}`);
        GM_addStyle(`.channel{display:none;}`);
        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";
        $(".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;}`);
        GM_addStyle(`.box{width:360px;flex: 0 0 auto;}`);
        GM_addStyle(`.container,.login-content{flex:1 0 auto;}`);
        GM_addStyle(`.left{order:-1;} .right{order:1;}`);
        // 左边
        $(".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>`),
            ),

            $(`<div class="console"></div>`),
            $(`<div class="send_controller"></div>`).append(
                $(`<input type="text" autocomplete="off" readonly="readonly" 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) fn.send(value);
                    $("#send_value").val("");
                }),
            ),
            $(`<div class="buttons"></div>`).append(
                $(`<button type="button">切换左右边栏</button>`).click(function() {
                    if (funny.layout_left) {
                        $(".left")[0].style.order = "1";
                        $(".right")[0].style.order = "-1";
                    } else {
                        $(".left")[0].style.order = "-1";
                        $(".right")[0].style.order = "1";
                    }
                    funny.layout_left = !funny.layout_left;
                }),
                $(`<button type="button">世界清屏</button>`).click(() => $(".chat").html("")),
                $(`<button type="button">队伍清屏</button>`).click(() => $(".tm").html("")),
                $(`<button type="button">门派清屏</button>`).click(() => $(".fam").html("")),
                $(`<button type="button">帮派清屏</button>`).click(() => $(".pty").html("")),
                $(`<button type="button">全区清屏</button>`).click(() => $(".es").html("")),
                $(`<button type="button">系统清屏</button>`).click(() => $(".sys").html("")),
                $(`<button type="button">游戏清屏</button>`).click(() => $(".content-message pre").html("")),
            ),
            // $(`<button class="test">TEST</button>`).click(() => {
            //     fn.send([1000, "tm test"]);
            // }),
            // $(`<input type="checkbox" value="">`),
        );
        setTimeout(() => $(".send_controller input")[0].removeAttribute("readonly"), 5000);


        GM_addStyle(`.left{display:flex;flex-direction:column;}`);
        GM_addStyle(`.role{order:0;flex: 0 0 auto;width:100%;table-layout:fixed;border-collapse:collapse;}`);
        GM_addStyle(`.role td{width:88px;text-align:center;white-space:nowrap;border:#008000 solid 1px;}`);
        GM_addStyle(`.console {order:5;flex:1 0 auto;height:80px;overflow:auto;}`);
        GM_addStyle(`.buttons{order:9;flex:0 0 auto;}`);
        GM_addStyle(`.send_controller{order: 6;flex: 0 0 auto;height: 30px;display: flex;}`);
        GM_addStyle(`.send_controller input {flex: 1 0 auto;height: auto;} .send_controller button{height:auto;}`);
        GM_addStyle(`.test{order:999;flex:0 0 auto;height:auto;text-align:center;}`);
        // 右边
        $(".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;line-height:16px;max-height:160px;}`);
        GM_addStyle(`.chat{flex:1 1 auto;max-height:100%;}`);
    });

})();