// ==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();
})();