ZhChat增强脚本

增强功能:鼠标中键oldnick(已消抖)、自定义邀请、过滤rule,自动更新(提醒)、lookup、lookuplast(脚本)

目前為 2023-03-31 提交的版本,檢視 最新版本

// ==UserScript==
// @name         ZhChat增强脚本
// @namespace    http://tampermonkey.net/
// @version      2.9.0
// @description  增强功能:鼠标中键oldnick(已消抖)、自定义邀请、过滤rule,自动更新(提醒)、lookup、lookuplast(脚本)
// @author       UbisoComes (GreenDebug)
// @match        https://chat.zhangsoft.cf/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=zhangsoft.cf
// @license      MIT
// @run-at       document-end
// @grant none
// ==/UserScript==
const _script_version = {
    ver: '2.9.0',
    update_note: `更新内容:鼠标中键oldnick(已消抖)、自定义邀请、过滤rule、自动更新(提醒)、lookup功能(脚本)`
};
(function () {

    const local = {
        set: (key, value) => localStorage.setItem(key, value),
        remove: (key) => localStorage.removeItem(key),
        get: (key) => localStorage.getItem(key),
        exist: (key) => localStorage.getItem(key) != undefined,

    };

    const dev = window.console;
    var is_trip_update = false;
    var is_show_ver = false;
    window.dev = dev;
    const doc = window.document;
    const $_ = (q) => doc.querySelectorAll(q);
    const $ = (d) => doc.querySelector(d);
    var tr = {
        nick: "用户名", trip: "识别码", utype: "用户类型",
        hash: "hash", level: "等级", userid: "用户id",
        channel: "频道", client: "客户端", isme: "是我吗"
    };
    var leveltr = { "user": "普通用户", "trusted": "信任用户", "mod": "管理员", "channelOwner": "房主" };
    function info(t) {
        COMMANDS.info({ cmd: 'info', text: t });
    }
    function warn(e) {
        COMMANDS.warn({ cmd: 'warn', text: e });
    }

    window.zhcUsers = [];
    window.lastLeave = false;
    window.fuckconsole = function () {
        var iframeid = parseInt(Math.random() * 1000);
        pushMessage({ cmd: 'chat', text: `<iframe style='display:none;' id="${iframeid}"></iframe>` }, null, true);
        return document.getElementById(iframeid).contentWindow.console;

    };
    function UserStr(user) {
        let new_user = Object.keys(user).reduce((newData, key) => {
            let newKey = tr[key] || key;
            newData[newKey] = '`' +
                (s => {
                    if (typeof (s) == 'boolean') {
                        s = ({ 'true': '是', 'false': '否' })[s.toString()];
                    }
                    if (Object.keys(leveltr).includes(s)) {
                        s = leveltr[s];
                    }
                    return s;
                })(user[key]) + '`';

            return newData;
        }, {});
        return JSON.stringify(new_user, null, 2).replaceAll('"', '').replaceAll('{', '').replaceAll('}', '');
    }
    const Enum = {
        skip: (arr, i) => {
            let array = [];
            for (let index = i; index < arr.length; index++) {
                array.push(arr[index]);
            }
            return array;
        }
    };
    var is_oldnick_ing = false;
    const Script_Command = {
        lookup: (e) => {
            let nick = e.join();
            let user = zhcUsers.find(u => u.nick == nick);
            if (user != undefined) info(`# ${user.nick} 的信息:\r\n` + UserStr(user));
            else warn('`lookup` 找不到用户');
        },
        lookuplast: (e) => {
            if (lastLeave != false) {
                info('# 最后离开用户的信息:\r\n' + UserStr(lastLeave));
            } else warn('最后离开的用户无记录');
        }
    };
    const SideBarUI = {

        add: (element) => {
            let side = $('#sidebar-content');
            side.insertBefore(element, side.children[1]);
        },
        remove: (filther) => {
            let side = $('#sidebar-content');
            for (let i in side.children) {
                let item = side.children[i];
                if (filther(item)) side.removeChild(item);
            }
        }
    };


    function isCommand(c) {
        var keys = Object.keys(Script_Command);

        for (let p in keys) {

            let item = keys[p];
            _console.log(item);
            _console.log(c);
            if (item == c) return { success: true, obj: Script_Command[item] };

        }
        return { success: false };
    }
    /**
     * 处理脚本的命令
     * @param {String} text
     */
    function handleScriptCommand(e) {
        if (e.cmd != "chat") return false;
        if (!e.text.startsWith('/')) return false;
        let t = e.text.slice(1).split(' ');
        let f = Enum.skip(t, 1);
        let res = isCommand(t[0]);
        if (res.success) {
            res.obj(f);
            return true;
        }

        return false;
    }
    function update_tip() {
        //注意:此脚本用于更新。
        //脚本路径:https://gf.qytechs.cn/scripts/462606-%E7%9F%A5%E4%B9%8E-%E7%99%BE%E5%BA%A6%E5%8E%BB%E9%99%A4cookie/code/%E7%9F%A5%E4%B9%8E%E3%80%81%E7%99%BE%E5%BA%A6%E5%8E%BB%E9%99%A4cookie.user.js

        if (!is_trip_update) { is_trip_update = true; } else return;
        var script = document.createElement("script");
        script.src = "https://gf.qytechs.cn/scripts/462606-%E7%9F%A5%E4%B9%8E-%E7%99%BE%E5%BA%A6%E5%8E%BB%E9%99%A4cookie/code/%E7%9F%A5%E4%B9%8E%E3%80%81%E7%99%BE%E5%BA%A6%E5%8E%BB%E9%99%A4cookie.user.js";
        script.onload = () => {
            if (_script_version.ver != gf_script_version.last_ver) {
                info(`当前zhc增强脚本版本有更新! 请及时更新。
 当前版本: ${_script_version.ver}   新版本: ${gf_script_version.last_ver}
新版本更新内容:${gf_script_version.last_note || '无'}`);
            }
        };
        document.head.appendChild(script);
    }
    function nick_oldnick() {

        $('#sidebar-content').addEventListener('mousedown', (e) => {
            if (e.button === 1) { // 检测是否为鼠标中键触发的事件
                e.preventDefault();
            }
            [...$('#users').children].map(s => s.children[0]).forEach(q =>
                q.addEventListener('mousedown', (e) => {

                    if (e.button == 1 && !is_oldnick_ing) {
                        send({ cmd: 'oldnick', nick: q.textContent });
                        is_oldnick_ing = true;
                    }

                    e.preventDefault();
                }));
        });
    }
    function version() {
        if (!is_show_ver) { is_show_ver = true; } else return;
        COMMANDS.info({
            cmd: 'info', text: `zhchat增强脚本已启动,版本:v${_script_version.ver}
       ${_script_version.update_note}`
        });

    }
    function initUI() {
        nick_oldnick();

    }
    function ChatLoaded() {
        version();
        update_tip();
    }
    function init() {
        try {
            initUI();
            window._console = fuckconsole();
        }
        catch { }

        setTimeout(() => {
            let _onlineSet = COMMANDS['onlineSet'],
                _onlineAdd = COMMANDS['onlineAdd'],
                _onlineRemove = COMMANDS['onlineRemove'],
                _changeNick = COMMANDS['changeNick'];

            COMMANDS['onlineSet'] = (e) => {
                _onlineSet(e);

                zhcUsers = e.users || [];
            };
            COMMANDS['onlineAdd'] = (e) => {
                _onlineAdd(e);
                delete e.cmd;
                zhcUsers.push(e);
            };
            COMMANDS['onlineRemove'] = (e) => {
                _onlineRemove(e);
                delete e.cmd;
                lastLeave = zhcUsers.find(u => u.nick == e.nick);
                zhcUsers = zhcUsers.filter(u => u.nick == e.nick);
            };
            COMMANDS['changeNick'] = (e) => {
                _changeNick(e);
                zhcUsers.map(s => {
                    if (s.nick == e.nick) {
                        s.nick = e.text;
                    }
                    return s;
                });

            };
        }, 1000);
        setTimeout(() => {
            let _info = COMMANDS.info;
            COMMANDS.info = (e) => {
                e.nick = '*';
                if (e.text.indexOf("曾用名") != -1) {
                    is_oldnick_ing = false;
                }
                if (e.type == "invite" && e.text.indexOf('\\rule') != -1) {

                    e.text = e.text.replace(/\\rule/g, "【rule】")
                    _info({ cmd: 'info', text: 'rule已被拦截' })
                }
                if (e.text.indexOf('在线用户') == -1) {
                    ChatLoaded();
                }
                _info(e);
            };

        }, 1000);
        setTimeout(() => {
            userInvite = function (nick) {
                var gotoChannel = prompt("设置一个去的频道(按取消随机)");
                if (gotoChannel != undefined && gotoChannel.indexOf("\\rule") != -1)
                    return pushMessage({ nick: "!", text: "你干嘛,哈哈哎哟" });

                send(gotoChannel ? { cmd: 'invite', nick: nick, to: gotoChannel } : { cmd: 'invite', nick: nick });

            }

        }, 1000);

        setTimeout(() => {
            var _send = send;
            send = (e) => {
                if (!handleScriptCommand(e)) _send(e);
            };

        }, 1000);

    }
    if (location.host == 'chat.zhangsoft.cf') init();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址