// ==UserScript==
// @name 【移动端】MT论坛优化
// @namespace https://github.com/WhiteSevs/TamperMonkeyScript
// @version 2025.9.4
// @author WhiteSevs
// @description MT论坛效果增强,如自动签到、自动展开帖子、滚动加载评论、显示UID、自定义屏蔽、手机版小黑屋、编辑器优化、在线用户查看、便捷式图床、自定义用户标签、积分商城商品上架提醒等
// @license GPL-3.0-only
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAADptJREFUeF7tnQtwVNUZx/9nN5CQgCG8QoAdE3lFeWQDGAK+ikKCQGtHBHlJQeVRrTICJQUrgggkUhiRdIRgyBahpThWEHAob6mCVCApCIUQGiDKK0ACEUMMe2/n3E1Ckt279557d+8mN+fMMJlhv/Od7/vO737ncc+eJdBRLuRfSAbwa0JIogjRrkNVvapKQA6JEL8iVrLSZrPl1SvjaxlLtBp/Pv/8LEJImtb6ZqlHCHnddr9tRX31RxMA+fn5v7AS69766rSv7XaKzgExMTH7fK3XCH3MAJw6dapZaHDoYRB0McLAetGGiFxbtK0HIeTnemFvNSOZAfDV03/rjgWzt7RFeIgTc5IK0TRYMDR2RaVWLNrRGoJAMOPJa2gXXq6rfafojImJiTmnS0kAKjMDcOHchRkA/qTX1vzrjfHHbZGSmqcfKsG4PsV6VTLV/+DLljh0PlSq89rj15EY/RNT/drCFlj6d4jucFCXkgBUZgbgfP75eYSQt/XaKorA/O1tcKYwGFaLiN8+cgP9YvR1glqbjn7fBEv3tJLEI0KdWDjsMsJD9GWg+joPCBgANPh3BYJpn0ahuNSKmJY/45VHbyim4uu3rbh2OwiVf0MbCWgZ5kSrsLvS39DG3jvy8q0g/GFLW5Q7Ce4LEfD6E9fwYGSZWnZk5TgAGkN4pKAJlu11PY2Pd7yNKY/cqKHp++JGOH4xBMcq/ik1Q8fy3rZSdI8qQ2xkGYIsYo0qqbtaS/poGdunGEMeKlFSqepzDoCqMHkWchyKwM7TTaUPX3i4GIMfLMGXeWHYk9sUedcaa9Yc3sSJPrZSJMX+iA7Ny7ExOxybj98n6esf8xNefey6Zt21K3IAdIZy5qYoXLoVhLDGAlqFOXG+qJFOjfeqBweJUprP+cH15EfddxcLhl5Bk0b6xv3qBnIAdHYXTcs0PRtRUgYWome7Oz5tigOgI5wFxY2Qvr8l6HhvRHms421MrTXX0NsuB0BjBOlanK7JjS50srjkmcs+a5YDoCGUW080w9+ONNdQ0zdV6HwjY9QPPlFGAYg+E1MMCy6RgbjiE6UGKAnYPgCd5WccaGGAi96bSLi/FNOeuKbbjjYFY38MLv3atZQRcQwWfI5ywUGG4Kxu5X5UEBAAvrsUgrRdrSHUXKL70U3vqod1K8Ho3vq2otsUjEJw6Tc1GxJRAoIsEMFBBiE7YA56aTggANB3APRdQF0qLyUW4ckuP2o2ySMANbU5AMFBkvCl5kb8UNFwAOjmTuY3EbKuPB4LJHYCmoYAl4uBHceBPI0jarf2wFPdAVtL4FwhsOUocEFm74duRb87VGNDAFQAUOGz+BlESxZJdm7xQ38yqzQcAG9P//AEYBo9ZFatOAXgpdXA/66y+dbDBvx5Qs065U5gdDpw9ZZnXXqygHoAKtsWd8NiySIDnevZPPOttKEAKD39ayYDnVxviGuUj78CVjOeP0r5JTDUwynFVXuA9V97DqKeLMAOQKUN5FuIogPNhCzSH6W+7V5lbYYC8PYXkV739jdPByLC3I3+IgdIZUyYaaOAfp3ddX36LbB8u3xgXnn0Oh55gP21tHYAKmwhOA0BDliFLCOXkYYBQHf5Uj5v6xXJzElAZw8ia/8FfMR44k4uA2TsAdbJZABqHO18CgFr0Q3AvQYvAXBIS8ihyGW1g1XeMAB2nGqKv/xbfvJHDX+mNzBjSE0X7pQDL38EXGBcqneMdM0BQqstNgpLgEkfATe8TPbp0bRVz7NvDvkQgMoA3JZAcK0cDrN2rFp5wwB4959t8N8rwYp20RVA344Vq4CbwM7j8jN3JWVRzYHBcS4pQQA2HQFuqsjuWl4W+QGA6u59DNHiIMl39yj5zPq5IQDQ0zcT1ndgtS1g8r/qfgvP97rJ1L6fAXDZQsTNECgIzk1MxnkRNgQAegxrxqYoX9nsdz1aDosYAkCV5+I+EEsWGeRcqzcYhgBAt34X7zTmXb/egND6XduUYe5gto0HYwGo8FLEUViQhSDBQQZA0zamIQDUlRc/auGgh0s/GH5RrbgkFxAA7lmYBxEOECGLJIHJcEMAUDsBZIq4n4XXjy9gaiHAAFTaStOWA6KQRZJxSo0DHgHo2bNnDCHEwzYKMHny5Bc6tO8wTo3ySpl//CccuYX+efkjlpcAZUWwtn4YljAbYPHNqaJ6CkBlyOl5NwqCgyTjkLe+qgGA3W5/GcBqls6tU7LWEDR+YCSCe7yh26x6DsA9/0X8FZCWkDs9BaUKALvdvhXAUN2RqwMKLOGdEfbkBoBYNFtjGgDurRw+hyj+jiSjxtgmAWC326cBeF9ztOpgRWubRIT2/0DzkGA+ACo6ySJ0IwNxsrLLKgGoI2dzfEtSUNQTaJKQClhd3wdgKaYFADhBkoTuVQDExcUlEEK8ThRYAlfXZIPaPoqQhFSQIA+vGb0Ya2IA6JnF+SRZmEfdJ3FxcS8SQjLrWsf50p6gyH4uCBq5vhamppgaAIK1ZJDwmwYDAHXU2joBTRLSQILVHUM3NQAQ95EkcUCDAkCCoFVvFwQhyl9EMTUADW0IqJ7yrS3tLgiatPE6EpgaAJBnSZLzswaXASp73NqiB0IS0mAJlX9DaWIAvkMjIZ4MwN0GC4A0HEQ85IIgzPM5BdMCIOL3JFmouuOpQawC5HK9pdkDCI5LgSWsvZvI+8/So3nqS8tLr6PxnTr55R/JifYtpBvsvq94+qsO2DVoANR3rzkku9t+OvldQeirOTk5VUdsOQDm6FsmLwgh6dnZ2a816DkAU8RMKEwIGZ2dnb2BZwATdq5Klw7l5OQkUgDmEkLmq6zExUwUAUEQYikAmYSQF03kF3dFZQQIIWMoAGsIIRNV1uFiJoqAKIovcABM1KGsrnAAWCNmMnkOgMk6lNUdDgBrxEwmzwEwWYeyusMBYI2YyeQ5ACbrUFZ3OACsETOZvF8AWL3a+zfLrl69ijfffFNzKMeMGYMBA6TzjLJl0qRJmvV7q6jkm18araV01apVOHzYNzfG+AWA7GzlQxFvvfUWtm6l30RjK507d8bGjRsVK8XHxyvKaBFQ45sWvSx1KNz1HoCSkhI899xzoNmApWRmZqJXr16KVTgAiiGSBAKWAWjjO3bsQEpKijpLAUydOhVTpkxRJc8BUBWmwAJATZw3bx42b96saG3fvn2xcuVKRblKAQ6AulAFNANQE0tLS0EndefOyf/iarNmzZCVlYWOHTuq8woAB0BdqAIOADVz9+7dmDlzpqzFdJgYNWqUOo8qpIwGQGlS1qdPHzf7tdShSkwxCawdjbS0NGzYsMEtSEOGDMHChQuZOp8KGw0AHZ7o8sxToUtHOQDklqt0rkPnPJ5KvQWgrKwMwcGebwotLy/HhAkTcPJk1b0FiI6ORkZGBlq39ny9nDd9HAB1z4yhQwB9SuSopubu378f06bRi0pcJTU1FcnJtX48oJpf3vT5C4Bt27ahXbt2btGdP38+Nm3yfHmnlgwwduxY2WFx9OjROHVK1QVgihQYDkCLFi0wcuRIWcNWrFiBNWvWYPz48XjjDfmLnuhm0I0bN2SB8hcAnuYjd+7cwcSJE2U7RQsAiYmJ+PDDD93idPHiRQwfPhy0TV8UwwGg4+Qnn3yCTp06ebRfEARprZ+eni47XOTl5WHEiBGSnFxG8RcAbdu2xZIlS9C9e9UNK9LyVG78p05qAYDWq+0fXSktX74c+/Yx3pvvhZSAANCtWzesW7dO1iw6O/Y0aaqsMG7cOJw4cSIgAFAb6DyGDk0RERE4c+YMDhw44PVh1AoAVdq/f3/Q7e+ioiJpiCwu1vfLZrUNDQgA1AjaiTNmzGDOYkuXLq2CJxAZgNlgHRlAS1usdQIGADV02bJlim/1qju0d+9eTJ8+veq/OACs3e0uH1AAbDYb1q5di+bNle/soamPTgwLCu7dccgBqOcAUPOHDRuGBQsWKHri6fUxB0AxbIoCAc0AldbNmTNHmtXLFbpqWLRokdvHHADF/lUUqBMAhIeHSzt+Xbp0cTM4NzeX3k6Omzfdf76FA6DYv4oCdQIAaqWWpRIHQLF/FQU4AIoh0i+gBW79rarTUGcAoO8A6Mug2sXhcEi7X54KzwDqOtmbVJ0BgBrp6cClty1dDoDJAKDu0N3B2NhY6cUK3fXzVjgAJgSAxSUOAEu0PMvWqSGA1R0OAGvE3OU5APpjqKiBrwIqQqT03lwxkrUEeAZgjRjPAPojpkEDzwA8AzCfCtbAmaYqfA6gKWxslXgG4BmAZwDKAJ8E1swc9Oyjv+4xUJuj+BCgNlI65PgQwIcAPgTwIcDzl0P5EKAjtfKNIB3Bq6jK5wD6Y6iogc8B+ByAzwH4HIDPAfg+QK3Bgu8DKI6e3gX4JFBnAI2+Jo7vBPKdQK/fo2flmWcA1ojx8wD6I6ZBA18G8mUgXwbyZSBfBvJlIF8Ger9MiXV45ZNA1ogZNAmkN3527drVrbXZs2dj+/bt+q2u0DB48GAsXrzYTd/p06eZr5b1mVEeFMlddUvjRG9IDWTxy8sgT09mYWEhkpKSfO4rvXK+9k2ivt5v0Gs0vfHM0y+N+PLKV602+gUAasygQYOka9wiIyNx8OBBzJo1S6uNivXee+899OvXD1euXJH2GXbu3KlYx2gBetP53Llz0bNnTxw7dgzvvPMOzp49a7QZbu35DYCAe8YNUBUBDoCqMJlXiANg3r5V5RkHQFWYzCvEATBv36ryjAOgKkzmFeIAmLdvVXnGAVAVJvMKcQDM27eqPOMAqAqTeYU4AObtW1WecQBUhcm8QhIAdrs9HcCr5nWTeyYXAULICBIfH/+UKIq7eJgaXgQIIdGEum2324sAKP92S8OLkZk93pWTkzNIAiAuLm4+IWSumb3lvtWMgMViefro0aPbJQBoiY+P3y6KovxvtfIImiYChJDZ2dnZqdShKgAqMsEAQgg9aNcbQJBpPOaO0AicB/B3q9WaceTIkarjSP8HC+OZoHXD4j8AAAAASUVORK5CYII=
// @supportURL https://github.com/WhiteSevs/TamperMonkeyScript/issues
// @match *://bbs.binmt.cc/*
// @exclude /^http(s|)://bbs.binmt.cc/uc_server.*$/
// @require https://fastly.jsdelivr.net/gh/WhiteSevs/TamperMonkeyScript@86be74b83fca4fa47521cded28377b35e1d7d2ac/lib/CoverUMD/index.js
// @require https://fastly.jsdelivr.net/gh/WhiteSevs/TamperMonkeyScript@79fb4d854f1e2cdf606339b0dac18d50104e2ebe/lib/js-watermark/index.js
// @require https://fastly.jsdelivr.net/npm/@whitesev/utils@2.7.5/dist/index.umd.js
// @require https://fastly.jsdelivr.net/npm/@whitesev/domutils@1.6.5/dist/index.umd.js
// @require https://fastly.jsdelivr.net/npm/@whitesev/pops@2.4.1/dist/index.umd.js
// @require https://fastly.jsdelivr.net/npm/qmsg@1.4.0/dist/index.umd.js
// @require https://fastly.jsdelivr.net/npm/viewerjs@1.11.7/dist/viewer.min.js
// @require https://fastly.jsdelivr.net/npm/@highlightjs/cdn-assets@11.11.1/highlight.min.js
// @resource HljsCSS https://fastly.jsdelivr.net/npm/highlight.js@11.11.1/styles/github-dark.min.css
// @resource ViewerCSS https://fastly.jsdelivr.net/npm/viewerjs@1.11.7/dist/viewer.min.css
// @connect *
// @connect helloimg.com
// @connect z4a.net
// @connect kggzs.cn
// @connect woozooo.com
// @grant GM.cookie
// @grant GM_deleteValue
// @grant GM_getResourceText
// @grant GM_getValue
// @grant GM_info
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_unregisterMenuCommand
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-start
// ==/UserScript==
(function (Qmsg, DOMUtils, Utils, pops, hljs, Viewer) {
'use strict';
var _GM = (() => typeof GM != "undefined" ? GM : void 0)();
var _GM_deleteValue = (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)();
var _GM_getResourceText = (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)();
var _GM_getValue = (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)();
var _GM_info = (() => typeof GM_info != "undefined" ? GM_info : void 0)();
var _GM_registerMenuCommand = (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
var _GM_setValue = (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)();
var _GM_unregisterMenuCommand = (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)();
var _GM_xmlhttpRequest = (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
var _unsafeWindow = (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
var _monkeyWindow = (() => window)();
const CommonUtil = {
waitRemove(...args) {
args.forEach((selector) => {
if (typeof selector !== "string") {
return;
}
utils.waitNodeList(selector).then((nodeList) => {
nodeList.forEach(($el) => $el.remove());
});
});
},
addBlockCSS(...args) {
let selectorList = [];
if (args.length === 0) {
return;
}
if (args.length === 1 && typeof args[0] === "string" && args[0].trim() === "") {
return;
}
args.forEach((selector) => {
if (Array.isArray(selector)) {
selectorList = selectorList.concat(selector);
} else {
selectorList.push(selector);
}
});
return addStyle(`${selectorList.join(",\n")}{display: none !important;}`);
},
setGMResourceCSS(resourceMapData) {
let cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : null;
if (typeof cssText === "string" && cssText) {
addStyle(cssText);
} else {
CommonUtil.loadStyleLink(resourceMapData.url);
}
},
async loadStyleLink(url) {
let $link = document.createElement("link");
$link.rel = "stylesheet";
$link.type = "text/css";
$link.href = url;
DOMUtils.ready(() => {
document.head.appendChild($link);
});
},
async loadScript(url) {
let $script = document.createElement("script");
$script.src = url;
return new Promise((resolve) => {
$script.onload = () => {
resolve(null);
};
(document.head || document.documentElement).appendChild($script);
});
},
fixUrl(url) {
url = url.trim();
if (url.match(/^http(s|):\/\//i)) {
return url;
} else if (url.startsWith("//")) {
if (url.startsWith("///")) ;
else {
url = window.location.protocol + url;
}
return url;
} else {
if (!url.startsWith("/")) {
url += "/";
}
url = window.location.origin + url;
return url;
}
},
fixHttps(url) {
if (url.startsWith("https://")) {
return url;
}
if (!url.startsWith("http://")) {
return url;
}
let urlInstance = new URL(url);
urlInstance.protocol = "https:";
return urlInstance.toString();
},
lockScroll(...args) {
let $hidden = document.createElement("style");
$hidden.innerHTML =
`
.pops-overflow-hidden-important {
overflow: hidden !important;
}
`;
let $elList = [document.documentElement, document.body].concat(...args || []);
$elList.forEach(($el) => {
$el.classList.add("pops-overflow-hidden-important");
});
(document.head || document.documentElement).appendChild($hidden);
return {
recovery() {
$elList.forEach(($el) => {
$el.classList.remove("pops-overflow-hidden-important");
});
$hidden.remove();
}
};
},
async getClipboardText() {
function readClipboardText(resolve) {
navigator.clipboard.readText().then((clipboardText) => {
resolve(clipboardText);
}).catch((error) => {
log.error("读取剪贴板内容失败👉", error);
resolve("");
});
}
function requestPermissionsWithClipboard(resolve) {
navigator.permissions.query({
name: "clipboard-read"
}).then((permissionStatus) => {
readClipboardText(resolve);
}).catch((error) => {
log.error("申请剪贴板权限失败,尝试直接读取👉", error.message ?? error.name ?? error.stack);
readClipboardText(resolve);
});
}
function checkClipboardApi() {
if (typeof navigator?.clipboard?.readText !== "function") {
return false;
}
if (typeof navigator?.permissions?.query !== "function") {
return false;
}
return true;
}
return new Promise((resolve) => {
if (!checkClipboardApi()) {
resolve("");
return;
}
if (document.hasFocus()) {
requestPermissionsWithClipboard(resolve);
} else {
window.addEventListener(
"focus",
() => {
requestPermissionsWithClipboard(resolve);
},
{
once: true
}
);
}
});
},
escapeHtml(unsafe) {
return unsafe.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'").replace(/©/g, "©").replace(/®/g, "®").replace(/™/g, "™").replace(/→/g, "→").replace(/←/g, "←").replace(/↑/g, "↑").replace(/↓/g, "↓").replace(/—/g, "—").replace(/–/g, "–").replace(/…/g, "…").replace(/ /g, " ").replace(/\r\n/g, "
").replace(/\r/g, "
").replace(/\n/g, "
").replace(/\t/g, " ");
},
interval(fn, intervalTime, timeout = 5e3) {
let timeId;
let maxTimeout = timeout - intervalTime;
let intervalTimeCount = intervalTime;
let loop = async (isTimeout) => {
let result = await fn(isTimeout);
if (typeof result === "boolean" && !result || isTimeout) {
utils.workerClearTimeout(timeId);
return;
}
intervalTimeCount += intervalTime;
if (intervalTimeCount > maxTimeout) {
loop(true);
return;
}
timeId = utils.workerSetTimeout(() => {
loop(false);
}, intervalTime);
};
loop(false);
},
findParentNode($el, selector, parentSelector) {
if (parentSelector) {
let $parent = DOMUtils.closest($el, parentSelector);
if ($parent) {
let $target = $parent.querySelector(selector);
return $target;
}
} else {
if (DOMUtils.matches($el, selector)) {
return $el;
}
let $parent = DOMUtils.closest($el, selector);
return $parent;
}
}
};
const GM_RESOURCE_MAPPING = {
Viewer: {
keyName: "ViewerCSS",
url: "https://fastly.jsdelivr.net/npm/viewerjs@latest/dist/viewer.min.css"
},
Hljs: {
keyName: "HljsCSS",
url: "https://fastly.jsdelivr.net/npm/highlight.js@latest/styles/github-dark.min.css"
}
};
const PanelSettingConfig = {
qmsg_config_position: {
key: "qmsg-config-position",
defaultValue: "bottom"
},
qmsg_config_maxnums: {
key: "qmsg-config-maxnums",
defaultValue: 3
},
qmsg_config_showreverse: {
key: "qmsg-config-showreverse",
defaultValue: false
},
httpx_cookie_manager_enable: {
key: "httpx-use-cookie-enable",
defaultValue: false
},
httpx_cookie_manager_use_document_cookie: {
key: "httpx-use-document-cookie",
defaultValue: false
}
};
const utils = Utils.noConflict();
const domUtils = DOMUtils.noConflict();
const __pops = pops;
const log = new utils.Log(
_GM_info,
_unsafeWindow.console || _monkeyWindow.console
);
let SCRIPT_NAME = _GM_info?.script?.name || void 0;
pops.config.Utils.AnyTouch();
const DEBUG = false;
log.config({
debug: DEBUG,
logMaxCount: 1e3,
autoClearConsole: true,
tag: true
});
Qmsg.config({
isHTML: true,
autoClose: true,
showClose: false,
consoleLogContent(qmsgInst) {
const qmsgType = qmsgInst.getSetting().type;
if (qmsgType === "loading") {
return false;
}
const content = qmsgInst.getSetting().content;
if (qmsgType === "warning") {
log.warn(content);
} else if (qmsgType === "error") {
log.error(content);
} else {
log.info(content);
}
return true;
},
get position() {
return Panel.getValue(
PanelSettingConfig.qmsg_config_position.key,
PanelSettingConfig.qmsg_config_position.defaultValue
);
},
get maxNums() {
return Panel.getValue(
PanelSettingConfig.qmsg_config_maxnums.key,
PanelSettingConfig.qmsg_config_maxnums.defaultValue
);
},
get showReverse() {
return Panel.getValue(
PanelSettingConfig.qmsg_config_showreverse.key,
PanelSettingConfig.qmsg_config_showreverse.defaultValue
);
},
get zIndex() {
let maxZIndex = Utils.getMaxZIndex();
let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
}
});
__pops.GlobalConfig.setGlobalConfig({
zIndex: () => {
let maxZIndex = Utils.getMaxZIndex(void 0, void 0, ($ele) => {
if ($ele?.classList?.contains("qmsg-shadow-container")) {
return false;
}
if ($ele?.closest("qmsg") && $ele.getRootNode() instanceof ShadowRoot) {
return false;
}
});
let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex;
return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100;
},
mask: {
enable: true,
clickEvent: {
toClose: false,
toHide: false
}
},
drag: true
});
const GM_Menu = new utils.GM_Menu({
GM_getValue: _GM_getValue,
GM_setValue: _GM_setValue,
GM_registerMenuCommand: _GM_registerMenuCommand,
GM_unregisterMenuCommand: _GM_unregisterMenuCommand
});
const httpx = new utils.Httpx({
xmlHttpRequest: _GM_xmlhttpRequest,
logDetails: DEBUG
});
httpx.interceptors.request.use((data) => {
return data;
});
httpx.interceptors.response.use(void 0, (data) => {
log.error("拦截器-请求错误", data);
if (data.type === "onabort") {
Qmsg.warning("请求取消", { consoleLogContent: true });
} else if (data.type === "onerror") {
Qmsg.error("请求异常", { consoleLogContent: true });
} else if (data.type === "ontimeout") {
Qmsg.error("请求超时", { consoleLogContent: true });
} else {
Qmsg.error("其它错误", { consoleLogContent: true });
}
return data;
});
({
Object: {
defineProperty: _unsafeWindow.Object.defineProperty
},
Function: {
apply: _unsafeWindow.Function.prototype.apply,
call: _unsafeWindow.Function.prototype.call
},
Element: {
appendChild: _unsafeWindow.Element.prototype.appendChild
},
setTimeout: _unsafeWindow.setTimeout
});
const addStyle = utils.addStyle.bind(utils);
const $ = DOMUtils.selector.bind(DOMUtils);
const $$ = DOMUtils.selectorAll.bind(DOMUtils);
new utils.GM_Cookie();
const KEY = "GM_Panel";
const ATTRIBUTE_INIT = "data-init";
const ATTRIBUTE_KEY = "data-key";
const ATTRIBUTE_DEFAULT_VALUE = "data-default-value";
const ATTRIBUTE_INIT_MORE_VALUE = "data-init-more-value";
const PROPS_STORAGE_API = "data-storage-api";
const PanelSizeUtil = {
get width() {
return globalThis.innerWidth;
},
get height() {
return globalThis.innerHeight;
}
};
const PanelUISize = {
setting: {
get width() {
if (PanelSizeUtil.width < 550) {
return "88vw";
} else if (PanelSizeUtil.width < 700) {
return "550px";
} else {
return "700px";
}
},
get height() {
if (PanelSizeUtil.height < 450) {
return "70vh";
} else if (PanelSizeUtil.height < 550) {
return "450px";
} else {
return "550px";
}
}
},
settingMiddle: {
get width() {
return PanelSizeUtil.width < 350 ? "88vw" : "350px";
}
}
};
class StorageUtils {
storageKey;
listenerData;
constructor(key) {
if (typeof key === "string") {
let trimKey = key.trim();
if (trimKey == "") {
throw new Error("key参数不能为空字符串");
}
this.storageKey = trimKey;
} else {
throw new Error("key参数类型错误,必须是字符串");
}
this.listenerData = new Utils.Dictionary();
}
getLocalValue() {
let localValue = _GM_getValue(this.storageKey);
if (localValue == null) {
localValue = {};
this.setLocalValue(localValue);
}
return localValue;
}
setLocalValue(value) {
_GM_setValue(this.storageKey, value);
}
set(key, value) {
let oldValue = this.get(key);
let localValue = this.getLocalValue();
Reflect.set(localValue, key, value);
this.setLocalValue(localValue);
this.triggerValueChangeListener(key, oldValue, value);
}
get(key, defaultValue) {
let localValue = this.getLocalValue();
return Reflect.get(localValue, key) ?? defaultValue;
}
getAll() {
let localValue = this.getLocalValue();
return localValue;
}
delete(key) {
let oldValue = this.get(key);
let localValue = this.getLocalValue();
Reflect.deleteProperty(localValue, key);
this.setLocalValue(localValue);
this.triggerValueChangeListener(key, oldValue, void 0);
}
has(key) {
let localValue = this.getLocalValue();
return Reflect.has(localValue, key);
}
keys() {
let localValue = this.getLocalValue();
return Reflect.ownKeys(localValue);
}
values() {
let localValue = this.getLocalValue();
return Reflect.ownKeys(localValue).map(
(key) => Reflect.get(localValue, key)
);
}
clear() {
_GM_deleteValue(this.storageKey);
}
addValueChangeListener(key, callback) {
let listenerId = Math.random();
let listenerData = this.listenerData.get(key) || [];
listenerData.push({
id: listenerId,
key,
callback
});
this.listenerData.set(key, listenerData);
return listenerId;
}
removeValueChangeListener(listenerId) {
let flag = false;
for (const [key, listenerData] of this.listenerData.entries()) {
for (let index = 0; index < listenerData.length; index++) {
const value = listenerData[index];
if (typeof listenerId === "string" && value.key === listenerId || typeof listenerId === "number" && value.id === listenerId) {
listenerData.splice(index, 1);
index--;
flag = true;
}
}
this.listenerData.set(key, listenerData);
}
return flag;
}
triggerValueChangeListener(key, oldValue, newValue) {
if (!this.listenerData.has(key)) {
return;
}
let listenerData = this.listenerData.get(key);
for (let index = 0; index < listenerData.length; index++) {
const data = listenerData[index];
if (typeof data.callback === "function") {
let value = this.get(key);
let __newValue;
let __oldValue;
if (typeof oldValue !== "undefined" && arguments.length >= 2) {
__oldValue = oldValue;
} else {
__oldValue = value;
}
if (typeof newValue !== "undefined" && arguments.length > 2) {
__newValue = newValue;
} else {
__newValue = value;
}
data.callback(key, __oldValue, __newValue);
}
}
}
}
const PopsPanelStorageApi = new StorageUtils(KEY);
const PanelContent = {
$data: {
__contentConfig: null,
get contentConfig() {
if (this.__contentConfig == null) {
this.__contentConfig = new utils.Dictionary();
}
return this.__contentConfig;
}
},
addContentConfig(configList) {
if (!Array.isArray(configList)) {
configList = [configList];
}
let index = this.$data.contentConfig.keys().length;
this.$data.contentConfig.set(index, configList);
},
getAllContentConfig() {
return this.$data.contentConfig.values().flat();
},
getConfig(index = 0) {
return this.$data.contentConfig.get(index) ?? [];
},
getDefaultBottomContentConfig() {
return [
{
id: "script-version",
title: `版本:${_GM_info?.script?.version || "未知"}`,
isBottom: true,
forms: [],
clickFirstCallback(event, rightHeaderElement, rightContainerElement) {
let supportURL = _GM_info?.script?.supportURL || _GM_info?.script?.namespace;
if (typeof supportURL === "string" && utils.isNotNull(supportURL)) {
window.open(supportURL, "_blank");
}
return false;
}
}
];
}
};
const PanelMenu = {
$data: {
__menuOption: [
{
key: "show_pops_panel_setting",
text: "⚙ 设置",
autoReload: false,
isStoreValue: false,
showText(text) {
return text;
},
callback: () => {
Panel.showPanel(PanelContent.getConfig(0));
}
}
],
get menuOption() {
return this.__menuOption;
}
},
init() {
this.initExtensionsMenu();
},
initExtensionsMenu() {
if (!Panel.isTopWindow()) {
return;
}
GM_Menu.add(this.$data.menuOption);
},
addMenuOption(option) {
if (!Array.isArray(option)) {
option = [option];
}
this.$data.menuOption.push(...option);
},
updateMenuOption(option) {
if (!Array.isArray(option)) {
option = [option];
}
option.forEach((optionItem) => {
let findIndex = this.$data.menuOption.findIndex((it) => {
return it.key === optionItem.key;
});
if (findIndex !== -1) {
this.$data.menuOption[findIndex] = optionItem;
}
});
},
getMenuOption(index = 0) {
return this.$data.menuOption[index];
},
deleteMenuOption(index = 0) {
this.$data.menuOption.splice(index, 1);
}
};
const Panel = {
$data: {
__contentConfigInitDefaultValue: null,
__onceExecMenuData: null,
__onceExecData: null,
__panelConfig: {},
$panel: null,
panelContent: [],
get contentConfigInitDefaultValue() {
if (this.__contentConfigInitDefaultValue == null) {
this.__contentConfigInitDefaultValue = new utils.Dictionary();
}
return this.__contentConfigInitDefaultValue;
},
contentConfigInitDisabledKeys: [],
get onceExecMenuData() {
if (this.__onceExecMenuData == null) {
this.__onceExecMenuData = new utils.Dictionary();
}
return this.__onceExecMenuData;
},
get onceExecData() {
if (this.__onceExecData == null) {
this.__onceExecData = new utils.Dictionary();
}
return this.__onceExecData;
},
get scriptName() {
return SCRIPT_NAME;
},
get panelConfig() {
return this.__panelConfig;
},
set panelConfig(value) {
this.__panelConfig = value;
},
key: KEY,
attributeKeyName: ATTRIBUTE_KEY,
attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE
},
init() {
this.initContentDefaultValue();
PanelMenu.init();
},
isTopWindow() {
return _unsafeWindow.top === _unsafeWindow.self;
},
initContentDefaultValue() {
const initDefaultValue = (config) => {
if (!config.attributes) {
return;
}
if (config.type === "button" || config.type === "forms" || config.type === "deepMenu") {
return;
}
let menuDefaultConfig = new Map();
let key = config.attributes[ATTRIBUTE_KEY];
if (key != null) {
const defaultValue = config.attributes[ATTRIBUTE_DEFAULT_VALUE];
menuDefaultConfig.set(key, defaultValue);
}
let moreMenuDefaultConfig = config.attributes[ATTRIBUTE_INIT_MORE_VALUE];
if (typeof moreMenuDefaultConfig === "object" && moreMenuDefaultConfig) {
Object.keys(moreMenuDefaultConfig).forEach((key2) => {
menuDefaultConfig.set(key2, moreMenuDefaultConfig[key2]);
});
}
if (!menuDefaultConfig.size) {
log.warn(["请先配置键", config]);
return;
}
let __attr_init__ = config.attributes[ATTRIBUTE_INIT];
if (typeof __attr_init__ === "function") {
let __attr_result__ = __attr_init__();
if (typeof __attr_result__ === "boolean" && !__attr_result__) {
return;
}
}
if (config.type === "switch") {
let disabled = typeof config.disabled === "function" ? config.disabled() : config.disabled;
if (typeof disabled === "boolean" && disabled) {
this.$data.contentConfigInitDisabledKeys.push(...menuDefaultConfig.keys());
}
}
for (const [__key, __defaultValue] of menuDefaultConfig.entries()) {
this.setDefaultValue(__key, __defaultValue);
}
};
const loopInitDefaultValue = (configList) => {
for (let index = 0; index < configList.length; index++) {
let configItem = configList[index];
initDefaultValue(configItem);
let child_forms = configItem.forms;
if (child_forms && Array.isArray(child_forms)) {
loopInitDefaultValue(child_forms);
}
}
};
const contentConfigList = [...PanelContent.getAllContentConfig()];
for (let index = 0; index < contentConfigList.length; index++) {
let leftContentConfigItem = contentConfigList[index];
if (!leftContentConfigItem.forms) {
continue;
}
const rightContentConfigList = leftContentConfigItem.forms;
if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
loopInitDefaultValue(rightContentConfigList);
}
}
this.$data.contentConfigInitDisabledKeys = [...new Set(this.$data.contentConfigInitDisabledKeys)];
},
setDefaultValue(key, defaultValue) {
if (this.$data.contentConfigInitDefaultValue.has(key)) {
log.warn("请检查该key(已存在): " + key);
}
this.$data.contentConfigInitDefaultValue.set(key, defaultValue);
},
setValue(key, value) {
PopsPanelStorageApi.set(key, value);
},
getValue(key, defaultValue) {
let localValue = PopsPanelStorageApi.get(key);
if (localValue == null) {
if (this.$data.contentConfigInitDefaultValue.has(key)) {
return this.$data.contentConfigInitDefaultValue.get(key);
}
return defaultValue;
}
return localValue;
},
deleteValue(key) {
PopsPanelStorageApi.delete(key);
},
hasKey(key) {
return PopsPanelStorageApi.has(key);
},
addValueChangeListener(key, callback) {
let listenerId = PopsPanelStorageApi.addValueChangeListener(key, (__key, __newValue, __oldValue) => {
callback(key, __oldValue, __newValue);
});
return listenerId;
},
removeValueChangeListener(listenerId) {
PopsPanelStorageApi.removeValueChangeListener(listenerId);
},
triggerMenuValueChange(key, newValue, oldValue) {
PopsPanelStorageApi.triggerValueChangeListener(key, oldValue, newValue);
},
exec(queryKey, callback, checkExec, once = true) {
const that = this;
let queryKeyFn;
if (typeof queryKey === "string" || Array.isArray(queryKey)) {
queryKeyFn = () => queryKey;
} else {
queryKeyFn = queryKey;
}
let isArrayKey = false;
let queryKeyResult = queryKeyFn();
let keyList = [];
if (Array.isArray(queryKeyResult)) {
isArrayKey = true;
keyList = queryKeyResult;
} else {
keyList.push(queryKeyResult);
}
let findNotInDataKey = keyList.find((it) => !this.$data.contentConfigInitDefaultValue.has(it));
if (findNotInDataKey) {
log.warn(`${findNotInDataKey} 键不存在`);
return;
}
let storageKey = JSON.stringify(keyList);
if (once) {
if (this.$data.onceExecMenuData.has(storageKey)) {
return;
}
this.$data.onceExecMenuData.set(storageKey, 1);
}
let storeValueList = [];
let listenerIdList = [];
let dynamicAddStyleNodeCallback = (value, $style) => {
let dynamicResultList = [];
if (!Array.isArray($style)) {
$style = [$style];
}
$style.forEach(($styleItem) => {
if ($styleItem == null) {
return;
}
if ($styleItem instanceof HTMLStyleElement) {
dynamicResultList.push($styleItem);
return;
}
});
{
storeValueList = storeValueList.concat(dynamicResultList);
}
};
let getMenuValue = (key) => {
let value = this.getValue(key);
return value;
};
let clearBeforeStoreValue = () => {
for (let index = 0; index < storeValueList.length; index++) {
let $css = storeValueList[index];
$css.remove();
storeValueList.splice(index, 1);
index--;
}
};
let checkMenuExec = () => {
let flag = false;
if (typeof checkExec === "function") {
flag = checkExec(keyList);
} else {
flag = keyList.every((key) => getMenuValue(key));
}
return flag;
};
let valueChangeCallback = (valueOption) => {
let execFlag = checkMenuExec();
let resultList = [];
if (execFlag) {
let valueList = keyList.map((key) => this.getValue(key));
let callbackResult = callback({
value: isArrayKey ? valueList : valueList[0],
addStyleElement: (...args) => {
return dynamicAddStyleNodeCallback(true, ...args);
}
});
if (!Array.isArray(callbackResult)) {
callbackResult = [callbackResult];
}
callbackResult.forEach((it) => {
if (it == null) {
return;
}
if (it instanceof HTMLStyleElement) {
resultList.push(it);
return;
}
});
}
clearBeforeStoreValue();
storeValueList = [...resultList];
};
once && keyList.forEach((key) => {
let listenerId = this.addValueChangeListener(key, (key2, newValue, oldValue) => {
valueChangeCallback();
});
listenerIdList.push(listenerId);
});
valueChangeCallback();
let result = {
clear() {
this.clearStoreStyleElements();
this.removeValueChangeListener();
once && that.$data.onceExecMenuData.delete(storageKey);
},
clearStoreStyleElements: () => {
return clearBeforeStoreValue();
},
removeValueChangeListener: () => {
listenerIdList.forEach((listenerId) => {
this.removeValueChangeListener(listenerId);
});
}
};
return result;
},
execMenu(key, callback, isReverse = false, once = false) {
return this.exec(
key,
(option) => {
return callback(option);
},
(keyList) => {
let execFlag = keyList.every((__key__) => {
let flag = !!this.getValue(__key__);
let disabled = Panel.$data.contentConfigInitDisabledKeys.includes(__key__);
if (disabled) {
flag = false;
log.warn(`.execMenu${once ? "Once" : ""} ${__key__} 被禁用`);
}
isReverse && (flag = !flag);
return flag;
});
return execFlag;
},
once
);
},
execMenuOnce(key, callback, isReverse = false) {
return this.execMenu(key, callback, isReverse, true);
},
deleteExecMenuOnce(key) {
this.$data.onceExecMenuData.delete(key);
let flag = PopsPanelStorageApi.removeValueChangeListener(key);
return flag;
},
onceExec(key, callback) {
key = this.transformKey(key);
if (typeof key !== "string") {
throw new TypeError("key 必须是字符串");
}
if (this.$data.onceExecData.has(key)) {
return;
}
callback();
this.$data.onceExecData.set(key, 1);
},
deleteOnceExec(key) {
key = this.transformKey(key);
this.$data.onceExecData.delete(key);
},
showPanel(content, title = `${SCRIPT_NAME}-设置`, preventDefaultContentConfig = false, preventRegisterSearchPlugin = false) {
this.$data.$panel = null;
this.$data.panelContent = [];
let checkHasBottomVersionContentConfig = content.findIndex((it) => {
let isBottom = typeof it.isBottom === "function" ? it.isBottom() : Boolean(it.isBottom);
return isBottom && it.id === "script-version";
}) !== -1;
if (!preventDefaultContentConfig && !checkHasBottomVersionContentConfig) {
content.push(...PanelContent.getDefaultBottomContentConfig());
}
let $panel = __pops.panel({
...{
title: {
text: title,
position: "center",
html: false,
style: ""
},
content,
btn: {
close: {
enable: true,
callback: (details, event) => {
details.close();
this.$data.$panel = null;
}
}
},
mask: {
enable: true,
clickEvent: {
toClose: true,
toHide: false
},
clickCallBack: (originalRun, config) => {
originalRun();
this.$data.$panel = null;
}
},
width: PanelUISize.setting.width,
height: PanelUISize.setting.height,
drag: true,
only: true
},
...this.$data.panelConfig
});
this.$data.$panel = $panel;
this.$data.panelContent = content;
if (!preventRegisterSearchPlugin) {
this.registerConfigSearch({ $panel, content });
}
},
registerConfigSearch(config) {
const { $panel, content } = config;
let asyncQueryProperty = async (target, handler) => {
if (target == null) {
return;
}
let handleResult = await handler(target);
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
return handleResult.data;
}
return await asyncQueryProperty(handleResult.data, handler);
};
let scrollToElementAndListen = ($el, callback) => {
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
callback?.();
observer.disconnect();
}
});
},
{
root: null,
threshold: 1
}
);
observer.observe($el);
$el.scrollIntoView({ behavior: "smooth", block: "center" });
};
let addFlashingClass = ($el) => {
const flashingClassName = "pops-flashing";
domUtils.animationend($el, () => {
$el.classList.remove(flashingClassName);
});
$el.classList.add(flashingClassName);
};
let dbclick_event = (evt, selectorTarget) => {
utils.preventEvent(evt);
let $alert = __pops.alert({
title: {
text: "搜索配置",
position: "center"
},
content: {
text: (
`
`
),
html: true
},
btn: {
ok: { enable: false }
},
mask: {
clickEvent: {
toClose: true
}
},
width: PanelUISize.settingMiddle.width,
height: "auto",
drag: true,
style: (
`
${__pops.config.cssText.panelCSS}
.search-wrapper{
border-bottom: 1px solid rgb(235, 238, 245, 1);
}
.pops-content:has(.search-result-wrapper:empty) .search-wrapper{
border-bottom: 0;
}
.search-config-text{
width: 100%;
border: 0;
height: 32px;
padding: 0px 10px;
outline: none;
}
.search-result-wrapper{
max-height: 400px;
overflow: auto;
}
.search-result-item{
cursor: pointer;
padding: 5px 10px;
display: flex;
flex-direction: column;
}
.search-result-item:hover{
background-color: #D8F1FD;
}
.search-result-item-path{
display: flex;
align-items: center;
}
.search-result-item-description{
font-size: 0.8em;
color: #6c6c6c;
}
${config.searchDialogStyle ?? ""}
`
)
});
$alert.$shadowRoot.querySelector(".search-wrapper");
let $searchInput = $alert.$shadowRoot.querySelector(".search-config-text");
let $searchResultWrapper = $alert.$shadowRoot.querySelector(".search-result-wrapper");
$searchInput.focus();
let clearSearchResult = () => {
domUtils.empty($searchResultWrapper);
};
let createSearchResultItem = (pathInfo) => {
const searchPath = utils.queryProperty(pathInfo, (target) => {
if (target?.next) {
return {
isFind: false,
data: target.next
};
} else {
return {
isFind: true,
data: target
};
}
});
let $item = domUtils.createElement("div", {
className: "search-result-item",
innerHTML: (
`
${searchPath.matchedData?.path}
${searchPath.matchedData?.description ?? ""}
`
)
});
domUtils.on($item, "click", (clickItemEvent) => {
let $asideItems = $panel.$shadowRoot.querySelectorAll(
"aside.pops-panel-aside .pops-panel-aside-top-container li"
);
let $targetAsideItem = $asideItems[pathInfo.index];
if (!$targetAsideItem) {
Qmsg.error(`左侧项下标${pathInfo.index}不存在`);
return;
}
$targetAsideItem.scrollIntoView({
behavior: "smooth",
block: "center"
});
$targetAsideItem.click();
asyncQueryProperty(pathInfo.next, async (target) => {
if (target?.next) {
let $findDeepMenu = await utils.waitNode(() => {
return Array.from(
$panel.$shadowRoot.querySelectorAll(".pops-panel-deepMenu-nav-item")
).find(($deepMenu) => {
const __formConfig__ = Reflect.get($deepMenu, "__formConfig__");
return typeof __formConfig__ === "object" && __formConfig__ != null && __formConfig__.text === target.name;
});
}, 2500);
if ($findDeepMenu) {
$findDeepMenu.click();
} else {
Qmsg.error("未找到对应的二级菜单");
return {
isFind: true,
data: target
};
}
return {
isFind: false,
data: target.next
};
} else {
let $findTargetMenu = await utils.waitNode(() => {
return Array.from(
$panel.$shadowRoot.querySelectorAll(`li:not(.pops-panel-deepMenu-nav-item)`)
).find(($menuItem) => {
const __formConfig__ = Reflect.get($menuItem, "__formConfig__");
return __formConfig__ === target.matchedData?.formConfig;
});
}, 2500);
if ($findTargetMenu) {
scrollToElementAndListen($findTargetMenu);
let $fold = $findTargetMenu.closest(`.pops-panel-forms-fold[data-fold-enable]`);
if ($fold) {
let $foldWrapper = $fold.querySelector(".pops-panel-forms-fold-container");
$foldWrapper.click();
await utils.sleep(500);
}
scrollToElementAndListen($findTargetMenu, () => {
addFlashingClass($findTargetMenu);
});
} else {
Qmsg.error("未找到对应的菜单项");
}
return {
isFind: true,
data: target
};
}
});
});
return $item;
};
let execSearch = (searchText) => {
const searchTextRegExp = new RegExp(searchText, "i");
const searchConfigResult = [];
const loopContentConfig = (configList, path) => {
for (let index = 0; index < configList.length; index++) {
const configItem = configList[index];
let child_forms = configItem.forms;
if (child_forms && Array.isArray(child_forms)) {
const deepMenuPath = utils.deepClone(path);
if (configItem.type === "deepMenu") {
const deepNext = utils.queryProperty(deepMenuPath, (target) => {
if (target?.next) {
return {
isFind: false,
data: target.next
};
} else {
return {
isFind: true,
data: target
};
}
});
deepNext.next = {
name: configItem.text
};
}
loopContentConfig(child_forms, deepMenuPath);
} else {
let text = Reflect.get(configItem, "text");
let description = Reflect.get(configItem, "description");
const delayMatchedTextList = [text, description];
let matchedIndex = delayMatchedTextList.findIndex((configText) => {
if (typeof configText !== "string") {
return;
}
return configText.match(searchTextRegExp);
});
if (matchedIndex !== -1) {
const matchedPath = utils.deepClone(path);
const deepNext = utils.queryProperty(matchedPath, (target) => {
if (target?.next) {
return {
isFind: false,
data: target.next
};
} else {
return {
isFind: true,
data: target
};
}
});
deepNext.next = {
name: text,
matchedData: {
path: "",
formConfig: configItem,
matchedText: delayMatchedTextList[matchedIndex],
description
}
};
const pathList = [];
utils.queryProperty(matchedPath, (target) => {
const name = target?.name;
if (typeof name === "string" && name.trim() !== "") {
pathList.push(name);
}
if (target?.next) {
return {
isFind: false,
data: target.next
};
} else {
return {
isFind: true,
data: target
};
}
});
const pathStr = pathList.join(CommonUtil.escapeHtml(" - "));
deepNext.next.matchedData.path = pathStr;
searchConfigResult.push(matchedPath);
}
}
}
};
for (let index = 0; index < content.length; index++) {
const leftContentConfigItem = content[index];
if (!leftContentConfigItem.forms) {
continue;
}
if (leftContentConfigItem.isBottom && leftContentConfigItem.id === "script-version") {
continue;
}
const rightContentConfigList = leftContentConfigItem.forms;
if (rightContentConfigList && Array.isArray(rightContentConfigList)) {
let text = leftContentConfigItem.title;
if (typeof text === "function") {
text = text();
}
loopContentConfig(rightContentConfigList, {
index,
name: text
});
}
}
let fragment = document.createDocumentFragment();
for (const pathInfo of searchConfigResult) {
let $resultItem = createSearchResultItem(pathInfo);
fragment.appendChild($resultItem);
}
clearSearchResult();
$searchResultWrapper.append(fragment);
};
domUtils.on(
$searchInput,
"input",
utils.debounce((evt2) => {
utils.preventEvent(evt2);
let searchText = domUtils.val($searchInput).trim();
if (searchText === "") {
clearSearchResult();
return;
}
execSearch(searchText);
}, 200)
);
};
let clickElement = null;
let isDoubleClick = false;
let timer = void 0;
domUtils.on(
$panel.$shadowRoot,
"dblclick",
`aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`,
dbclick_event
);
domUtils.on(
$panel.$shadowRoot,
"touchend",
`aside.pops-panel-aside .pops-panel-aside-item:not(#script-version)`,
(evt, selectorTarget) => {
clearTimeout(timer);
timer = void 0;
if (isDoubleClick && clickElement === selectorTarget) {
isDoubleClick = false;
clickElement = null;
dbclick_event(evt);
} else {
timer = setTimeout(() => {
isDoubleClick = false;
}, 200);
isDoubleClick = true;
clickElement = selectorTarget;
}
},
{
capture: true
}
);
$panel.$shadowRoot.appendChild(
domUtils.createElement("style", {
type: "text/css",
textContent: (
`
.pops-flashing{
animation: double-blink 1.5s ease-in-out;
}
@keyframes double-blink {
0% {
background-color: initial;
}
25% {
background-color: yellow;
}
50% {
background-color: initial;
}
75% {
background-color: yellow;
}
100% {
background-color: initial;
}
}
`
)
})
);
},
transformKey(key) {
if (Array.isArray(key)) {
const keyArray = key.sort();
return JSON.stringify(keyArray);
} else {
return key;
}
}
};
class HttpxCookieManager {
$data = {
get enable() {
return Panel.getValue(
PanelSettingConfig.httpx_cookie_manager_enable.key,
PanelSettingConfig.httpx_cookie_manager_enable.defaultValue
);
},
get useDocumentCookie() {
return Panel.getValue(
PanelSettingConfig.httpx_cookie_manager_use_document_cookie.key,
PanelSettingConfig.httpx_cookie_manager_use_document_cookie.defaultValue
);
},
cookieRule: []
};
constructor(cookieRule) {
if (Array.isArray(cookieRule)) {
this.$data.cookieRule = cookieRule;
}
}
fixCookieSplit(str) {
if (utils.isNotNull(str) && !str.trim().endsWith(";")) {
str += ";";
}
return str;
}
concatCookie(targetCookie, newCookie) {
if (utils.isNull(targetCookie)) {
return newCookie;
}
targetCookie = targetCookie.trim();
newCookie = newCookie.trim();
targetCookie = this.fixCookieSplit(targetCookie);
if (newCookie.startsWith(";")) {
newCookie = newCookie.substring(1);
}
return targetCookie.concat(newCookie);
}
handle(details) {
if (details.fetch) {
return;
}
if (!this.$data.enable) {
return;
}
let ownCookie = "";
let url = details.url;
if (url.startsWith("//")) {
url = window.location.protocol + url;
}
let urlObj = new URL(url);
if (this.$data.useDocumentCookie && urlObj.hostname.endsWith(
window.location.hostname.split(".").slice(-2).join(".")
)) {
ownCookie = this.concatCookie(ownCookie, document.cookie.trim());
}
for (let index = 0; index < this.$data.cookieRule.length; index++) {
let rule = this.$data.cookieRule[index];
if (urlObj.hostname.match(rule.hostname)) {
let cookie = Panel.getValue(rule.key);
if (utils.isNull(cookie)) {
break;
}
ownCookie = this.concatCookie(ownCookie, cookie);
}
}
if (utils.isNotNull(ownCookie)) {
if (details.headers && details.headers["Cookie"]) {
details.headers.Cookie = this.concatCookie(
details.headers.Cookie,
ownCookie
);
} else {
details.headers["Cookie"] = ownCookie;
}
log.info(["Httpx => 设置cookie:", details]);
}
if (details.headers && details.headers.Cookie != null && utils.isNull(details.headers.Cookie)) {
delete details.headers.Cookie;
}
}
}
{
CommonUtil.setGMResourceCSS(GM_RESOURCE_MAPPING.Viewer);
}
{
CommonUtil.setGMResourceCSS(GM_RESOURCE_MAPPING.Hljs);
}
const httpxCookieManager = new HttpxCookieManager([
{
key: "httpx-cookie-bbs.binmt.cc",
hostname: /bbs.binmt.cc/g
}
]);
httpx.interceptors.request.use((data) => {
httpxCookieManager.handle(data);
return data;
});
__pops.GlobalConfig.setGlobalConfig({
mask: {
enable: true
},
drag: true
});
const ElementUtils = {
registerLeftMenu(config) {
utils.waitNode(
".comiis_sidenv_box .sidenv_li .comiis_left_Touch",
1e4
).then(($leftTouch) => {
if (!$leftTouch) {
log.error("注册左侧面板菜单失败,原因:该元素不存在");
return;
}
let $setting = domUtils.createElement("li", {
className: "comiis_left_Touch",
innerHTML: (
`
${config.name}
`
)
});
let $icon = $setting.querySelector(".comiis_font");
if (typeof config.style === "string") {
$icon.style.cssText = config.style;
}
if (typeof config.icon === "string") {
$icon.innerHTML = config.icon;
}
if (typeof config.iconColor === "string") {
$icon.style.color = config.iconColor;
}
if (typeof config.iconSize === "string") {
$icon.style.fontSize = config.iconSize;
}
domUtils.on($setting, "click", (event) => {
utils.preventEvent(event);
if (typeof config.callback === "function") {
config.callback();
}
});
domUtils.append($leftTouch, $setting);
});
},
comiisForumList: () => {
return document.querySelectorAll("li.forumlist_li");
},
comiisPostli: () => {
return document.querySelectorAll(
"div.comiis_postli.comiis_list_readimgs.nfqsqi"
);
},
comiisMmlist: () => {
return document.querySelectorAll(".comiis_mmlist");
}
};
const blackHomeCSS = ".pops-confirm-content {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n.blackhome-user-filter input {\r\n width: -moz-available;\r\n width: -webkit-fill-available;\r\n height: 30px;\r\n margin: 8px 20px;\r\n border: 0;\r\n border-bottom: 1px solid;\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n.blackhome-user-filter input:focus-within {\r\n outline: none;\r\n}\r\n.blackhome-user-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n}\r\n.blackhome-user-list .blackhome-user-item {\r\n margin: 15px 10px;\r\n padding: 10px;\r\n border-radius: 8px;\r\n box-shadow: 0 0 0.6rem #c8d0e7, -0.2rem -0.2rem 0.5rem #fff;\r\n}\r\n.blackhome-user {\r\n display: flex;\r\n}\r\n.blackhome-user img {\r\n width: 45px;\r\n height: 45px;\r\n border-radius: 45px;\r\n}\r\n.blackhome-user-info {\r\n margin-left: 10px;\r\n}\r\n.blackhome-user-info p:nth-child(1) {\r\n margin-bottom: 5px;\r\n}\r\n.blackhome-user-info p:nth-child(2) {\r\n font-size: 14px;\r\n}\r\n.blackhome-user-action {\r\n display: flex;\r\n margin: 10px 0;\r\n}\r\n.blackhome-user-action p:nth-child(1),\r\n.blackhome-user-action p:nth-child(2) {\r\n border: 1px solid red;\r\n color: red;\r\n border-radius: 4px;\r\n padding: 2px 4px;\r\n font-weight: 500;\r\n font-size: 14px;\r\n place-self: center;\r\n}\r\n.blackhome-user-action p:nth-child(2) {\r\n border: 1px solid #ff4b4b;\r\n color: #ff4b4b;\r\n margin-left: 8px;\r\n}\r\n.blackhome-user-uuid {\r\n border: 1px solid #ff7600;\r\n color: #ff7600;\r\n border-radius: 4px;\r\n padding: 2px 4px;\r\n font-weight: 500;\r\n font-size: 14px;\r\n width: fit-content;\r\n width: -moz-fit-content;\r\n margin: 10px 0;\r\n}\r\n.blackhome-operator {\r\n padding: 10px;\r\n background-color: #efefef;\r\n border-radius: 6px;\r\n}\r\n.blackhome-operator-user {\r\n display: flex;\r\n}\r\n.blackhome-operator-user img {\r\n width: 35px;\r\n height: 35px;\r\n border-radius: 35px;\r\n}\r\n.blackhome-operator-user p {\r\n align-self: center;\r\n margin-left: 10px;\r\n}\r\n.blackhome-operator-user-info {\r\n margin: 10px 0;\r\n font-weight: 500;\r\n}\r\n";
const MTRegExp = {
formhash: /formhash=([0-9a-zA-Z]+)/,
uid: /uid(=|-)(\d+)/,
fontSpecial: /|<\/font>|||||align=".*?"|
[\s]*
[\s]*
/g,
ptid: /&ptid=([\d]+)/i,
pid: /&pid=([\d]+)/i,
tid: /&tid=([\d]+)/i
};
const MTUtils = {
getAvatar: (uid, size = "middle") => {
return `/uc_server/avatar.php?uid=${uid}&size=${size}&ts=1`;
},
getCurrentUID() {
let discuz_uid = _unsafeWindow.discuz_uid;
if (typeof discuz_uid === "string") {
return discuz_uid;
}
let $exit = document.querySelector(
'.sidenv_exit a[href*="uid="]'
);
if ($exit) {
let uidMatch = $exit.href.match(/uid=([0-9]+)/);
if (uidMatch) {
return uidMatch[uidMatch.length - 1];
}
}
},
async getFormHash() {
let $inputFormHashList = Array.from(
(top || globalThis).document.querySelectorAll(
"input[name=formhash]"
)
);
for (let index = 0; index < $inputFormHashList.length; index++) {
const $input = $inputFormHashList[index];
let formHash = $input.value;
if (formHash) {
return formHash;
}
}
let $anchorFormHashList = Array.from(
(top || globalThis).document.querySelectorAll(
'a[href*="formhash="]'
)
);
for (let index = 0; index < $anchorFormHashList.length; index++) {
const $anchorFormHash = $anchorFormHashList[index];
let anchorFormHashMatch = $anchorFormHash.href.match(MTRegExp.formhash);
if (anchorFormHashMatch) {
let formHash = anchorFormHashMatch[anchorFormHashMatch.length - 1];
if (formHash) {
return formHash;
}
}
}
let homeResponse = await httpx.get("/home.php?mod=spacecp", {
fetch: true,
allowInterceptConfig: false
});
if (homeResponse.status) {
let homeText = homeResponse.data.responseText;
let homeDoc = domUtils.parseHTML(homeText, true, true);
let $formhash = homeDoc.querySelector(
"input[name=formhash]"
);
if ($formhash) {
let formHash = $formhash.value;
if (utils.isNotNull(formHash)) {
return formHash;
}
}
} else {
log.error("请求个人主页获取formhash失败", homeResponse);
}
},
envIsMobile() {
return (
(_unsafeWindow.STYLEID ||
window.STYLEID ||
typeof STYLEID !== "undefined" && STYLEID) === "3"
);
},
getThreadId: (url) => {
let urlMatch = url.match(/thread-([\d]+)-|&tid=([\d]+)/i);
if (urlMatch) {
let forumIdList = urlMatch.filter(Boolean);
let forumId = forumIdList[forumIdList.length - 1];
return forumId;
}
},
getForumId(url) {
let urlMatch = url.match(/&fid=([\d]+)/i);
if (urlMatch) {
return urlMatch[urlMatch.length - 1];
}
},
getPostId(url) {
let urlMatch = url.match(/&pid=([\d]+)/i);
if (urlMatch) {
return urlMatch[urlMatch.length - 1];
}
},
getRepquote(url) {
let urlMatch = url.match(/&repquote=([\d]+)/i);
if (urlMatch) {
return urlMatch[urlMatch.length - 1];
}
}
};
const MTBlackHome = {
$data: {
cid: ""
},
init() {
this.registerMenu();
},
registerMenu() {
ElementUtils.registerLeftMenu({
name: "小黑屋",
iconColor: "#000000",
icon: "",
callback: () => {
this.showBlackHome();
}
});
},
async showBlackHome() {
let $loading = Qmsg.loading("正在获取小黑屋名单中...");
let blackListInfo = await this.getBlackListInfo("");
$loading.close();
if (!blackListInfo) {
return;
}
if (blackListInfo.data.length === 0) {
Qmsg.error("获取小黑屋名单为空");
return;
}
this.$data.cid = blackListInfo.next_cid;
let $confirm = __pops.confirm({
title: {
text: "小黑屋名单",
position: "center"
},
content: {
text: (
`
`
),
html: true
},
btn: {
ok: {
text: "下一页",
callback: async () => {
let $loading2 = Qmsg.loading("正在获取小黑屋名单中...");
log.info("下一页的cid: ", this.$data.cid);
let nextBlackListInfo2 = await this.getBlackListInfo(this.$data.cid);
$loading2.close();
if (!nextBlackListInfo2) {
return;
}
this.$data.cid = nextBlackListInfo2.next_cid;
nextBlackListInfo2.data.forEach((item) => {
let $item = this.createListViewItem(item);
$list.appendChild($item);
});
if (nextBlackListInfo2.data.length === 0) {
Qmsg.error("获取小黑屋名单为空");
} else {
Qmsg.success(`成功获取 ${nextBlackListInfo2.data.length}条数据`);
}
utils.dispatchEvent($filterInput, "input");
}
},
cancel: {
text: "关闭"
}
},
width: "88vw",
height: "82vh",
style: blackHomeCSS
});
let $list = $confirm.$shadowRoot.querySelector(
".blackhome-user-list"
);
let $filterInput = $confirm.$shadowRoot.querySelector(
".blackhome-user-filter input"
);
blackListInfo.data.forEach((item) => {
let $item = this.createListViewItem(item);
$list.appendChild($item);
});
Qmsg.success(`成功获取 ${blackListInfo.data.length}条数据`);
let isSeaching = false;
domUtils.on(
$filterInput,
["input", "propertychange"],
utils.debounce(() => {
let inputText = $filterInput.value.trim();
if (isSeaching) {
return;
}
isSeaching = true;
if (inputText == "") {
$confirm.$shadowRoot.querySelectorAll(".blackhome-user-item").forEach((item) => {
item.removeAttribute("style");
});
isSeaching = false;
return;
}
$confirm.$shadowRoot.querySelectorAll(".blackhome-user-item").forEach((item) => {
if (item.getAttribute("data-name").match(new RegExp(inputText, "ig")) || item.getAttribute("data-uid").trim().match(new RegExp(inputText, "ig")) || item.getAttribute("data-operator").match(new RegExp(inputText, "ig"))) {
item.removeAttribute("style");
} else {
item.setAttribute("style", "display:none;");
}
});
isSeaching = false;
})
);
let nextBlackListInfo = await this.getBlackListInfo(this.$data.cid);
if (!nextBlackListInfo) {
return;
}
this.$data.cid = nextBlackListInfo.next_cid;
},
async getBlackListInfo(cid = "") {
let searchParamsData = {
mod: "misc",
action: "showdarkroom",
cid,
ajaxdata: "json"
};
let response = await httpx.get(
`/forum.php?${utils.toSearchParamsStr(searchParamsData)}`,
{
headers: {
"User-Agent": utils.getRandomPCUA()
},
responseType: "json"
}
);
if (!response.status) {
return;
}
let data = utils.toJSON(response.data.responseText);
let cidSplit = data["message"].split("|");
let next_cid = cidSplit[cidSplit.length - 1];
let blackListData = utils.parseObjectToArray(data["data"]);
let new_blackListData = [];
let new_blackListData_noTime = [];
blackListData.forEach((item) => {
let date = item["dateline"].match(
/([0-9]{4}-[0-9]{1,2}-[0-9]{1,2}[\s]*[0-9]{1,2}:[0-9]{1,2})/g
);
if (date == null) {
let _time_ = parseInt((Date.now() / 1e3).toString());
let _time_after_count_ = 0;
let sec_data = item["dateline"].match(/([0-9]+|半)[\s\S]*秒前/);
let min_data = item["dateline"].match(/([0-9]+|半)[\s\S]*分钟前/);
let hour_data = item["dateline"].match(/([0-9]+|半)[\s\S]*小时前/);
let yesterday_time_data = item["dateline"].match(
/昨天[\s\S]*(\d{2}):(\d{2})/
);
let before_yesterday_time_data = item["dateline"].match(
/前天[\s\S]*(\d{2}):(\d{2})/
);
let day_data = item["dateline"].match(/([0-9]+|半)[\s\S]*天前/);
if (sec_data) {
sec_data = sec_data[sec_data.length - 1];
sec_data = sec_data.replace(/半/g, 0.5);
sec_data = parseFloat(sec_data);
_time_after_count_ = _time_ - sec_data;
} else if (min_data) {
min_data = min_data[min_data.length - 1];
min_data = min_data.replace(/半/g, 0.5);
min_data = parseFloat(min_data);
_time_after_count_ = _time_ - min_data * 60;
} else if (hour_data) {
hour_data = hour_data[hour_data.length - 1];
hour_data = hour_data.replace(/半/g, 0.5);
hour_data = parseFloat(hour_data);
_time_after_count_ = _time_ - hour_data * 60 * 60;
} else if (yesterday_time_data) {
let yesterday_hour_data = yesterday_time_data[1];
let yesterday_min_data = yesterday_time_data[2];
_time_after_count_ = _time_ - 86400 - parseInt(yesterday_hour_data) * 3600 - parseInt(yesterday_min_data) * 60;
} else if (before_yesterday_time_data) {
let before_yesterday_hour_data = before_yesterday_time_data[1];
let before_yesterday_min_data = before_yesterday_time_data[2];
_time_after_count_ = _time_ - 86400 * 2 - parseInt(before_yesterday_hour_data) * 3600 - parseInt(before_yesterday_min_data) * 60;
} else if (day_data) {
day_data = day_data[day_data.length - 1];
day_data = day_data.replace(/半/g, 0.5);
day_data = parseFloat(day_data);
_time_after_count_ = _time_ - day_data * 60 * 60 * 24;
}
item["time"] = parseInt(_time_after_count_.toString()) * 1e3;
new_blackListData = new_blackListData.concat(item);
return;
} else {
date = date[0];
}
item["time"] = utils.formatToTimeStamp(date);
new_blackListData = new_blackListData.concat(item);
});
utils.sortListByProperty(new_blackListData, "time");
utils.sortListByProperty(new_blackListData_noTime, "time", false);
new_blackListData = new_blackListData.concat(new_blackListData_noTime);
return {
next_cid,
data: new_blackListData
};
},
createListViewItem(userInfo) {
let $item = domUtils.createElement(
"div",
{
className: "blackhome-user-item",
innerHTML: (
`
${userInfo["username"]}
${userInfo["dateline"]}
${userInfo["action"]}
到期: ${userInfo["groupexpiry"]}
UID: ${userInfo["uid"]}
${userInfo["operator"]}
${userInfo["reason"]}
`
)
},
{
"data-name": userInfo.username,
"data-uid": userInfo.uid,
"data-operator": userInfo.operator,
"data-operator-uid": userInfo.operatorid
}
);
domUtils.on($item, "click", ".blackhome-user img", function() {
window.open(
`home.php?mod=space&uid=${userInfo.uid}&do=profile`,
"_blank"
);
});
domUtils.on($item, "click", ".blackhome-operator-user img", function() {
window.open(
`home.php?mod=space&uid=${userInfo.operatorid}&do=profile`,
"_blank"
);
});
return $item;
}
};
const onlineUserCSS = '.pops-alert-content{\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n.pops-alert-content > .online-user-info{\r\n text-align: center;\r\n padding: 0px 6px;\r\n}\r\n.online-user-filter input {\r\n width: -webkit-fill-available;\r\n width: -moz-available;\r\n height: 30px;\r\n margin: 8px 20px;\r\n border: 0;\r\n border-bottom: 1px solid;\r\n}\r\n.online-user-filter input:focus-within {\r\n outline: none;\r\n}\r\n.online-user-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n}\r\n.online-user-list li {\r\n margin: 18px 0;\r\n}\r\n.online-user {\r\n display: flex;\r\n margin: 2px 20px;\r\n align-items: center;\r\n}\r\n.online-user img[data-avatar] {\r\n width: 45px;\r\n height: 45px;\r\n border-radius: 45px;\r\n}\r\n.online-user-list .online-user-info {\r\n margin: 2px 14px;\r\n}\r\n.online-user-list .online-user-info p[data-name] {\r\n margin-bottom: 4px;\r\n}\r\n.online-user-list .online-user-info span[data-sf] {\r\n border-radius: 4px;\r\n padding: 2px 4px;\r\n font-weight: 500;\r\n font-size: 14px;\r\n}\r\n.online-user-list .online-user-info span[data-uid] {\r\n border: 1px solid #ff7600;\r\n color: #ff7600;\r\n border-radius: 4px;\r\n padding: 2px 4px;\r\n font-weight: 500;\r\n font-size: 14px;\r\n width: fit-content;\r\n width: -moz-fit-content;\r\n margin: 10px 0;\r\n}\r\n.online-user-list .online-user-info span[data-sf="会员"] {\r\n color: #88b500;\r\n border: 1px solid #88b500;\r\n}\r\n.online-user-list .online-user-info span[data-sf="版主"] {\r\n color: #2db5e3;\r\n border: 1px solid #2db5e3;\r\n}\r\n.online-user-list .online-user-info span[data-sf="超级版主"] {\r\n color: #e89e38;\r\n border: 1px solid #e89e38;\r\n}\r\n.online-user-list .online-user-info span[data-sf="管理员"] {\r\n color: #ff5416;\r\n border: 1px solid #ff5416;\r\n}\r\n';
const MTOnlineUser = {
$data: {},
init() {
this.registerMenu();
},
registerMenu() {
ElementUtils.registerLeftMenu({
name: "在线用户",
iconColor: "#2d92ff",
icon: "",
callback: () => {
this.showOnlineUser();
}
});
},
async showOnlineUser() {
let $loading = Qmsg.loading("正在获取在线用户名单中...");
let onlineUserInfo = await this.getOnlineUserListInfo();
$loading.close();
if (!onlineUserInfo) {
return;
}
let $alert = __pops.alert({
title: {
text: "在线用户",
position: "center"
},
content: {
text: (
`
${onlineUserInfo.totalOnline} 人在线 - ${onlineUserInfo.onlineUser} 会员${onlineUserInfo.invisibleUser == 0 ? "" : `(${onlineUserInfo.invisibleUser}隐身)`} - ${onlineUserInfo.noRegisterUser} 位游客
`
),
html: true
},
btn: {
ok: {
text: "关闭",
type: "default"
}
},
width: "88vw",
height: "82vh",
style: onlineUserCSS
});
let $list = $alert.$shadowRoot.querySelector(".online-user-list");
let $filterInput = $alert.$shadowRoot.querySelector(
".online-user-filter input"
);
onlineUserInfo.data.forEach((item) => {
let $item = this.createListViewItem(item);
$list.appendChild($item);
});
Qmsg.success(`成功获取 ${onlineUserInfo.data.length}条数据`);
let isSeaching = false;
DOMUtils.on(
$filterInput,
["propertychange", "input"],
utils.debounce(() => {
let inputText = $filterInput.value.trim();
if (isSeaching) {
return;
}
isSeaching = true;
if (inputText == "") {
$alert.$shadowRoot.querySelectorAll(".online-user-list .online-item").forEach((item) => {
item.removeAttribute("style");
});
isSeaching = false;
return;
}
$alert.$shadowRoot.querySelectorAll(".online-user-list .online-item").forEach((item) => {
if (item.getAttribute("data-name").match(new RegExp(inputText, "ig")) || item.getAttribute("data-sf").match(new RegExp(inputText, "ig")) || item.getAttribute("data-uid").match(new RegExp(inputText, "ig"))) {
item.removeAttribute("style");
} else {
item.setAttribute("style", "display:none;");
}
});
isSeaching = false;
})
);
},
async getOnlineUserListInfo() {
let searchParamsData = {
showoldetails: "yes"
};
let response = await httpx.get(
`/forum.php?${utils.toSearchParamsStr(searchParamsData)}`,
{
headers: {
"User-Agent": utils.getRandomPCUA()
}
}
);
if (!response.status) {
return;
}
let pageHTML = utils.parseFromString(
response.data.responseText,
"text/html"
);
let result = {
data: [],
totalOnline: 0,
onlineUser: 0,
noRegisterUser: 0,
invisibleUser: 0
};
let onlineList = pageHTML.querySelectorAll("#onlinelist ul li");
onlineList.forEach((item) => {
let uid = item.querySelector("a").getAttribute("href").match("uid-(.+?).html")[1];
let avatar = MTUtils.getAvatar(uid, "middle");
let name = item.querySelector("a").innerText;
let sf = "";
let space = item.querySelector("a").getAttribute("href");
let memberSrc = item.querySelector("img").src;
if (memberSrc.indexOf("online_member") != -1) {
sf = "会员";
} else if (memberSrc.indexOf("online_moderator") != -1) {
sf = "版主";
} else if (memberSrc.indexOf("online_supermod") != -1) {
sf = "超级版主";
} else if (memberSrc.indexOf("online_admin") != -1) {
sf = "管理员";
} else {
sf = "未知身份";
}
result.data.push({
uid,
avatar,
name,
sf,
space
});
});
let onlineInfo = pageHTML.querySelector("#online div.bm_h span.xs1").textContent;
result.totalOnline = utils.parseInt(
onlineInfo.match(/([0-9]*)\s*人在线/i),
0
);
result.onlineUser = utils.parseInt(
onlineInfo.match(/([0-9]*)\s*会员/i),
0
);
result.noRegisterUser = utils.parseInt(
onlineInfo.match(/([0-9]*)\s*位游客/i),
0
);
result.invisibleUser = utils.parseInt(
onlineInfo.match(/([0-9]*)\s*隐身/i),
0
);
return result;
},
createListViewItem(userInfo) {
let $item = DOMUtils.createElement(
"div",
{
className: "online-item",
innerHTML: (
`
${userInfo["name"]}
${userInfo["sf"]}
UID: ${userInfo["uid"]}
`
)
},
{
"data-name": userInfo.name,
"data-uid": userInfo.uid,
"data-sf": userInfo.sf
}
);
DOMUtils.on($item, "click", ".online-user-avatar", (event) => {
utils.preventEvent(event);
window.open(
`home.php?mod=space&uid=${userInfo.uid}&do=profile`,
"_blank"
);
});
return $item;
}
};
const MTIdentifyLinks = () => {
var clearLink, excludedTags, filter, linkMixInit, linkPack, linkify, observePage, observer, setLink, url_regexp, xpath;
url_regexp = /((https?:\/\/|www\.)[\x21-\x7e]+[\w\/]|(\w[\w._-]+\.(com|cn|org|net|info|tv|cc))(\/[\x21-\x7e]*[\w\/])?|ed2k:\/\/[\x21-\x7e]+\|\/|thunder:\/\/[\x21-\x7e]+=)/gi;
clearLink = function(a) {
var b;
a = null != (b = a.originalTarget) ? b : a.target;
if (null != a && "a" === a.localName && -1 !== a.className.indexOf("texttolink") && (b = a.getAttribute("href"), 0 !== b.indexOf("http") && 0 !== b.indexOf("ed2k://") && 0 !== b.indexOf("thunder://")))
return a.setAttribute("href", "http://" + b);
};
document.addEventListener("mouseover", clearLink);
setLink = function(a) {
if (typeof a != "object") {
return;
}
if (null != a && typeof a.parentNode !== "undefined" && typeof a.parentNode.className !== "undefined" && typeof a.parentNode.className.indexOf === "function" && -1 === a.parentNode.className.indexOf("texttolink") && "#cdata-section" !== a.nodeName) {
var b = a.textContent.replace(
url_regexp,
'$1'
);
if (a.textContent.length !== b.length) {
var c = document.createElement("span");
c.innerHTML = b;
console.log(`识别: ${c.querySelector("a")}`);
return a.parentNode.replaceChild(c, a);
}
}
};
excludedTags = "a svg canvas applet input button area pre embed frame frameset head iframe img option map meta noscript object script style textarea code".split(
" "
);
xpath = `//text()[not(ancestor::${excludedTags.join(
") and not(ancestor::"
)})]`;
filter = new RegExp(`^(${excludedTags.join("|")})$`, "i");
linkPack = function(a, b) {
var c, d;
if (b + 1e4 < a.snapshotLength) {
var e = c = b;
for (d = b + 1e4; b <= d ? c <= d : c >= d; e = b <= d ? ++c : --c)
setLink(a.snapshotItem(e));
setTimeout(function() {
return linkPack(a, b + 1e4);
}, 15);
} else
for (e = c = b, d = a.snapshotLength; b <= d ? c <= d : c >= d; e = b <= d ? ++c : --c)
setLink(a.snapshotItem(e));
};
linkify = function(a) {
a = document.evaluate(
xpath,
a,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null
);
return linkPack(a, 0);
};
observePage = function(a) {
for (a = document.createTreeWalker(
a,
NodeFilter.SHOW_TEXT,
{
acceptNode: function(a2) {
if (!filter.test(a2.parentNode.localName))
return NodeFilter.FILTER_ACCEPT;
}
},
false
); a.nextNode(); )
setLink(a.currentNode);
};
observer = new window.MutationObserver(function(a) {
var b, c;
var d = 0;
for (b = a.length; d < b; d++) {
var e = a[d];
if ("childList" === e.type) {
var g = e.addedNodes;
var f = 0;
for (c = g.length; f < c; f++) e = g[f], observePage(e);
}
}
});
linkMixInit = function() {
return linkify(document.body), observer.observe(document.body, {
childList: true,
subtree: true
});
};
var clearlinkF = function(a) {
var url = a.getAttribute("href");
if (0 !== url.indexOf("http") && 0 !== url.indexOf("ed2k://") && 0 !== url.indexOf("thunder://"))
return a.setAttribute("href", "http://" + url);
}, clearlinkE = function() {
for (var a = document.getElementsByClassName("texttolink"), b = 0; b < a.length; b++)
clearlinkF(a[b]);
};
setTimeout(clearlinkE, 1500);
setTimeout(linkMixInit, 100);
};
const MTAutoSignIn = {
$key: {
sign: "mt-sign-time"
},
init() {
this.sign();
},
checkSignInfo() {
let signInfo = this.getSignInfo();
let findValue = signInfo.find((it) => {
return it.hostName === window.location.hostname;
});
if (findValue) {
if (utils.formatTime(Date.now(), "yyyyMMdd") !== utils.formatTime(findValue.time, "yyyyMMdd")) {
return false;
}
return true;
}
return false;
},
setSignInfo() {
let signInfo = {
hostName: window.location.hostname,
time: Date.now()
};
let localSignInfo = this.getSignInfo();
let findIndex = localSignInfo.findIndex((it) => {
return it.hostName === signInfo.hostName;
});
if (findIndex !== -1) {
localSignInfo.splice(findIndex, 1);
}
localSignInfo.push(signInfo);
_GM_setValue(this.$key.sign, localSignInfo);
},
getSignInfo() {
let localSignInfo = _GM_getValue(this.$key.sign, []);
if (!Array.isArray(localSignInfo)) {
this.clearSignInfo();
return [];
}
return localSignInfo;
},
getHostNameSignInfo(hostName = window.location.hostname) {
let localSignInfo = this.getSignInfo();
return localSignInfo.find((it) => {
return it.hostName === hostName;
});
},
clearSignInfo(hostName) {
if (typeof hostName === "string") {
let signInfo = this.getSignInfo();
let findIndex = signInfo.findIndex((it) => {
return it.hostName === hostName;
});
if (findIndex !== -1) {
signInfo.splice(findIndex, 1);
}
_GM_setValue(this.$key.sign, signInfo);
} else {
_GM_deleteValue(this.$key.sign);
}
},
checkLogin() {
if (MTUtils.envIsMobile()) {
let mobile_login_exitBtn = $(
"a[href*='member.php?mod=logging&action=logout']"
);
return Boolean(mobile_login_exitBtn);
} else {
let pc_login = $("#comiis_key");
return Boolean(pc_login);
}
},
async sign() {
if (this.checkSignInfo()) {
log.info("今日已签到");
return;
}
let formHash = await MTUtils.getFormHash();
if (formHash == null) {
if ($("#comiis_picshowbox")) {
log.info("当前为评论区的看图模式 ");
return;
}
this.clearSignInfo(window.location.hostname);
Qmsg.error("自动签到:获取账号formhash失败", {
consoleLogContent: true
});
return;
}
let useFetch = Boolean(Panel.getValue("mt-auto-sign-useFetch"));
let userAgent = utils.getRandomPCUA();
let signSuccessCallBack = () => {
this.setSignInfo();
};
let signFailedCallBack = () => {
this.clearSignInfo(window.location.hostname);
};
let unknownSignContentCallback = (content) => {
let $alert = pops.alert({
title: {
text: "未知签到内容",
position: "center"
},
content: {
text: "",
html: false
},
width: "88vw",
height: "300px"
});
let $content = $alert.$shadowRoot.querySelector(
".pops-alert-content"
);
$content.innerText = content;
};
let sign_plugin = [
{
checkPluginEnableUrl: "/plugin.php?id=k_misign:sign",
async sign() {
let searchParamsData = {
operation: "qiandao",
format: "button",
formhash: formHash,
inajax: 1,
ajaxtarget: "midaben_sign"
};
let response = await httpx.get(
`/k_misign-sign.html?${utils.toSearchParamsStr(searchParamsData)}`,
{
fetch: useFetch,
headers: {
"User-Agent": userAgent
},
allowInterceptConfig: false
}
);
if (!response.status) {
Qmsg.error("签到:网络异常,请求失败", {
consoleLogContent: true
});
return;
}
signSuccessCallBack();
log.info("签到信息:", response);
let responseText = response.data.responseText;
let CDATA = utils.parseCDATA(responseText);
let CDATAElement = domUtils.parseHTML(
`${CDATA}
`,
true,
false
);
let content = domUtils.text(CDATAElement);
if (content.includes("需要先登录")) {
Qmsg.error("签到:请先登录账号", {
timeout: 3e3,
consoleLogContent: true
});
signFailedCallBack();
return;
} else if (content.includes("请稍后再试") || content.includes("您已经被列入黑名单") || content.includes("绑定手机号后才可以签到") || content.includes("您所在用户组不允许使用")) {
Qmsg.error("签到:" + content, {
timeout: 5e3
});
return;
} else if (content.includes("今日已签") || content.includes("今日已经签到")) {
Qmsg.info("签到:" + content);
return;
} else if (responseText.includes(
"您当前的访问请求当中含有非法字符,已经被系统拒绝"
)) {
Qmsg.error(
"签到: 您当前的访问请求当中含有非法字符,已经被系统拒绝",
{
timeout: 6e3
}
);
return;
} else if (useFetch && "location" in utils.toJSON(responseText)) {
Qmsg.success("签到: 签到成功");
return;
}
let signIn_con = CDATAElement.querySelector(".con");
let signIn_line = CDATAElement.querySelector(".line");
if (signIn_con && signIn_line) {
let conMatch = domUtils.text(signIn_con).match(/([0-9]+)金币/);
let lineMatch = domUtils.text(signIn_line).match(/([0-9]+)/);
let con = conMatch[conMatch.length - 1];
let line = lineMatch[lineMatch.length - 1];
log.success(`金币${con},排名${line}`);
Qmsg.info(
`
`,
{
timeout: 4e3,
isHTML: true
}
);
return;
}
unknownSignContentCallback(responseText);
}
},
{
checkPluginEnableUrl: "/plugin.php?id=dsu_paulsign:sign",
async sign() {
let searchParamsData = {
id: "dsu_paulsign:sign",
operation: "qiandao",
infloat: 1,
inajax: 1
};
let response = await httpx.post(
`/plugin.php?${utils.toSearchParamsStr(searchParamsData)}`,
{
data: {
formhash: formHash,
qdxq: "kx",
qdmode: 3,
todaysay: "",
fastreply: 0
},
processData: true,
fetch: useFetch,
headers: {
"User-Agent": userAgent,
"Content-Type": "application/x-www-form-urlencoded"
},
allowInterceptConfig: false
}
);
if (!response.status) {
Qmsg.error("签到:网络异常,请求失败", {
consoleLogContent: true
});
return;
}
signSuccessCallBack();
log.info("签到信息:", response);
let responseText = response.data.responseText;
if (responseText.includes("签到成功")) {
Qmsg.success("签到:签到成功");
return;
}
if (responseText.includes("今日已经签到")) {
Qmsg.info("签到:您今日已经签到,请明天再来!");
return;
}
unknownSignContentCallback(responseText);
}
}
];
for (let index = 0; index < sign_plugin.length; index++) {
const signPluginItem = sign_plugin[index];
let checkResponse = await httpx.get(signPluginItem.checkPluginEnableUrl, {
fetch: useFetch,
headers: {
"User-Agent": utils.getRandomPCUA()
},
allowInterceptConfig: false
});
if (!checkResponse.status) {
log.error("签到:检查签到插件是否启用的请求失败", checkResponse);
continue;
}
let pluginDoc = domUtils.parseHTML(
checkResponse.data.responseText,
true,
true
);
if (pluginDoc.querySelector("#messagetext") || checkResponse.data.responseText.includes("插件不存在或已关闭")) {
log.error(
`插件:${signPluginItem.checkPluginEnableUrl} 未启用或不存在`
);
continue;
}
await signPluginItem.sign();
break;
}
}
};
const MTRouter = {
isKMiSign() {
return window.location.pathname.startsWith("/k_misign-sign.html");
},
isPost() {
return window.location.pathname.startsWith("/thread-") || window.location.pathname.startsWith("/forum.php") && window.location.search.startsWith("?mod=viewthread");
},
isPage() {
return Boolean(window.location.pathname.match(/^\/page-([0-9]+).html/g));
},
isGuide() {
return window.location.pathname.startsWith("/forum.php") && window.location.search.startsWith("?mod=guide");
},
isPlate() {
return Boolean(
window.location.pathname.match(/\/forum-[0-9]{1,2}-[0-9]{1,2}.html/g)
);
},
isSearch() {
return window.location.pathname.startsWith("/search.php");
},
isSpace() {
return window.location.pathname.startsWith("/home.php") && window.location.search.startsWith("?mod=space");
},
isMySpace() {
return window.location.pathname.startsWith("/home.php") && window.location.search.startsWith("?mod=space&do=profile&mycenter");
},
isSpaceWithAt() {
return window.location.pathname.startsWith("/space-uid-");
},
isForumList() {
return window.location.pathname.startsWith("/forum.php") && window.location.search.startsWith("?forumlist");
},
isMessage() {
return window.location.pathname.startsWith("/home.php") && window.location.search.startsWith("?mod=space&do=notice");
},
isMessageList() {
return window.location.pathname.startsWith("/home.php") && window.location.search.startsWith("?mod=space&do=pm");
},
isPointsMall() {
return window.location.pathname.startsWith(
"/keke_integralmall-keke_integralmall.html"
) || window.location.pathname.startsWith("/plugin.php") && window.location.search.startsWith("?id=keke_integralmal");
},
isPostPublish() {
return window.location.pathname.startsWith("/forum.php") && window.location.search.startsWith("?mod=post");
},
isPostPublish_voting() {
return window.location.pathname.startsWith("/forum.php") && window.location.search.includes("&special=1") || window.location.search.includes("&fid=42");
},
isPostPublish_edit() {
return this.isPostPublish() && window.location.search.includes("&action=edit");
},
isPostPublish_newthread() {
return this.isPostPublish() && window.location.search.includes("&action=newthread");
},
isPostPublish_reply() {
return this.isPostPublish() && window.location.search.includes("&action=reply");
}
};
const optimizationCSS$1 = '#comiis_foot_menu_beautify {\r\n position: fixed;\r\n display: inline-flex;\r\n z-index: 90;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: 100%;\r\n height: 48px;\r\n overflow: hidden;\r\n align-content: center;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n#comiis_foot_menu_beautify_big {\r\n position: fixed;\r\n display: inline-flex;\r\n flex-direction: column;\r\n z-index: 92;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: 100%;\r\n min-height: 120px;\r\n overflow: hidden;\r\n align-content: center;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n#comiis_foot_menu_beautify input.bg_e.f_c::-webkit-input-placeholder {\r\n padding-left: 10px;\r\n color: #999;\r\n}\r\n#comiis_foot_menu_beautify input.bg_e.f_c::-moz-input-placeholder {\r\n padding-left: 10px;\r\n color: #999;\r\n}\r\n#comiis_foot_menu_beautify .reply_area ul li a {\r\n display: block;\r\n width: 22px;\r\n height: 22px;\r\n padding: 4px 8px;\r\n margin: 8px 0;\r\n position: relative;\r\n}\r\n#comiis_foot_menu_beautify .reply_area ul {\r\n display: inline-flex;\r\n align-content: center;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n#comiis_foot_menu_beautify .reply_area,\r\n#comiis_foot_menu_beautify .reply_area ul {\r\n width: 100%;\r\n}\r\n#comiis_foot_menu_beautify .reply_area li a i {\r\n width: 22px;\r\n height: 22px;\r\n line-height: 22px;\r\n font-size: 22px;\r\n}\r\n#comiis_foot_menu_beautify .reply_area li a span {\r\n position: absolute;\r\n display: block;\r\n font-size: 10px;\r\n height: 14px;\r\n line-height: 14px;\r\n padding: 0 6px;\r\n right: -8px;\r\n top: 4px;\r\n overflow: hidden;\r\n border-radius: 20px;\r\n}\r\n#comiis_foot_menu_beautify li[data-attr="回帖"] input {\r\n border: transparent;\r\n border-radius: 15px;\r\n height: 30px;\r\n width: 100%;\r\n}\r\n#comiis_foot_menu_beautify_big .comiis_smiley_box {\r\n padding: 6px 6px 0;\r\n}\r\n#comiis_foot_menu_beautify_big .reply_area {\r\n margin: 10px 0 5px 0;\r\n}\r\n#comiis_foot_menu_beautify_big .reply_area ul {\r\n display: inline-flex;\r\n align-content: center;\r\n justify-content: center;\r\n align-items: flex-end;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="回帖"] {\r\n width: 75vw;\r\n margin-right: 15px;\r\n}\r\n#comiis_foot_menu_beautify_big .reply_user_content {\r\n width: 75vw;\r\n word-wrap: break-word;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n margin: 8px 10px;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="发表"] .fastpostform_new {\r\n text-align: center;\r\n margin-bottom: 28px;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="发表"] .fastpostform_new i {\r\n font-size: 22px;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="发表"] input {\r\n width: 60px;\r\n height: 30px;\r\n border: transparent;\r\n color: #fff;\r\n background: #d1c9fc;\r\n border-radius: 30px;\r\n margin-bottom: 6px;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="发表"] input[data-text="true"] {\r\n background: #7a61fb;\r\n}\r\n#comiis_foot_menu_beautify_big li[data-attr="回帖"] textarea {\r\n padding: 10px 10px 10px 10px;\r\n border: transparent;\r\n border-radius: 6px;\r\n min-height: 70px;\r\n max-height: 180px;\r\n background: #e9e8ec;\r\n overflow-y: auto;\r\n width: -webkit-fill-available;\r\n width: -moz-available;\r\n}\r\n#comiis_foot_menu_beautify .reply_area li[data-attr="回帖"] {\r\n width: 65%;\r\n margin: 0 3%;\r\n text-align: center;\r\n}\r\n#comiis_foot_menu_beautify .reply_area li:not(first-child) {\r\n width: 7%;\r\n text-align: -webkit-center;\r\n text-align: center;\r\n}\r\n#comiis_foot_menu_beautify_big .other_area {\r\n width: 100%;\r\n text-align: center;\r\n}\r\n#comiis_foot_menu_beautify_big .other_area .menu_icon a {\r\n margin: 0 20px;\r\n}\r\n#comiis_foot_menu_beautify_big .other_area i {\r\n font-size: 24px;\r\n}\r\n#comiis_foot_menu_beautify_big .other_area #comiis_insert_ubb_tab i {\r\n font-size: 16px;\r\n}\r\n#comiis_foot_menu_beautify_big .other_area .menu_body {\r\n background: #f4f4f4;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .other_area\r\n .menu_body\r\n .comiis_smiley_box\r\n .comiis_optimization {\r\n max-height: 140px;\r\n overflow-y: auto;\r\n flex-direction: column;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .other_area\r\n .menu_body\r\n .comiis_smiley_box\r\n .bqbox_t {\r\n background: #fff;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .other_area\r\n .menu_body\r\n .comiis_smiley_box\r\n .bqbox_t\r\n ul#comiis_smilies_key\r\n li\r\n a.bg_f.b_l.b_r {\r\n background: #f4f4f4 !important;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .menu_body\r\n #comiis_pictitle_tab\r\n #comiis_pictitle_key {\r\n display: -webkit-box;\r\n top: 0;\r\n left: 0;\r\n height: 42px;\r\n line-height: 42px;\r\n overflow: hidden;\r\n overflow-x: auto;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .menu_body\r\n #comiis_pictitle_tab\r\n #comiis_pictitle_key\r\n li {\r\n padding: 0 10px;\r\n}\r\n#comiis_foot_menu_beautify_big\r\n .menu_body\r\n #comiis_insert_ubb_tab\r\n .comiis_input_style,\r\n#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab .comiis_upbox {\r\n height: 140px;\r\n overflow-y: auto;\r\n flex-direction: column;\r\n}\r\n#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab #filedata_hello,\r\n#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab #filedata_kggzs,\r\n#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab #filedata_mt,\r\n#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab #filedata_z4a {\r\n display: none;\r\n}\r\n@media screen and (max-width: 350px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 14.5%;\r\n }\r\n}\r\n@media screen and (min-width: 350px) and (max-width: 400px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 12.5%;\r\n }\r\n}\r\n@media screen and (min-width: 400px) and (max-width: 450px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 11%;\r\n }\r\n}\r\n@media screen and (min-width: 450px) and (max-width: 500px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 10%;\r\n }\r\n}\r\n@media screen and (min-width: 500px) and (max-width: 550px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 9.5%;\r\n }\r\n}\r\n@media screen and (min-width: 550px) and (max-width: 600px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 9%;\r\n }\r\n}\r\n@media screen and (min-width: 600px) and (max-width: 650px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 8.5%;\r\n }\r\n}\r\n@media screen and (min-width: 650px) and (max-width: 700px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 8%;\r\n }\r\n}\r\n@media screen and (min-width: 700px) and (max-width: 750px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 7.5%;\r\n }\r\n}\r\n@media screen and (min-width: 750px) and (max-width: 800px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 7%;\r\n }\r\n}\r\n@media screen and (min-width: 800px) and (max-width: 850px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 6.5%;\r\n }\r\n}\r\n@media screen and (min-width: 850px) and (max-width: 1200px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 6%;\r\n }\r\n}\r\n@media screen and (min-width: 1200px) {\r\n .comiis_bqbox .bqbox_c li {\r\n width: 4.5%;\r\n }\r\n}\r\n#imglist_settings button {\r\n font-size: 13.333px;\r\n color: #9baacf;\r\n outline: 0;\r\n border: none;\r\n height: 35px;\r\n width: 80px;\r\n border-radius: 10px;\r\n box-shadow: 0.3rem 0.3rem 0.6rem #c8d0e7, -0.2rem -0.2rem 0.5rem #fff;\r\n font-weight: 800;\r\n line-height: 40px;\r\n background: #efefef;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n#imglist_settings button:active {\r\n box-shadow: inset 0.2rem 0.2rem 0.5rem #c8d0e7,\r\n inset -0.2rem -0.2rem 0.5rem #fff !important;\r\n color: #638ffb !important;\r\n}\r\n\r\n#comiis_head .header_y {\r\n display: flex;\r\n align-content: center;\r\n align-items: center;\r\n justify-content: flex-end;\r\n height: 100%;\r\n}\r\n#comiis_head .header_y input {\r\n border: transparent;\r\n background: 0 0;\r\n text-align: center;\r\n margin: 0 5px;\r\n}\r\n#comiis_head .header_y input[value="删除"] {\r\n color: #d00;\r\n}\r\n#comiis_head .header_y input[value="保存"] {\r\n color: #b0ff6a;\r\n}\r\n#comiis_head .header_y input[value="保存草稿"] {\r\n color: #f90;\r\n}\r\n#comiis_head .header_y input[value="发表"] {\r\n color: #b0ff6a;\r\n}\r\n#comiis_head .header_y input[value="回复"] {\r\n color: #b0ff6a;\r\n}\r\n#comiis_post_tab {\r\n color: #000;\r\n}\r\n#comiis_pictitle_tab #imglist input {\r\n display: none;\r\n}\r\n\r\n.comiis_post_imglist .delImg {\r\n position: absolute;\r\n top: -5px;\r\n left: -5px;\r\n}\r\n\r\n.comiis_post_imglist .p_img a {\r\n float: left;\r\n height: 36px;\r\n}\r\n#imglist .p_img a {\r\n float: left;\r\n height: 36px;\r\n}\r\n#imglist .del a {\r\n padding: 0;\r\n}\r\n';
const MTEditorSmilies = () => {
return [
{
"[呵呵]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq001.gif",
"[撇嘴]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq002.gif",
"[色]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq003.gif",
"[发呆]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq004.gif",
"[得意]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq005.gif",
"[流泪]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq006.gif",
"[害羞]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq007.gif",
"[闭嘴]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq008.gif",
"[睡]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq009.gif",
"[大哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq010.gif",
"[尴尬]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq011.gif",
"[发怒]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq012.gif",
"[调皮]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq013.gif",
"[呲牙]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq014.gif",
"[惊讶]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq015.gif",
"[难过]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq016.gif",
"[酷]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq017.gif",
"[冷汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq018.gif",
"[抓狂]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq019.gif",
"[吐]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq020.gif",
"[偷笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq021.gif",
"[可爱]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq022.gif",
"[白眼]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq023.gif",
"[傲慢]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq024.gif",
"[饥饿]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq025.gif",
"[困]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq026.gif",
"[惊恐]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq027.gif",
"[流汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq028.gif",
"[憨笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq029.gif",
"[装逼]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq030.gif",
"[奋斗]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq031.gif",
"[咒骂]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq032.gif",
"[疑问]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq033.gif",
"[嘘]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq034.gif",
"[晕]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq035.gif",
"[折磨]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq036.gif",
"[衰]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq037.gif",
"[骷髅]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq038.gif",
"[敲打]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq039.gif",
"[再见]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq040.gif",
"[擦汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq041.gif",
"[抠鼻]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq042.gif",
"[鼓掌]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq043.gif",
"[糗大了]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq044.gif",
"[坏笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq045.gif",
"[左哼哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq046.gif",
"[右哼哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq047.gif",
"[哈欠]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq048.gif",
"[鄙视]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq049.gif",
"[委屈]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq050.gif",
"[快哭了]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq051.gif",
"[阴脸]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq052.gif",
"[亲亲]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq053.gif",
"[吓]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq054.gif",
"[可怜]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq055.gif",
"[眨眼睛]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq056.gif",
"[笑哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq057.gif",
"[dogeQQ]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq058.gif",
"[泪奔]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq059.gif",
"[无奈]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq060.gif",
"[托腮]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq061.gif",
"[卖萌]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq062.png",
"[斜眼笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq063.gif",
"[喷血]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq064.gif",
"[惊喜]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq065.gif",
"[骚扰]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq066.gif",
"[小纠结]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq067.gif",
"[我最美]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq068.gif",
"[菜刀]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq069.gif",
"[西瓜]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq070.gif",
"[啤酒]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq071.gif",
"[篮球]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq072.gif",
"[乒乓]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq073.gif",
"[咖啡]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq074.gif",
"[饭]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq075.gif",
"[猪]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq076.gif",
"[玫瑰]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq077.gif",
"[凋谢]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq078.gif",
"[示爱]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq079.gif",
"[爱心]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq080.gif",
"[心碎]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq081.gif",
"[蛋糕]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq082.gif",
"[闪电]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq083.gif",
"[炸弹]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq084.gif",
"[刀]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq085.gif",
"[足球]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq086.gif",
"[瓢虫]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq087.gif",
"[便便]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq088.gif",
"[月亮]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq089.gif",
"[太阳]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq090.gif",
"[礼物]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq091.gif",
"[抱抱]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq092.gif",
"[喝彩]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq93.gif",
"[祈祷]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq94.gif",
"[棒棒糖]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq95.gif",
"[药]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq96.gif",
"[赞]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq097.gif",
"[差劲]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq098.gif",
"[握手]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq099.gif",
"[胜利]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq100.gif",
"[抱拳]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq101.gif",
"[勾引]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq102.gif",
"[拳头]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq103.gif",
"[爱你]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq105.gif",
"[NO]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq106.gif",
"[OK]": "https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq107.gif"
},
{
"[#呵呵]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_1.png",
"[#滑稽]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_10.png",
"[#吐舌]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_3.png",
"[#哈哈]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_2.png",
"[#啊]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_23.png",
"[#酷]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_22.png",
"[#怒]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_13.png",
"[#开心]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_39.png",
"[#汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_14.png",
"[#泪]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_16.png",
"[#黑线]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_15.png",
"[#鄙视]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_21.png",
"[#不高兴]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_12.png",
"[#真棒]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_17.png",
"[#钱]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_40.png",
"[#疑问]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_26.png",
"[#阴险]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_20.png",
"[#吐]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_34.png",
"[#咦]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_41.png",
"[#委屈]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_29.png",
"[#花心]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_6.png",
"[#呼~]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_42.png",
"[#激动]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_5.png",
"[#冷]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_43.png",
"[#可爱]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_4.png",
"[#What?]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_25.png",
"[#勉强]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_38.png",
"[#狂汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_24.png",
"[#酸爽]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_27.png",
"[#乖]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_8.png",
"[#雅美蝶]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_28.png",
"[#睡觉]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_31.png",
"[#惊哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_19.png",
"[#哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_44.png",
"[#笑尿]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_32.png",
"[#惊讶]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_30.png",
"[#小乖]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_7.png",
"[#喷]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_18.png",
"[#抠鼻]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_33.png",
"[#捂嘴笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_9.png",
"[#你懂的]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_11.png",
"[#犀利]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_35.png",
"[#小红脸]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_36.png",
"[#懒得理]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_37.png",
"[#爱心]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_45.png",
"[#心碎]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_46.png",
"[#玫瑰]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_47.png",
"[#礼物]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_48.png",
"[#彩虹]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_49.png",
"[#太阳]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_50.png",
"[#月亮]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_51.png",
"[#钱币]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_52.png",
"[#咖啡]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_53.png",
"[#蛋糕]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_54.png",
"[#大拇指]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_55.png",
"[#胜利]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_56.png",
"[#爱你]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_57.png",
"[#OK]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_58.png",
"[#弱]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_59.png",
"[#沙发]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_60.png",
"[#纸巾]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_61.png",
"[#香蕉]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_62.png",
"[#便便]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_63.png",
"[#药丸]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_64.png",
"[#红领巾]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_65.png",
"[#蜡烛]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_66.png",
"[#三道杠]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_67.png",
"[#音乐]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_68.png",
"[#灯泡]": "https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_69.png"
},
{
"[doge]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/1.png",
"[doge思考]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/2.png",
"[doge再见]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/3.png",
"[doge生气]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/4.png",
"[doge气哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/5.png",
"[doge笑哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/7.png",
"[doge调皮]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/6.png",
"[doge啊哈]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/8.png",
"[doge原谅TA]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/9.png",
"[miao]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/10.png",
"[miao思考]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/11.png",
"[miao拜拜]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/12.png",
"[miao生气]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/13.png",
"[miao气哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/14.png",
"[二哈]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/15.png",
"[摊手]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/19.png",
"[w并不简单]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/20.png",
"[w滑稽]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/21.png",
"[w色]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/22.png",
"[w爱你]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/23.png",
"[w拜拜]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/24.png",
"[w悲伤]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/25.png",
"[w鄙视]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/26.png",
"[w馋嘴]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/27.png",
"[w冷汗]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/28.png",
"[w打哈欠]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/29.png",
"[w打脸]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/30.png",
"[w敲打]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/31.png",
"[w生病]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/32.png",
"[w闭嘴]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/33.png",
"[w鼓掌]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/34.png",
"[w哈哈]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/35.png",
"[w害羞]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/36.png",
"[w呵呵]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/37.png",
"[w黑线]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/38.png",
"[w哼哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/39.png",
"[w调皮]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/40.png",
"[w可爱]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/41.png",
"[w可怜]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/42.png",
"[w酷]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/43.png",
"[w困]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/44.png",
"[w懒得理你]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/45.png",
"[w流泪]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/46.png",
"[w怒]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/47.png",
"[w怒骂]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/48.png",
"[w钱]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/49.png",
"[w亲亲]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/50.png",
"[w傻眼]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/51.png",
"[w便秘]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/52.png",
"[w失望]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/53.png",
"[w衰]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/54.png",
"[w睡觉]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/55.png",
"[w思考]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/56.png",
"[w开心]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/57.png",
"[w色舔]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/58.png",
"[w偷笑]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/59.png",
"[w吐]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/60.png",
"[w抠鼻]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/61.png",
"[w委屈]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/62.png",
"[w笑哭]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/63.png",
"[w嘻嘻]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/64.png",
"[w嘘]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/65.png",
"[w阴险]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/66.png",
"[w疑问]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/67.png",
"[w抓狂]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/70.png",
"[w晕]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/69.png",
"[w右哼哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/68.png",
"[w左哼哼]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/71.png",
"[w肥皂]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/77.png",
"[w奥特曼]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/78.png",
"[w草泥马]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/79.png",
"[w兔子]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/80.png",
"[w熊猫]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/81.png",
"[w猪头]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/82.png",
"[w→_→]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/83.png",
"[w给力]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/84.png",
"[w囧]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/85.png",
"[w萌]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/86.png",
"[w神马]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/87.png",
"[w威武]": "https://cdn-bbs.mt2.cn/static/image/smiley/doge/88.png"
}
];
};
const GlobalImageDelete = [];
class MTEditorImageBed {
option;
$data = {
STORAGE_KEY: "mt-image-bed-upload-history"
};
constructor(option) {
this.option = option;
GlobalImageDelete.push({
id: this.option.id,
callback: this.option.delImageEvent.bind(this)
});
this.addTab();
domUtils.on(
`.comiis_post_imglist[data-chartbed="${this.option.name}"] .up_btn a`,
"click",
async (event) => {
let result = await this.option.uploadBtnClickEvent(event);
if (result) {
$(
`.comiis_post_imglist[data-chartbed="${this.option.name}"] input[type="file"]`
).click();
}
}
);
domUtils.on(
`.comiis_post_imglist[data-chartbed="${this.option.name}"] input[type="file"]`,
"change",
async (event) => {
let $file = event.target;
let clear_input = () => {
$file.value = "";
};
let upload_callback = async (uploadFiles) => {
let uploadInfo = await this.option.fileChangeEvent(
event,
uploadFiles
);
clear_input();
if (uploadInfo.success) {
uploadInfo.data.forEach((imageInfo) => {
this.addImage(imageInfo);
let $thumbImage = this.createImageBtnElement(
"插入",
imageInfo.url
);
this.setImageBtnDeleteEvent($thumbImage, imageInfo);
domUtils.append(
`.comiis_post_imglist[data-chartbed="${this.option.name}"]`,
$thumbImage
);
});
}
};
if ($file.files && $file.files.length) {
let chooseImage = $file.files;
if (Panel.getValue("mt-image-bed-watermark-enable")) {
let $loading = Qmsg.loading("处理水印中...");
let needUploadImageArray = [];
let needUploadImageFileArray = [];
await Promise.all(
Array.from($file.files).map(async (item, index) => {
if (item.type === "image/gif") {
let image_base64 = await utils.parseFileToBase64(item);
needUploadImageArray.push(image_base64);
needUploadImageFileArray.push(item);
} else {
Qmsg.info(`添加水印 ${index + 1}/${chooseImage.length}`);
var watermark = new window.Watermark();
await watermark.setFile(item);
watermark.addText({
text: [
Panel.getValue("mt-image-bed-watermark-text")
],
color: Panel.getValue(
"mt-image-bed-watermark-text-color"
),
fontSize: Panel.getValue(
"mt-image-bed-watermark-font-size"
),
globalAlpha: Panel.getValue(
"mt-image-bed-watermark-font-opacity"
),
xMoveDistance: Panel.getValue(
"mt-image-bed-watermark-left-right-margin"
),
yMoveDistance: Panel.getValue(
"mt-image-bed-watermark-top-bottom-margin"
),
rotateAngle: Panel.getValue(
"mt-image-bed-watermark-rotate"
)
});
needUploadImageArray.push(watermark.render("png"));
needUploadImageFileArray.push(
utils.parseBase64ToFile(
watermark.render("png"),
"WaterMark_" + item.name
)
);
}
})
);
$loading.close();
chooseImage = needUploadImageFileArray;
if (Panel.getValue("mt-image-bed-watermark-autoAddWaterMark")) {
await upload_callback(chooseImage);
} else {
__pops.confirm({
title: {
text: "水印预览",
position: "center"
},
content: {
text: (
`
${needUploadImageArray.map((item) => {
return (
`

`
);
}).join("\n")}
`
),
html: true
},
btn: {
ok: {
text: "继续上传",
async callback(eventDetails, event2) {
eventDetails.close();
await upload_callback(chooseImage);
}
},
close: {
callback(details, event2) {
details.close();
clear_input();
}
},
cancel: {
callback(eventDetails, event2) {
eventDetails.close();
clear_input();
}
}
},
width: "88vw",
height: "80vh",
style: (
`
.upload-image-water {
}
.upload-image-water img{
width: 100%;
}
`
)
});
}
} else {
await upload_callback(chooseImage);
}
}
}
);
}
addTab() {
let $picture_key = $("#comiis_pictitle_key");
let $history = $picture_key.querySelector(
"a[data-type='history']"
);
let tabHTML = (
`
${this.option.name}
`
);
if (!$history) {
let $history_parent = domUtils.createElement("li");
$history = domUtils.createElement(
"a",
{
href: "javascript:;",
className: "comiis-picture-tab",
innerHTML: `历史图片`
},
{ "data-type": "history" }
);
domUtils.on($history, "click", () => {
this.initHistoryUploadImageList();
});
domUtils.append($history_parent, $history);
domUtils.append($picture_key, $history_parent);
}
domUtils.before($history.parentElement, tabHTML);
let $box = $("#comiis_pictitle_tab .bqbox_t");
let $historyBox = Array.from(
$$("#comiis_pictitle_tab .comiis_upbox")
).find((item) => Boolean(item.querySelector("#imglist_history")));
if (!$historyBox) {
$historyBox = domUtils.createElement(
"div",
{
className: "comiis_upbox bg_f cl",
innerHTML: (
`
`
)
},
{
style: "display: none;"
}
);
domUtils.before($box, $historyBox);
$historyBox = Array.from(
$$("#comiis_pictitle_tab .comiis_upbox")
).find((item) => Boolean(item.querySelector("#imglist_history")));
}
domUtils.before(
$historyBox,
`
`
);
}
createImageBtnElement(labelName, url) {
let $li = domUtils.createElement("li", {
innerHTML: (
`
${labelName}
`
)
});
return $li;
}
initHistoryUploadImageList() {
let $imglist_history = $(
"#comiis_pictitle_tab #imglist_history"
);
$imglist_history.innerHTML = "";
let $fragment = document.createDocumentFragment();
this.getAllImage().forEach((item) => {
let $thumbImage = this.createImageBtnElement(
item.labelName,
item.data.url
);
this.setHistoryImageBtnDeleteEvent($thumbImage, item);
$fragment.appendChild($thumbImage);
});
$imglist_history.appendChild($fragment);
}
setImageBtnDeleteEvent($ele, data) {
let $delImg = $ele.querySelector(".delImg");
domUtils.on($delImg, "click", async (event) => {
let result = await this.option.delImageEvent(event, data);
if (result) {
let deleteStorageStatus = this.deleteImage(this.option.id, data);
if (deleteStorageStatus) {
domUtils.remove($ele);
}
}
});
}
setHistoryImageBtnDeleteEvent($ele, data) {
let $delImg = $ele.querySelector(".delImg");
domUtils.on($delImg, "click", async (event) => {
let findValue = GlobalImageDelete.find((item) => item.id === data.id);
if (!findValue) {
return;
}
let result = await findValue.callback(event, data.data);
if (result) {
let deleteStorageStatus = this.deleteImage(data.id, data.data);
if (deleteStorageStatus) {
domUtils.remove($ele);
}
}
});
}
addImage(info) {
let allData = _GM_getValue(this.$data.STORAGE_KEY, []);
allData.push({
id: this.option.id,
name: this.option.name,
labelName: this.option.labelName,
data: info
});
_GM_setValue(this.$data.STORAGE_KEY, allData);
}
getAllImage() {
let allData = _GM_getValue(this.$data.STORAGE_KEY, []);
return allData;
}
deleteImage(id, data) {
let allData = this.getAllImage();
let findIndex = allData.findIndex(
(item) => item.id === id && JSON.stringify(item.data) === JSON.stringify(data)
);
if (findIndex != -1) {
allData.splice(findIndex, 1);
_GM_setValue(this.$data.STORAGE_KEY, allData);
return true;
} else {
return false;
}
}
}
const MTEditorImageBed_Hello = {
$data: {
get account() {
return Panel.getValue("mt-image-bed-hello-account");
},
get password() {
return Panel.getValue("mt-image-bed-hello-password");
},
get token() {
return Panel.getValue("mt-image-bed-hello-token");
}
},
$code: {
401: "未登录或授权失败",
403: "管理员关闭了接口功能或没有该接口权限",
429: "超出请求配额,请求受限",
500: "服务端出现异常"
},
$config: {
base_url: "https://www.helloimg.com/api/v1",
TAG: "Hello图床:"
},
$tabConfig: {
id: "www.helloimg.com",
name: "Hello图床",
labelName: "hello"
},
init() {
const that = this;
new MTEditorImageBed({
id: this.$tabConfig.id,
name: this.$tabConfig.name,
labelName: this.$tabConfig.labelName,
async uploadBtnClickEvent(event) {
return await that.checkLogin();
},
async fileChangeEvent(event, fileList) {
let uploadList = [];
let $loading = Qmsg.loading("上传中...");
let flag = true;
for (let index = 0; index < Array.from(fileList).length; index++) {
const file = Array.from(fileList)[index];
let result = await that.uploadImage(file);
if (result) {
uploadList.push({
url: result.data.links.url,
data: result.data
});
flag = flag && true;
} else {
flag = flag && false;
}
}
$loading.close();
return {
success: flag,
data: uploadList
};
},
storageSaveCallBack(data) {
return data.data;
},
async delImageEvent(event, data) {
let isLogin = await that.checkLogin();
if (isLogin) {
let $loading = Qmsg.loading("正在删除图片...");
let deleteResult = await that.deleteImage(data.data.key) ?? false;
$loading.close();
return deleteResult;
} else {
return false;
}
}
});
},
async checkLogin() {
if (!this.$data.account) {
Qmsg.error(`${this.$config.TAG}请先配置账号`);
return false;
}
if (!this.$data.password) {
Qmsg.error(`${this.$config.TAG}请先配置密码`);
return false;
}
if (!this.$data.token) {
Qmsg.error(`${this.$config.TAG}请先配置token`);
return false;
}
return true;
},
async uploadImage(imageFile) {
let formData = new FormData();
formData.append("file", imageFile);
formData.append("permission", "0");
formData.append("strategy_id", "0");
formData.append("album_id", "0");
let response = await httpx.post(`${this.$config.base_url}/upload`, {
data: formData,
headers: {
Accept: "application/json",
Authorization: `Bearer ${this.$data.token}`,
"User-Agent": utils.getRandomPCUA(),
Referer: `${this.$config.base_url}/`,
Origin: this.$config.base_url
},
allowInterceptConfig: false
});
if (!response.status) {
log.error(response);
Qmsg.error(this.$config.TAG + "网络异常,上传图片失败");
return;
}
if (response.data.status in this.$code) {
log.error(response);
Qmsg.error(this.$config.TAG + this.$code[response.data.status]);
return;
}
let data = utils.toJSON(response.data.responseText);
log.info(data);
if (!data.status) {
Qmsg.error(this.$config.TAG + data.message);
return;
}
Qmsg.success(this.$config.TAG + "上传成功");
let file_reader = new FileReader();
file_reader.readAsDataURL(imageFile);
return await new Promise((resolve) => {
file_reader.onload = function() {
let imageUri = this.result;
let result = {
imageUri,
data: data.data
};
resolve(result);
};
});
},
async deleteImage(imageKey) {
let response = await httpx.delete(
this.$config.base_url + "/images/" + imageKey,
{
timeout: 15e3,
headers: {
Accept: "application/json",
Authorization: `Bearer ${this.$data.token}`,
"User-Agent": utils.getRandomPCUA(),
Referer: `${this.$config.base_url}/`,
Origin: this.$config.base_url
},
allowInterceptConfig: false
}
);
if (response.data.status in this.$code) {
Qmsg.error(this.$config.TAG + this.$code[response.data.status]);
return false;
}
let data = utils.toJSON(response.data.responseText);
if (!data.status) {
Qmsg.error(this.$config.TAG + data.message);
return false;
}
Qmsg.success(this.$config.TAG + "删除成功");
return true;
}
};
const MTEditorImageBed_MT = {
$data: {
csrf_token: null
},
$config: {
TAG: "MT图床:",
base_url: "https://img.binmt.cc"
},
$tabConfig: {
id: "img.binmt.cc",
name: "MT图床",
labelName: "mt"
},
init() {
const that = this;
new MTEditorImageBed({
id: this.$tabConfig.id,
name: this.$tabConfig.name,
labelName: this.$tabConfig.labelName,
async uploadBtnClickEvent(event) {
return await that.checkLogin();
},
async fileChangeEvent(event, fileList) {
let uploadList = [];
let $loading = Qmsg.loading("上传中...");
let flag = true;
for (let index = 0; index < Array.from(fileList).length; index++) {
const file = Array.from(fileList)[index];
let result = await that.uploadImage(file);
if (result) {
uploadList.push({
url: result.data.links.url,
data: result.data
});
flag = flag && true;
} else {
flag = flag && false;
}
}
$loading.close();
return {
success: flag,
data: uploadList
};
},
storageSaveCallBack(data) {
return data.data;
},
async delImageEvent(event, data) {
return true;
}
});
},
async checkLogin() {
if (!this.$data.csrf_token) {
let $loading = Qmsg.loading("正在获取CSRF Token中...");
let csrf_token = await this.getCSRFToken();
$loading.close();
if (!csrf_token) {
return false;
}
this.$data.csrf_token = csrf_token;
}
return true;
},
async getCSRFToken() {
let response = await httpx.get(this.$config.base_url, {
allowInterceptConfig: false,
headers: {
"User-Agent": utils.getRandomPCUA(),
Referer: this.$config.base_url + "/",
Origin: this.$config.base_url
}
});
if (!response.status) {
Qmsg.error(this.$config.TAG + "获取CSRF Token失败,网络异常");
return;
}
let doc = domUtils.parseHTML(response.data.responseText, true, true);
let metaCSRFToken = doc.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
if (!metaCSRFToken) {
return;
}
log.info("获取的CSRF token:", metaCSRFToken);
Qmsg.success(this.$config.TAG + "获取CSRF Token成功");
return metaCSRFToken;
},
async uploadImage(imageFile) {
let formData = new FormData();
formData.append("strategy_id", "2");
formData.append("file", imageFile);
let response = await httpx.post(`${this.$config.base_url}/upload`, {
data: formData,
headers: {
Accept: "application/json, text/javascript, */*; q=0.01",
"User-Agent": utils.getRandomAndroidUA(),
Origin: this.$config.base_url,
pragma: "no-cache",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
Referer: this.$config.base_url + "/",
Pragma: "no-cache",
"x-csrf-token": this.$data.csrf_token,
"X-Requested-With": "XMLHttpRequest"
},
allowInterceptConfig: false
});
if (!response.status) {
log.error(response);
Qmsg.error(this.$config.TAG + "网络异常,上传图片失败");
return;
}
let data = utils.toJSON(response.data.responseText);
log.info(data);
if (!data.status) {
log.error(response);
Qmsg.error(this.$config.TAG + data.message || JSON.stringify(data));
return;
}
Qmsg.success(this.$config.TAG + "上传成功");
let file_reader = new FileReader();
file_reader.readAsDataURL(imageFile);
return await new Promise((resolve) => {
file_reader.onload = function() {
let imageUri = this.result;
let result = {
imageUri,
data: data.data
};
resolve(result);
};
});
}
};
const MTQuickUBB = () => {
return {
rainbow1: {
key: "转普通彩虹",
value: "",
isFunc: true,
num: 1
},
rainbow2: {
key: "转黑白彩虹",
value: "",
isFunc: true,
num: 2
},
rainbow3: {
key: "转黑红彩虹",
value: "",
isFunc: true,
num: 3
},
rainbow4: {
key: "转蓝绿彩虹",
value: "",
isFunc: true,
num: 4
},
size: {
key: "大小",
value: "[size=][/size]",
tagL: "=",
tagR: "]",
L: "[size=]",
R: "[/size]",
cursorL: "[size=",
cursorLength: 6,
quickUBBReplace: "[size=14]replace[/size]"
},
color: {
key: "颜色",
value: "[color=][/color]",
tagL: "=",
tagR: "]",
L: "[color=]",
R: "[/color]",
cursorL: "[color=",
cursorLength: 7,
quickUBBReplace: "[color=#000]replace[/color]"
},
b: {
key: "加粗",
value: "[b][/b]",
tagL: "]",
tagR: "[",
L: "[b]",
R: "[/b]",
cursorR: "[/b]",
cursorLength: 4,
quickUBBReplace: "[b]replace[/b]"
},
u: {
key: "下划线",
value: "[u][/u]",
tagL: "]",
tagR: "[",
L: "[u]",
R: "[/u]",
cursorR: "[/u]",
cursorLength: 4,
quickUBBReplace: "[u]replace[/u]"
},
i: {
key: "倾斜",
value: "[i][/i]",
tagL: "]",
tagR: "[",
L: "[i]",
R: "[/i]",
cursorR: "[/i]",
cursorLength: 4,
quickUBBReplace: "[i]replace[/i]"
},
s: {
key: "中划线",
value: "[s][/s]",
tagL: "]",
tagR: "[",
L: "[s]",
R: "[/s]",
cursorR: "[/s]",
cursorLength: 4,
quickUBBReplace: "[s]replace[/s]"
},
lineFeed: {
key: "换行",
value: "[*]",
L: "",
R: "[*]",
cursorL: "[*]",
cursorLength: 3,
quickUBBReplace: "replace[*]"
},
longHorizontalLine: {
key: "水平线",
value: "[hr]",
L: "",
R: "[hr]",
cursorL: "[hr]",
cursorLength: 4,
quickUBBReplace: "replace[hr]"
},
link: {
key: "链接",
value: "[url=][/url]",
tagL: "=",
tagR: "]",
L: "[url=]",
R: "[/url]",
cursorL: "[url=",
cursorLength: 5,
quickUBBReplace: "[url=replace]replace[/url]"
},
hide: {
key: "隐藏",
value: "[hide]\n[/hide]",
tagL: "]",
tagR: "[",
L: "[hide]",
R: "[/hide]",
cursorR: "[/hide]",
cursorLength: 7,
quickUBBReplace: "[hide]replace\n[/hide]"
},
quote: {
key: "引用",
value: "[quote][/quote]",
tagL: "]",
tagR: "[",
L: "[quote]",
R: "[/quote]",
cursorR: "[/quote]",
cursorLength: 8,
quickUBBReplace: "[quote]replace[/quote]"
},
email: {
key: "邮件",
value: "[email=][/email]",
tagL: "=",
tagR: "]",
L: "[email=]",
R: "[/email]",
cursorL: "[email=",
cursorLength: 7,
quickUBBReplace: "[email=replace]replace[/email]"
}
};
};
const MTUBB_Rainbow = (num, text) => {
if (text == "") {
return "";
}
var wr_text = text;
var wr_code, wr_rgb, r, g, b, i, j, istep;
r = 0;
g = 0;
b = 0;
istep = 0;
wr_code = "";
if (num == 1) {
istep = 40;
r = 255;
i = 1;
j = 0;
do {
if (wr_text.charCodeAt(j) != 32) {
if (g + istep < 256) {
if (i == 1) g += istep;
} else if (i == 1) {
i = 2;
g = 255;
}
if (r - istep > -1) {
if (i == 2) r -= istep;
} else if (i == 2) {
i = 3;
r = 0;
}
if (b + istep < 256) {
if (i == 3) b += istep;
} else if (i == 3) {
i = 4;
b = 255;
}
if (g - istep > -1) {
if (i == 4) g -= istep;
} else if (i == 4) {
i = 5;
g = 0;
}
if (r + istep < 256) {
if (i == 5) r += istep;
} else if (i == 5) {
i = 6;
r = 255;
}
if (b - istep > -1) {
if (i == 6) b -= istep;
} else if (i == 6) {
i = 1;
b = 0;
}
wr_rgb = "";
wr_rgb +=
parseInt(r).toString(16).length == 1 ? (
0 + parseInt(r).toString(16)
) : (
parseInt(r).toString(16)
);
wr_rgb +=
parseInt(g).toString(16).length == 1 ? (
0 + parseInt(g).toString(16)
) : (
parseInt(g).toString(16)
);
wr_rgb +=
parseInt(b).toString(16).length == 1 ? (
0 + parseInt(b).toString(16)
) : (
parseInt(b).toString(16)
);
wr_rgb = wr_rgb.toUpperCase();
wr_code += `[color=#${wr_rgb}]${wr_text.charAt(j)}[/color]`;
} else {
wr_code += wr_text.charAt(j);
}
j++;
} while (j < wr_text.length);
} else if (num == 2) {
istep = 255 / wr_text.length;
for (i = 1; i < wr_text.length + 1; i++) {
if (wr_text.charCodeAt(i - 1) != 32) {
r += istep;
g += istep;
b += istep;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
wr_rgb = "";
wr_rgb +=
parseInt(r).toString(16).length == 1 ? (
0 + parseInt(r).toString(16)
) : (
parseInt(r).toString(16)
);
wr_rgb +=
parseInt(g).toString(16).length == 1 ? (
0 + parseInt(g).toString(16)
) : (
parseInt(g).toString(16)
);
wr_rgb +=
parseInt(b).toString(16).length == 1 ? (
0 + parseInt(b).toString(16)
) : (
parseInt(b).toString(16)
);
wr_rgb = wr_rgb.toUpperCase();
wr_code += `[color=#${wr_rgb}]${wr_text.charAt(i - 1)}[/color]`;
} else {
wr_code += wr_text.charAt(i - 1);
}
}
} else if (num == 3) {
istep = 255 / wr_text.length;
for (i = 1; i < wr_text.length + 1; i++) {
if (wr_text.charCodeAt(i - 1) != 32) {
r += istep;
g = 29;
b = 36;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
wr_rgb = "";
wr_rgb +=
parseInt(r).toString(16).length == 1 ? (
0 + parseInt(r).toString(16)
) : (
parseInt(r).toString(16)
);
wr_rgb +=
parseInt(g).toString(16).length == 1 ? (
0 + parseInt(g).toString(16)
) : (
parseInt(g).toString(16)
);
wr_rgb +=
parseInt(b).toString(16).length == 1 ? (
0 + parseInt(b).toString(16)
) : (
parseInt(b).toString(16)
);
wr_rgb = wr_rgb.toUpperCase();
wr_code += `[color=#${wr_rgb}]${wr_text.charAt(i - 1)}[/color]`;
} else {
wr_code += wr_text.charAt(i - 1);
}
}
} else if (num == 4) {
istep = 255 / wr_text.length;
for (i = 1; i < wr_text.length + 1; i++) {
if (wr_text.charCodeAt(i - 1) != 32) {
r = 0;
g = 174;
b += istep;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
wr_rgb = "";
wr_rgb +=
parseInt(r).toString(16).length == 1 ? (
0 + parseInt(r).toString(16)
) : (
parseInt(r).toString(16)
);
wr_rgb +=
parseInt(g).toString(16).length == 1 ? (
0 + parseInt(g).toString(16)
) : (
parseInt(g).toString(16)
);
wr_rgb +=
parseInt(255 - b).toString(16).length == 1 ? (
0 + parseInt(255 - b).toString(16)
) : (
parseInt(255 - b).toString(16)
);
wr_rgb = wr_rgb.toUpperCase();
wr_code += `[color=#${wr_rgb}]${wr_text.charAt(i - 1)}[/color]`;
} else {
wr_code += wr_text.charAt(i - 1);
}
}
}
return wr_code;
};
const ExtendJQueryFn = function() {
_unsafeWindow.$.fn.extend({
insertAtCaret: function(myValue) {
var $t = _unsafeWindow.$(this)[0];
if (document.selection) {
this.focus();
var sel = document.selection.createRange();
sel.text = myValue;
this.focus();
} else if ($t.selectionStart || $t.selectionStart == "0") {
var startPos = $t.selectionStart;
var endPos = $t.selectionEnd;
var scrollTop = $t.scrollTop;
$t.value = $t.value.substring(0, startPos) + myValue + $t.value.substring(endPos, $t.value.length);
this.focus();
$t.selectionStart = startPos + myValue.length;
$t.selectionEnd = startPos + myValue.length;
$t.scrollTop = scrollTop;
} else {
this.value += myValue;
this.focus();
}
},
selectRange: function(start, end) {
if (end === void 0) {
end = start;
}
return this.each(function() {
if ("selectionStart" in this) {
this.selectionStart = start;
this.selectionEnd = end;
} else if (this.setSelectionRange) {
this.setSelectionRange(start, end);
} else if (this.createTextRange) {
var range = this.createTextRange();
range.collapse(true);
range.moveEnd("character", end);
range.moveStart("character", start);
range.select();
}
});
},
getCursorPosition: function() {
var el = _unsafeWindow.$(this)[0];
var pos = 0;
if ("selectionStart" in el) {
pos = el.selectionStart;
} else if ("selection" in document) {
el.focus();
var Sel = document.selection.createRange();
var SelLength = document.selection.createRange().text.length;
Sel.moveStart("character", -el.value.length);
pos = Sel.text.length - SelLength;
}
return pos;
},
moveCursorInCenterByText: function(leftTextFlag, rightTextFlag) {
var el = _unsafeWindow.$(this)[0];
var el_text = el.value;
for (let i = el.selectionStart - 1; i > 0; i--) {
let LText = el_text[i - 1];
let currentText = el_text[i];
if (LText == leftTextFlag && currentText == rightTextFlag) {
this.selectRange(i);
break;
}
}
},
moveCursorToCenterByTextWithLeft: function(leftMatchText, _length_) {
var el = _unsafeWindow.$(this)[0];
var el_text = el.value;
for (let index = el.selectionStart - 1; index > 0; index--) {
let lTexts = el_text.substring(index - _length_, index);
if (lTexts == leftMatchText) {
this.selectRange(index);
break;
}
}
},
moveCursorToCenterByTextWithRight: function(rightMatchText, _length_) {
var el = _unsafeWindow.$(this)[0];
var el_text = el.value;
for (let i = el.selectionStart - 1; i > 0; i--) {
let rTexts = el_text.substring(i, i + _length_);
if (rTexts == rightMatchText) {
this.selectRange(i + _length_);
break;
}
}
}
});
};
let error_code = {
1: {
error_match: "抱歉,您填写的内容包含敏感词而无法提交",
popup_text: "抱歉,您填写的内容包含敏感词而无法提交"
},
2: {
error_match: "抱歉,管理员设置了本版块发表于 30 天以前的主题自动关闭,不再接受新回复",
popup_text: "抱歉,管理员设置了本版块发表于 30 天以前的主题自动关闭,不再接受新回复"
},
3: {
error_match: "抱歉,本主题已关闭,不再接受新内容",
popup_text: "抱歉,本主题已关闭,不再接受新内容"
},
4: {
error_match: "抱歉,管理员设置了本版块发表于 30 天以前的主题自动关闭,不再接受新回复",
popup_text: "抱歉,管理员设置了本版块发表于 30 天以前的主题自动关闭,不再接受新回复"
},
5: {
error_match: "抱歉,您的帖子小于 10 个字符的限制",
popup_text: "抱歉,您的帖子小于 10 个字符的限制"
}
};
let tempReplyBtnNode = null;
const MTEditorOptimizationNormal = {
$data: {
isUBBCodeInsertClick: false,
db: new Utils.indexedDB("mt_reply_record", "input_text"),
forum_action: null,
get tid() {
return MTUtils.getThreadId(window.location.href);
}
},
$el: {
$like: null,
$btn_submit: null,
$input: null,
$form: null,
$fastpostsubmit: null
},
init() {
log.info(`编辑器优化-简略版`);
addStyle(optimizationCSS$1);
this.overridePageEditor();
},
overridePageEditor() {
let $old_commentIcon = document.querySelector(
"#comiis_foot_memu .comiis_flex li:nth-child(2)"
);
let $old_linkIcon = document.querySelector(
"#comiis_foot_memu .comiis_flex li:nth-child(3)"
);
let $old_collectIcon = document.querySelector(
"#comiis_foot_memu .comiis_flex li:nth-child(4)"
);
this.$el.$form = document.querySelector("#fastpostform");
this.$data.forum_action = this.$el.$form.getAttribute("action");
let forum_serialize = domUtils.serialize(this.$el.$form);
let forum_url = document.querySelector("#fastpostform .header_y a").href;
domUtils.remove("#needmessage[name='message']");
domUtils.remove("#imglist");
domUtils.remove("#fastpostsubmitline");
domUtils.remove("#fastpostsubmit");
let $footMenu = document.querySelector("#comiis_foot_memu");
domUtils.hide($footMenu, false);
let smiliesList = MTEditorSmilies();
let first_smilies = Object.keys(smiliesList[0]).map((key) => {
let smilies_url = smiliesList[0][key];
return (
`
`
);
});
let second_smilies = Object.keys(smiliesList[1]).map((key) => {
let smilies_url = smiliesList[1][key];
return (
`
`
);
});
let third_smilies = Object.keys(smiliesList[2]).map((key) => {
let smilies_url = smiliesList[2][key];
return (
`
`
);
});
domUtils.after(
$footMenu,
`