MT论坛效果增强,如自动签到、自动展开帖子、滚动加载评论、显示UID、自定义屏蔽、手机版小黑屋、编辑器优化、在线用户查看、便捷式图床、自定义用户标签、积分商城商品上架提醒等
// ==UserScript== // @name 【移动端】MT论坛优化 // @namespace https://greasyfork.org/zh-CN/scripts/401359 // @version 2025.2.18 // @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+E1MMCy6RgbjiE6UGKAnYP###5WccaGGAi96bSLi/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+OvldQeirOTk5VUdsOQDm6FsmLwgh6dnZ2a816DkAU8RMKEwIGZ2dnb2BZwATdq5Klw7l5OQkUgDmEkLmq6zExUwUAUEQYikAmYSQF03kF3dFZQQIIWMoAGsIIRNV1uFiJoqAKIovcABM1KGsrnAAW###MnkOgMk6lNUdDgBrxEwmzwEwWYeyusMBYI2YyeQ5ACbrUFZ3OACsETOZvF8AWL3a+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/[email protected]/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/@whitesev/[email protected]/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/@whitesev/[email protected]/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/[email protected]/dist/index.umd.js // @require https://fastly.jsdelivr.net/npm/[email protected]/dist/viewer.min.js // @require https://fastly.jsdelivr.net/npm/@highlightjs/[email protected]/highlight.min.js // @resource HljsCSS https://fastly.jsdelivr.net/npm/[email protected]/styles/github-dark.min.css // @resource ViewerCSS https://fastly.jsdelivr.net/npm/[email protected]/dist/viewer.min.css // @connect * // @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, Viewer, hljs) { 'use strict'; var __defProp = Object.defineProperty; var __getOwnPropNames = Object.getOwnPropertyNames; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var require_entrance_001 = __commonJS({ "entrance-CnzUYzGj.js"(exports, module) { var _a; var _GM = /* @__PURE__ */ (() => typeof GM != "undefined" ? GM : void 0)(); var _GM_deleteValue = /* @__PURE__ */ (() => typeof GM_deleteValue != "undefined" ? GM_deleteValue : void 0)(); var _GM_getResourceText = /* @__PURE__ */ (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)(); var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)(); var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)(); var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)(); var _GM_unregisterMenuCommand = /* @__PURE__ */ (() => typeof GM_unregisterMenuCommand != "undefined" ? GM_unregisterMenuCommand : void 0)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)(); var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)(); var _monkeyWindow = /* @__PURE__ */ (() => window)(); const HttpxCookieManager = { $data: { /** 是否启用 */ get enable() { return PopsPanel.getValue("httpx-use-cookie-enable"); }, /** 是否使用document.cookie */ get useDocumentCookie() { return PopsPanel.getValue("httpx-use-document-cookie"); }, cookieRule: [ { key: "httpx-cookie-bbs.binmt.cc", hostname: /bbs.binmt.cc/g } ] }, /** * 补充cookie末尾分号 */ fixCookieSplit(str) { if (utils.isNotNull(str) && !str.trim().endsWith(";")) { str += ";"; } return str; }, /** * 合并两个cookie */ 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); }, /** * 处理cookie * @param details * @returns */ 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 = PopsPanel.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; } } }; 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" } }; (function(global, factory) { if (typeof exports === "object" && typeof module !== "undefined") { module.exports = factory(); } else { global = typeof globalThis !== "undefined" ? globalThis : global || self; global.Watermark = factory(global.Watermark); } })(typeof window !== "undefined" ? window : void 0, function(AnotherWatermark) { let Watermark = function() { }; CanvasRenderingContext2D.prototype.letterSpacingText = function(text, x, y, letterSpacing) { var context = this; var canvas = context.canvas; if (!letterSpacing && canvas) { letterSpacing = parseFloat(window.getComputedStyle(canvas).letterSpacing); } if (!letterSpacing) { return this.fillText(text, x, y); } var arrText = text.split(""); var align = context.textAlign || "left"; var originWidth = context.measureText(text).width; var actualWidth = originWidth + letterSpacing * (arrText.length - 1); if (align == "center") { x = x - actualWidth / 2; } else if (align == "right") { x = x - actualWidth; } context.textAlign = "left"; arrText.forEach(function(letter) { var letterWidth = context.measureText(letter).width; context.fillText(letter, x, y); x = x + letterWidth + letterSpacing; }); context.textAlign = align; }; CanvasRenderingContext2D.prototype.wrapText = function(text, x, y, maxWidth, lineHeight, stroke) { if (typeof text != "string" || typeof x != "number" || typeof y != "number") { return; } var context = this; var canvas = context.canvas; if (typeof maxWidth == "undefined") { maxWidth = canvas && canvas.width || 300; } if (typeof lineHeight == "undefined") { lineHeight = canvas && parseInt(window.getComputedStyle(canvas).lineHeight) || parseInt(window.getComputedStyle(document.body).lineHeight); } var arrText = text.split(""); var line = ""; for (var n = 0; n < arrText.length; n++) { var testLine = line + arrText[n]; var metrics = context.measureText(testLine); var testWidth = metrics.width; if (testWidth > maxWidth && n > 0) { if (stroke) { context.strokeText(line, x, y, canvas.width); } else { context.fillText(line, x, y); } line = arrText[n]; y += lineHeight; } else { line = testLine; } } if (stroke) { context.strokeText(line, x, y, canvas.width); } else { context.fillText(line, x, y); } }; CanvasRenderingContext2D.prototype.fillTextVertical = function(text, x, y) { var context = this; context.canvas; var arrText = text.split(""); var arrWidth = arrText.map(function(letter) { return context.measureText(letter).width; }); var align = context.textAlign; var baseline = context.textBaseline; if (align == "left") { x = x + Math.max.apply(null, arrWidth) / 2; } else if (align == "right") { x = x - Math.max.apply(null, arrWidth) / 2; } if (baseline == "bottom" || baseline == "alphabetic" || baseline == "ideographic") { y = y - arrWidth[0] / 2; } else if (baseline == "top" || baseline == "hanging") { y = y + arrWidth[0] / 2; } context.textAlign = "center"; context.textBaseline = "middle"; arrText.forEach(function(letter, index) { var letterWidth = arrWidth[index]; var code = letter.charCodeAt(0); if (code <= 256) { context.translate(x, y); context.rotate(90 * Math.PI / 180); context.translate(-x, -y); } else if (index > 0 && text.charCodeAt(index - 1) < 256) { y = y + arrWidth[index - 1] / 2; } context.fillText(letter, x, y); context.setTransform(1, 0, 0, 1, 0, 0); var letterWidth = arrWidth[index]; y = y + letterWidth; }); context.textAlign = align; context.textBaseline = baseline; }; function loadFile(file) { let fileReader = new FileReader(); return new Promise((resolve) => { fileReader.onloadend = async function(event) { resolve(event); }; fileReader.readAsDataURL(file); }); } function loadImage(src) { let image = new Image(); return new Promise((resolve) => { image.onload = () => { resolve(image); }; image.src = src; }); } function checkInArrayByPos(arrayData, x, y) { let flag = false; Array.from(arrayData).forEach((item) => { if (item["x"] == x && item["y"] == y) { flag = true; return; } }); return flag; } function getRandValue(arr) { if (arr instanceof Array) { return arr[Math.floor(Math.random() * arr.length)]; } else { return arr; } } Watermark.prototype.setFile = function(file) { let that = this; return new Promise(async (resolve) => { try { var fileReader = await loadFile(file); await that.setImage(fileReader.target.r###lt); resolve(true); } catch (error) { resolve(false); } }); }; Watermark.prototype.setImage = function(src) { this.dataUrl = src; let that = this; return new Promise(async (res) => { var image = await loadImage(src); that.sizes = { width: image.width, height: image.height }; var canvas = document.createElement("canvas"); canvas.width = that.sizes.width; canvas.height = that.sizes.height; var ctx = canvas.getContext("2d"); ctx.drawImage(image, 0, 0); image = null; that.canvas = canvas; res(true); }); }; Watermark.prototype.hasImage = function() { return !!this.dataUrl; }; Watermark.prototype.getSize = function() { return this.sizes; }; Watermark.prototype.clearMark = function() { let that = this; if (typeof that.canvas === "undefined") { return; } function _clearMark_() { var ctx = that.canvas.getContext("2d"); ctx.clearRect(0, 0, that.canvas.width, that.canvas.height); var w = that.canvas.width; var h = that.canvas.height; that.canvas.width = w; that.canvas.height = h; ctx.beginPath(); var image = new Image(); image.src = that.dataUrl; ctx.drawImage(image, 0, 0); image = null; } _clearMark_(); }; Watermark.prototype.addText = function(opts) { var options = { text: ["Call By waterMark.addText"], fontSize: "6vw", fontFamily: "Microsoft Yahei", color: "#000000", textAlign: "center", /* 描边 */ stroke: false, globalAlpha: 0.7, /* -360 ~ 360 */ rotateAngle: 50, /* 必须大于0 */ maxWidth: 100, /* 必须大于0 */ xMoveDistance: 30, /* 必须大于0 */ yMoveDistance: 30 }; for (let key in options) { if (typeof opts[key] !== "undefined") { options[key] = opts[key]; } } options.maxWidth = parseInt(options.maxWidth) > 0 ? options.maxWidth : 1; options.xMoveDistance = parseInt(options.xMoveDistance) > 0 ? options.xMoveDistance : 1; options.yMoveDistance = parseInt(options.yMoveDistance) > 0 ? options.yMoveDistance : 1; var ctx = this.canvas.getContext("2d"); var fontSize = options.fontSize; fontSize = fontSize.toString(); if (~fontSize.indexOf("vw")) { fontSize = (this.sizes.width / 100 * parseInt(fontSize)).toFixed(0); } fontSize = parseInt(fontSize); ctx.font = fontSize + "px " + options.fontFamily; ctx.fillStyle = options.color; ctx.textAlign = options.textAlign; ctx.globalAlpha = options.globalAlpha; let canvasWidth = this.sizes.width, canvasHeight = this.sizes.height; let rotateAngle = options.rotateAngle * Math.PI / 180; let xMoveDistance = options.xMoveDistance; let yMoveDistance = options.yMoveDistance; let maxWidth = options.maxWidth; let lineHeight = fontSize; let pos = []; for (var i = canvasWidth / 2; i < canvasWidth; i += xMoveDistance) { for (var j = canvasHeight / 2; j < canvasHeight; j += yMoveDistance) { if (!checkInArrayByPos(pos, i, j)) { pos = pos.concat({ x: i, y: j }); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.translate(i, j); ctx.rotate(rotateAngle); ctx.wrapText( getRandValue(options.text), 0, 0, maxWidth, lineHeight, options.stroke ); } } for (var k = canvasHeight / 2; k > 0; k -= yMoveDistance) { if (!checkInArrayByPos(pos, i, k)) { pos = pos.concat({ x: i, y: k }); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.translate(i, k); ctx.rotate(rotateAngle); ctx.wrapText( getRandValue(options.text), 0, 0, maxWidth, lineHeight, options.stroke ); } } } for (var i = canvasWidth / 2; i > 0; i -= xMoveDistance) { for (var j = canvasHeight / 2; j < canvasHeight; j += yMoveDistance) { if (!checkInArrayByPos(pos, i, j)) { pos = pos.concat({ x: i, y: j }); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.translate(i, j); ctx.rotate(rotateAngle); ctx.wrapText( getRandValue(options.text), 0, 0, maxWidth, lineHeight, options.stroke ); } } for (var k = canvasHeight / 2; k > 0; k -= yMoveDistance) { if (!checkInArrayByPos(pos, i, k)) { pos = pos.concat({ x: i, y: k }); ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.translate(i, k); ctx.rotate(rotateAngle); ctx.wrapText( getRandValue(options.text), 0, 0, maxWidth, lineHeight, options.stroke ); } } } }; Watermark.prototype.addPixelText = function(opts) { var options = { text: "像素文字水印", /* 像素文字 */ big: { fontSize: 150, fontFamily: "微软雅黑", textAlign: "center", rotateAngle: 0, /* 描边 */ stroke: false }, /* 绘制像素的文字 */ small: { fontSize: 10, fontFamily: "微软雅黑", color: "#000", textAlign: "center", globalAlpha: 0.7 } }; for (let key in options) { if (typeof opts[key] !== "undefined") { options[key] = opts[key]; } } var ctx = this.canvas.getContext("2d"); var tmpCanvas = document.createElement("canvas"); var tmpctx = tmpCanvas.getContext("2d"); tmpCanvas.width = this.sizes.width; tmpCanvas.height = this.sizes.height; tmpctx.font = options.big.fontSize + "px " + options.big.fontFamily; tmpctx.textAlign = options.big.textAlign; tmpctx.textBaseline = "middle"; tmpctx.translate(tmpCanvas.width / 2, tmpCanvas.height / 2); tmpctx.rotate(options.big.rotateAngle * Math.PI / 180); tmpctx.translate(-tmpCanvas.width / 2, -tmpCanvas.height / 2); if (options.big.stroke) { tmpctx.strokeText( options.text, tmpCanvas.width / 2, tmpCanvas.height / 2, tmpCanvas.width ); } else { tmpctx.fillText(options.text, tmpCanvas.width / 2, tmpCanvas.height / 2); } var textArray = options.text.split(""); var textPixleInfo = tmpctx.getImageData( 0, 0, tmpCanvas.width, tmpCanvas.height ); var pixelArray = []; for (var i = 0; i < tmpCanvas.height; i += options.small.fontSize) { for (var j = 0; j < tmpCanvas.width; j += options.small.fontSize) { var index = j + i * tmpCanvas.width; var a = textPixleInfo.data[index * 4 + 3]; if (a > 128) { pixelArray.push({ text: getRandValue(textArray), x: j, y: i }); } } } ctx.font = options.small.fontSize + "px " + options.small.fontFamily; ctx.fillStyle = options.small.color; ctx.textAlign = options.small.textAlign; ctx.textBaseline = "middle"; ctx.globalAlpha = options.small.globalAlpha; pixelArray.forEach((item) => { ctx.fillText(item.text, item.x, item.y); }); }; Watermark.prototype.addImage = function(opts) { if (opts.imageArray == null) { alert("参数缺少imageArray"); return false; } if (opts.imageArray.length === 0) { alert("参数imageArray不能为空"); return false; } let options = { imageArray: [], /* 里面为水印Image对象 */ width: 50, /* 必须大于0 */ height: 50, /* 必须大于0 */ globalAlpha: 0.5, rotateAngle: 0, xMoveDistance: 70, /* 必须大于0 */ yMoveDistance: 70 /* 必须大于0 */ }; for (let key in options) { if (typeof opts[key] !== "undefined") { options[key] = opts[key]; } } options.width = parseInt(options.width) > 0 ? options.width : 1; options.height = parseInt(options.height) > 0 ? options.height : 1; options.xMoveDistance = parseInt(options.xMoveDistance) > 0 ? options.xMoveDistance : 1; options.yMoveDistance = parseInt(options.yMoveDistance) > 0 ? options.yMoveDistance : 1; let ctx = this.canvas.getContext("2d"); let waterImageCanvasArray = []; let waterImageCanvasDiagonal = parseInt( Math.sqrt(options.width * options.width + options.height * options.height) ); let canvasWidth = this.sizes.width, canvasHeight = this.sizes.height; let rotateAngle = options.rotateAngle * Math.PI / 180; let xMoveDistance = options.xMoveDistance; let yMoveDistance = options.yMoveDistance; let centerDrawLeftPosX = canvasWidth / 2 - waterImageCanvasDiagonal / 2; let centerDrawLeftPosY = canvasHeight / 2 - waterImageCanvasDiagonal / 2; let waterDrawPosX = (waterImageCanvasDiagonal - options.width) / 2; let waterDrawPosY = (waterImageCanvasDiagonal - options.height) / 2; Array.from(options.imageArray).forEach((item) => { var waterImageCanvas = document.createElement("canvas"); var waterctx = waterImageCanvas.getContext("2d"); waterImageCanvas.width = waterImageCanvasDiagonal; waterImageCanvas.height = waterImageCanvasDiagonal; waterctx.globalAlpha = options.globalAlpha; waterctx.translate( waterImageCanvasDiagonal / 2, waterImageCanvasDiagonal / 2 ); waterctx.rotate(rotateAngle); waterctx.translate( -waterImageCanvasDiagonal / 2, -waterImageCanvasDiagonal / 2 ); waterctx.drawImage( item, waterDrawPosX, waterDrawPosY, options.width, options.height ); waterImageCanvasArray = waterImageCanvasArray.concat(waterImageCanvas); }); function randomArrayData(array_data) { return array_data[Math.floor(Math.random() * array_data.length)]; } ctx.setTransform(1, 0, 0, 1, 0, 0); let pos = []; for (let i = centerDrawLeftPosX; i < canvasWidth; i += xMoveDistance) { for (let j = centerDrawLeftPosY; j < canvasHeight; j += yMoveDistance) { if (!checkInArrayByPos(pos, i, j)) { pos = pos.concat({ x: i, y: j }); ctx.drawImage( randomArrayData(waterImageCanvasArray), i, j ); } } for (let k = centerDrawLeftPosY; k > -Math.abs(waterImageCanvasDiagonal); k -= yMoveDistance) { if (!checkInArrayByPos(pos, i, k)) { pos = pos.concat({ x: i, y: k }); ctx.drawImage(randomArrayData(waterImageCanvasArray), i, k); } } } for (let i = centerDrawLeftPosX; i > -Math.abs(waterImageCanvasDiagonal); i -= xMoveDistance) { for (let j = centerDrawLeftPosY; j < canvasHeight; j += yMoveDistance) { if (!checkInArrayByPos(pos, i, j)) { pos = pos.concat({ x: i, y: j }); ctx.drawImage(randomArrayData(waterImageCanvasArray), i, j); } } for (let k = centerDrawLeftPosY; k > -Math.abs(waterImageCanvasDiagonal); k -= yMoveDistance) { if (!checkInArrayByPos(pos, i, k)) { pos = pos.concat({ x: i, y: k }); ctx.drawImage(randomArrayData(waterImageCanvasArray), i, k); } } } }; Watermark.prototype.getPreview = function() { return this.dataUrl; }; Watermark.prototype.render = function(type) { type = type === "png" ? "png" : "jpeg"; return this.canvas.toDataURL("image/" + type); }; Watermark.prototype.renderBlob = function() { let that = this; return new Promise((res) => { that.canvas.toBlob(function(blob) { res(window.URL.createObjectURL(blob)); }); }); }; Watermark.prototype.noConflict = function() { if (window.Watermark) { delete window.Watermark; } if (AnotherWatermark) { window.Watermark = AnotherWatermark; } return Watermark; }; return Watermark; }); const CommonUtil = { /** * 添加屏蔽CSS * @param args * @example * addBlockCSS("") * addBlockCSS("","") * addBlockCSS(["",""]) */ 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;}`); }, /** * 设置GM_getResourceText的style内容 * @param resourceMapData 资源数据 * @example * setGMResourceCSS({ * keyName: "ViewerCSS", * url: "https://example.com/example.css", * }) */ setGMResourceCSS(resourceMapData) { let cssText = typeof _GM_getResourceText === "function" ? _GM_getResourceText(resourceMapData.keyName) : ""; if (typeof cssText === "string" && cssText) { addStyle(cssText); } else { CommonUtil.loadStyleLink(resourceMapData.url); } }, /** * 添加<link>标签 * @param url * @example * loadStyleLink("https://example.com/example.css") */ async loadStyleLink(url) { let $link = document.createElement("link"); $link.rel = "stylesheet"; $link.type = "text/css"; $link.href = url; domUtils.ready(() => { document.head.appendChild($link); }); }, /** * 添加<script>标签 * @param url * @example * loadStyleLink("https://example.com/example.js") */ 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); }); }, /** * 将url修复,例如只有search的链接修复为完整的链接 * * 注意:不包括http转https * @param url 需要修复的链接 * @example * 修复前:`/xxx/xxx?ss=ssss` * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss` * @example * 修复前:`//xxx/xxx?ss=ssss` * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss` * @example * 修复前:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss` * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss` * @example * 修复前:`xxx/xxx?ss=ssss` * 修复后:`https://xxx.xxx.xxx/xxx/xxx?ss=ssss` */ fixUrl(url) { url = url.trim(); if (url.match(/^http(s|):\/\//i)) { return url; } else { if (!url.startsWith("/")) { url += "/"; } url = window.location.origin + url; return url; } }, /** * http转https * @param url 需要修复的链接 * @example * 修复前: * 修复后: * @example * 修复前: * 修复后: */ fixHttps(url) { if (url.startsWith("https://")) { return url; } if (!url.startsWith("http://")) { return url; } let urlObj = new URL(url); urlObj.protocol = "https:"; return urlObj.toString(); } }; const _SCRIPT_NAME_ = "【移动端】MT论坛优化"; const utils = Utils.noConflict(); const domUtils = DOMUtils.noConflict(); const __pops = pops; const log = new utils.Log( _GM_info, _unsafeWindow.console || _monkeyWindow.console ); const SCRIPT_NAME = ((_a = _GM_info == null ? void 0 : _GM_info.script) == null ? void 0 : _a.name) || _SCRIPT_NAME_; const DEBUG = false; log.config({ debug: DEBUG, logMaxCount: 1e3, autoClearConsole: true, tag: true }); Qmsg.config( Object.defineProperties( { html: true, autoClose: true, showClose: false }, { position: { get() { return PopsPanel.getValue("qmsg-config-position", "bottom"); } }, maxNums: { get() { return PopsPanel.getValue("qmsg-config-maxnums", 5); } }, showReverse: { get() { return PopsPanel.getValue("qmsg-config-showreverse", true); } }, zIndex: { get() { let maxZIndex = Utils.getMaxZIndex(); let popsMaxZIndex = pops.config.InstanceUtils.getPopsMaxZIndex().zIndex; return Utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100; } } } ) ); 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(_GM_xmlhttpRequest); httpx.interceptors.request.use((data) => { HttpxCookieManager.handle(data); return data; }); httpx.interceptors.response.use(void 0, (data) => { log.error("拦截器-请求错误", data); if (data.type === "onabort") { Qmsg.warning("请求取消"); } else if (data.type === "onerror") { Qmsg.error("请求异常"); } else if (data.type === "ontimeout") { Qmsg.error("请求超时"); } else { Qmsg.error("其它错误"); } return data; }); httpx.config({ logDetails: DEBUG }); pops.GlobalConfig.setGlobalConfig({ mask: { enable: true, clickEvent: { toClose: false, toHide: false } } }); ({ 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); CommonUtil.setGMResourceCSS(GM_RESOURCE_MAPPING.Viewer); CommonUtil.setGMResourceCSS(GM_RESOURCE_MAPPING.Hljs); const $ = document.querySelector.bind(document); const $$ = document.querySelectorAll.bind(document); 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 UISwitch = function(text, key, defaultValue, clickCallBack, description, afterAddToUListCallBack) { let r###lt = { text, type: "switch", description, attributes: {}, props: {}, getValue() { return Boolean( this.props[PROPS_STORAGE_API].get(key, defaultValue) ); }, callback(event, __value) { let value = Boolean(__value); log.success(`${value ? "开启" : "关闭"} ${text}`); this.props[PROPS_STORAGE_API].set(key, value); }, afterAddToUListCallBack }; Reflect.set(r###lt.attributes, ATTRIBUTE_KEY, key); Reflect.set(r###lt.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(r###lt.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return r###lt; }; const UITextArea = function(text, key, defaultValue, description, changeCallBack, placeholder = "", disabled) { let r###lt = { text, type: "textarea", attributes: {}, props: {}, description, placeholder, disabled, getValue() { return this.props[PROPS_STORAGE_API].get(key, defaultValue); }, callback(event, value) { this.props[PROPS_STORAGE_API].set(key, value); } }; Reflect.set(r###lt.attributes, ATTRIBUTE_KEY, key); Reflect.set(r###lt.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(r###lt.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return r###lt; }; const UISelect = function(text, key, defaultValue, data, callback, description) { let selectData = []; if (typeof data === "function") { selectData = data(); } else { selectData = data; } let r###lt = { text, type: "select", description, attributes: {}, props: {}, getValue() { return this.props[PROPS_STORAGE_API].get(key, defaultValue); }, callback(event, isSelectedValue, isSelectedText) { let value = isSelectedValue; log.info(`选择:${isSelectedText}`); this.props[PROPS_STORAGE_API].set(key, value); if (typeof callback === "function") { callback(event, value, isSelectedText); } }, data: selectData }; Reflect.set(r###lt.attributes, ATTRIBUTE_KEY, key); Reflect.set(r###lt.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(r###lt.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return r###lt; }; const UIButton = function(text, description, buttonText, buttonIcon, buttonIsRightIcon, buttonIconIsLoading, buttonType, clickCallBack, afterAddToUListCallBack) { let r###lt = { text, type: "button", description, buttonIcon, buttonIsRightIcon, buttonIconIsLoading, buttonType, buttonText, callback(event) { if (typeof clickCallBack === "function") { clickCallBack(event); } }, afterAddToUListCallBack }; return r###lt; }; const UIOwn = function(getLiElementCallBack, initConfig, props, afterAddToUListCallBack) { let r###lt = { type: "own", attributes: {}, props, getLiElementCallBack, afterAddToUListCallBack }; Reflect.set(r###lt.attributes, ATTRIBUTE_INIT, () => { return false; }); return r###lt; }; const MTRegExp = { /** 论坛账号的凭证 */ formhash: /formhash=([0-9a-zA-Z]+)/, /** 用户uid */ uid: /uid(=|-)(\d+)/, /** 帖子内特殊字体格式 */ fontSpecial: /<font.*?>|<\/font>|<strike>|<strong>|<i>|<u>|align=".*?"|<br>[\s]*<br>[\s]*<br>/g, /** 帖子链接的ptid参数 */ ptid: /&ptid=([\d]+)/i, /** 帖子链接的pid参数 */ pid: /&pid=([\d]+)/i, /** 链接的tid参数 */ tid: /&tid=([\d]+)/i }; const MTUtils = { /** * 根据UID获取小|中|大头像 * @param uid * @param size */ getAvatar: (uid, size = "middle") => { return `/uc_server/avatar.php?uid=${uid}&size=${size}&ts=1`; }, /** * 获取当前已登录的用户的uid */ 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]; } } }, /** * 获取账号的formhash */ 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; } } } }, /** * 检测环境模板 */ envIsMobile() { return ( // @ts-ignore (_unsafeWindow.STYLEID || // @ts-ignore window.STYLEID || // @ts-ignore typeof STYLEID !== "undefined" && STYLEID) === "3" ); }, /** * 获取帖子id * @param url */ 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; } }, /** * 获取板块?id */ getForumId(url) { let urlMatch = url.match(/&fid=([\d]+)/i); if (urlMatch) { return urlMatch[urlMatch.length - 1]; } }, /** * 获取发布id */ getPostId(url) { let urlMatch = url.match(/&pid=([\d]+)/i); if (urlMatch) { return urlMatch[urlMatch.length - 1]; } }, /** * 获取回复id */ getRepquote(url) { let urlMatch = url.match(/&repquote=([\d]+)/i); if (urlMatch) { return urlMatch[urlMatch.length - 1]; } } }; const MTDyncmicAvatar = { $upload: { small: false, middle: false, big: false }, $data: { /** * 图片文件最大大小 */ avatarInfo: { maxSize: 2097152, small: { width: 48, height: 48 }, middle: { width: 120, height: 120 }, big: { width: 200, height: 250 } } }, $el: { $smallUpload: null, $middleUpload: null, $bigUpload: null, $smallStatus: null, $middleStatus: null, $bigStatus: null }, $avatar: { get small() { return MTDyncmicAvatar.$el.$smallUpload.files[0]; }, get middle() { return MTDyncmicAvatar.$el.$middleUpload.files[0]; }, get big() { return MTDyncmicAvatar.$el.$bigUpload.files[0]; } }, /** * 显示视图 */ showView() { const that = this; let $confirm = __pops.confirm({ title: { text: "修改头像", position: "center" }, content: { text: ( /*html*/ ` <div class="avatar-container"> <p class="avatar-tip">1. 小头像(图片宽高限制最大尺寸:48×48)</p> <p class="avatar-upload-status" data-type="small">🤡请先上传图片</p> <input type="file" class="avatar-upload" data-type="small" data-maxwidth="48" data-maxheight="48" accept="image/*"> </div> <div class="avatar-container"> <p class="avatar-tip">2. 中头像(图片宽高限制最大尺寸:120×120)</p> <p class="avatar-upload-status" data-type="middle">🤡请先上传图片</p> <input type="file" class="avatar-upload" data-type="middle" data-maxwidth="120" data-maxheight="120" accept="image/*"> </div> <div class="avatar-container"> <p class="avatar-tip">3. 大头像(图片宽高限制最大尺寸:200×250)</p> <p class="avatar-upload-status" data-type="big">🤡请先上传图片</p> <input type="file" class="avatar-upload" data-type="big" data-maxwidth="200" data-maxheight="250" accept="image/*"> </div> ` ), html: true }, btn: { ok: { text: "上传", callback: async () => { if (!that.$upload.small) { Qmsg.error("请上传小头像"); return; } if (!that.$upload.middle) { Qmsg.error("请上传中头像"); return; } if (!that.$upload.big) { Qmsg.error("请上传大头像"); return; } let $loading = Qmsg.loading("正在处理数据中..."); try { let uploadUrl = await this.getUploadUrl(); if (uploadUrl == null) { return; } let formhash = MTUtils.getFormHash(); if (formhash == null) { Qmsg.error("获取formhash失败"); return; } let avatarInfo = { big: { base64: await utils.parseFileToBase64(this.$avatar.big) }, middle: { base64: await utils.parseFileToBase64(this.$avatar.middle) }, small: { base64: await utils.parseFileToBase64(this.$avatar.small) } }; Object.keys(avatarInfo).forEach((keyName) => { let value = avatarInfo[keyName]; value.base64 = value.base64.substring( value.base64.indexOf(",") + 1 ); }); let formData = new FormData(); formData.append("Filedata", this.$avatar.big || ""); formData.append("confirm", "确定"); formData.append("avatar1", avatarInfo.big.base64); formData.append("avatar2", avatarInfo.middle.base64); formData.append("avatar3", avatarInfo.small.base64); formData.append("formhash", formhash); log.info(`头像的base64字符串`, avatarInfo); let response = await httpx.post(uploadUrl, { data: formData, processData: false, headers: { Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "User-Agent": utils.getRandomPCUA(), Host: window.location.hostname, Origin: window.location.origin, Referer: `${window.location.origin}/home.php?mod=spacecp&ac=avatar` } }); if (!response.status) { return; } if (response.data.responseText.indexOf( "window.parent.postMessage('success','*')" ) != -1) { $confirm.close(); Qmsg.success("上传成功"); } else { log.error("上传失败", response); Qmsg.error(response.data.responseText, { timeout: 6e3, isHTML: false, html: false }); } } catch (error) { log.error(error); } finally { $loading.close(); } } } }, mask: { enable: true }, width: "88vw", height: "500px", style: ( /*css*/ ` .avatar-container{ display: flex; width: -webkit-fill-available; width: -moz-available; margin: 6px 10px; flex-direction: column; } .avatar-tip{ float: left; font-weight: bold; } .avatar-upload-status { padding: 0px; padding-left: 10px; font-weight: bold; width: -webkit-fill-available; text-align: left; font-size: small; } .avatar-upload-status[data-success="false"]{ color: red; } .avatar-upload-status[data-success="true"]{ color: green; } .avatar-upload { margin: 20px 0px; } ` ) }); this.$el.$smallUpload = $confirm.$shadowRoot.querySelector( ".avatar-upload[data-type='small']" ); this.$el.$middleUpload = $confirm.$shadowRoot.querySelector( ".avatar-upload[data-type='middle']" ); this.$el.$bigUpload = $confirm.$shadowRoot.querySelector( ".avatar-upload[data-type='big']" ); this.$el.$smallStatus = $confirm.$shadowRoot.querySelector( ".avatar-upload-status[data-type='small']" ); this.$el.$middleStatus = $confirm.$shadowRoot.querySelector( ".avatar-upload-status[data-type='middle']" ); this.$el.$bigStatus = $confirm.$shadowRoot.querySelector( ".avatar-upload-status[data-type='big']" ); this.setUploadChangeEvent( this.$el.$smallUpload, this.$el.$smallStatus, this.$data.avatarInfo.small, () => { this.$upload.small = true; } ); this.setUploadChangeEvent( this.$el.$middleUpload, this.$el.$middleStatus, this.$data.avatarInfo.middle, () => { this.$upload.middle = true; } ); this.setUploadChangeEvent( this.$el.$bigUpload, this.$el.$bigStatus, this.$data.avatarInfo.big, () => { this.$upload.big = true; } ); }, /** * 设置文件改变事件 */ setUploadChangeEvent($file, $status, sizeInfo, successCallBack) { domUtils.on($file, "change", (event) => { var _a2; if (!((_a2 = $file.files) == null ? void 0 : _a2.length)) { return; } domUtils.text($status, "🤡获取文件信息中..."); $status.removeAttribute("data-success"); let uploadImageFile = $file.files[0]; let fileSize = uploadImageFile.size; let $image = new Image(); let reader = new FileReader(); reader.readAsDataURL(uploadImageFile); reader.onload = function(response) { $image.src = response.target.r###lt; $image.onload = function() { if ($image.width > sizeInfo.width || $image.height > sizeInfo.height) { $file.value = ""; $status.setAttribute("data-success", "false"); domUtils.text( $status, `🤡校验失败 ==> 图片尺寸不符合,宽:${$image.width} 高:${$image.height}` ); return; } if (fileSize > MTDyncmicAvatar.$data.avatarInfo.maxSize) { $file.value = ""; $status.setAttribute("data-success", "false"); domUtils.text( $status, `🤡校验失败 ==> 图片大小不符合:${fileSize}byte,限制最大:${MTDyncmicAvatar.$data.avatarInfo.maxSize}byte` ); return; } $status.setAttribute("data-success", "true"); domUtils.text( $status, `🤣 通过 宽:${$image.width} 高:${$image.height} 大小(byte):${fileSize}` ); successCallBack(); }; }; }); }, /** * 获取上传地址 */ async getUploadUrl() { let response = await httpx.get("/home.php?mod=spacecp&ac=avatar", { headers: { "User-Agent": utils.getRandomPCUA() } }); if (!response.status) { return; } if (utils.isNull(response.data.responseText)) { Qmsg.error("动态头像:获取上传地址失败"); return; } let dataMatch = response.data.responseText.match( /var[\s]*data[\s]*=[\s]*"(.+?)"/ ); if (dataMatch == null || dataMatch.length != 2) { Qmsg.error("动态头像:获取变量data失败"); return; } let data = dataMatch[dataMatch.length - 1]; let data_split = data.split(","); let uploadUrl = data_split[data_split.indexOf("src") + 1].replace( "images/camera.swf?inajax=1", "index.php?m=user&a=rectavatar&base64=yes" ); log.info(`上传地址:` + uploadUrl); return uploadUrl; } }; const Component_Common = { id: "component-common", title: "通用", forms: [ { text: "", type: "forms", forms: [ { text: "Toast配置", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISelect( "Toast位置", "qmsg-config-position", "bottom", [ { value: "topleft", text: "左上角" }, { value: "top", text: "顶部" }, { value: "topright", text: "右上角" }, { value: "left", text: "左边" }, { value: "center", text: "中间" }, { value: "right", text: "右边" }, { value: "bottomleft", text: "左下角" }, { value: "bottom", text: "底部" }, { value: "bottomright", text: "右下角" } ], (event, isSelectValue, isSelectText) => { log.info("设置当前Qmsg弹出位置" + isSelectText); }, "Toast显示在页面九宫格的位置" ), UISelect( "最多显示的数量", "qmsg-config-maxnums", 3, [ { value: 1, text: "1" }, { value: 2, text: "2" }, { value: 3, text: "3" }, { value: 4, text: "4" }, { value: 5, text: "5" } ], void 0, "限制Toast显示的数量" ), UISwitch( "逆序弹出", "qmsg-config-showreverse", false, void 0, "修改Toast弹出的顺序" ) ] } ] }, { text: "Cookie配置", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISwitch( "启用", "httpx-use-cookie-enable", false, void 0, "启用后,将根据下面的配置进行添加cookie" ), UISwitch( "使用document.cookie", "httpx-use-document-cookie", false, void 0, "自动根据请求的域名来设置对应的cookie" ), UITextArea( "bbs.binmt.cc", "httpx-cookie-bbs.binmt.cc", "", void 0, void 0, "Cookie格式:xxx=xxxx;xxx=xxxx" ) ] } ] } ] }, { text: "", type: "forms", forms: [ { text: "功能", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISwitch( "文本转超链接", "mt-link-text-to-hyperlink", true, void 0, "自动把符合超链接格式的文字转为超链接" ), UISwitch( "显示用户UID", "mt-show-user-uid", true, void 0, "格式为UID:xxx" ), UISwitch( "小窗模式", "mt-small-window", true, void 0, "开启后点击帖子右侧区域为小窗打开" ), UISwitch( "延长登录Cookie过期时间", "mt-extend-cookie-expire", false, void 0, "减少频繁登录账号的问题" ) ] } ] }, { text: "额外菜单项", type: "deepMenu", forms: [ { type: "forms", text: "", forms: [ UISwitch( "小黑屋", "mt-black-home", true, void 0, "将会在左侧面板添加【小黑屋】菜单" ), UISwitch( "在线用户", "mt-online-user", true, void 0, "将会在左侧面板添加【在线用户】菜单" ), UISwitch( "付费主题白嫖提醒", "mt-post-paidThemePost", true, void 0, "将会在左侧面板添加【付费主题白嫖提醒】菜单" ), UISwitch( "我的屏蔽", "mt-ownBlock", true, void 0, "将会在左侧面板添加【我的屏蔽】菜单" ), UISwitch( "商品上架提醒", "mt-productListingReminder", true, void 0, "将会在左侧面板添加【商品上架提醒】菜单" ), UISwitch( "自定义用户标签", "mt-customizeUserLabels", true, void 0, "将会在左侧面板添加【自定义用户标签】菜单" ), UISwitch( "评论过滤器", "mt-post-comment-filter", true, void 0, "将会在左侧面板添加【评论过滤器】菜单" ) ] } ] }, { text: "头像", type: "deepMenu", forms: [ { text: "<a href='https://ezgif.com/resize' target='_blank'>Resize Image</a>", type: "forms", forms: [ UIOwn(($li) => { let $left = domUtils.createElement("div", { className: "pops-panel-item-left-text", innerHTML: ( /*html*/ ` <p class="pops-panel-item-left-main-text">头像(有缓存)</p> <p class="pops-panel-item-left-desc-text">小、中、大</p> ` ) }); let $right = domUtils.createElement("div", { className: "pops-panel-avatar-img", innerHTML: ( /*html*/ ` <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=small" class="avatar-img" data-size="small"> <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=middle" class="avatar-img" data-size="middle"> <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=big" class="avatar-img" data-size="big"> ` ) }); let $style = domUtils.createElement("style", { innerHTML: ( /*css*/ ` .avatar-img { width: 30px; height: 30px; border-radius: 50%; overflow: hidden; } ` ) }); $right.querySelector( ".avatar-img[data-size='small']" ); $right.querySelector( ".avatar-img[data-size='middle']" ); $right.querySelector( ".avatar-img[data-size='big']" ); $li.appendChild($left); $li.appendChild($right); $li.appendChild($style); return $li; }), UIOwn(($li) => { let $left = domUtils.createElement("div", { className: "pops-panel-item-left-text", innerHTML: ( /*html*/ ` <p class="pops-panel-item-left-main-text">头像</p> <p class="pops-panel-item-left-desc-text">小、中、大</p> ` ) }); let $right = domUtils.createElement("div", { className: "pops-panel-avatar-img", innerHTML: ( /*html*/ ` <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=small&ts=${Date.now()}" class="avatar-img" data-size="small"> <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=middle&ts=${Date.now()}" class="avatar-img" data-size="middle"> <img src="/uc_server/avatar.php?uid=${MTUtils.getCurrentUID()}&size=big&ts=${Date.now()}" class="avatar-img" data-size="big"> ` ) }); $li.appendChild($left); $li.appendChild($right); return $li; }), UIButton( "修改头像", `可以上传gif图片,注意图片最大限制为${Utils.formatByteToSize( MTDyncmicAvatar.$data.avatarInfo.maxSize )}`, "上传", void 0, false, false, "primary", () => { MTDyncmicAvatar.showView(); } ) ] } ] } ] } ] }; 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: ( /*html*/ ` <a href="javascript:;" class="comiis_left_Touch"> <i class="comiis_font"></i> ${config.name} </a> ` ) }); 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); }); }, /** * 导读中最新、热门、精华、回复、抢沙发的各个帖子【list】 */ comiisForumList: () => { return document.querySelectorAll("li.forumlist_li"); }, /** * 帖子内评论,包括帖子内容主体,第一个就是主体【list】 */ comiisPostli: () => { return document.querySelectorAll( "div.comiis_postli.comiis_list_readimgs.nfqsqi" ); }, /** * 帖子内评论,包括帖子内容主体,第一个就是主体【list】 */ comiisMmlist: () => { return document.querySelectorAll(".comiis_mmlist"); } }; const UIInput = function(text, key, defaultValue, description, changeCallBack, placeholder = "", isNumber, isPassword, afterAddToUListCallBack) { let r###lt = { text, type: "input", isNumber: Boolean(isNumber), isPassword: Boolean(isPassword), props: {}, attributes: {}, description, afterAddToUListCallBack, getValue() { return this.props[PROPS_STORAGE_API].get(key, defaultValue); }, callback(event, value, valueAsNumber) { this.props[PROPS_STORAGE_API].set( key, isNumber ? valueAsNumber : value ); }, placeholder }; Reflect.set(r###lt.attributes, ATTRIBUTE_KEY, key); Reflect.set(r###lt.attributes, ATTRIBUTE_DEFAULT_VALUE, defaultValue); Reflect.set(r###lt.props, PROPS_STORAGE_API, { get(key2, defaultValue2) { return PopsPanel.getValue(key2, defaultValue2); }, set(key2, value) { PopsPanel.setValue(key2, value); } }); return r###lt; }; 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 { constructor(option) { __publicField(this, "option"); __publicField(this, "$data", { STORAGE_KEY: "mt-image-bed-upload-history" }); 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 r###lt = await this.option.uploadBtnClickEvent(event); if (r###lt) { $( `.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 (PopsPanel.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: [ PopsPanel.getValue("mt-image-bed-watermark-text") ], color: PopsPanel.getValue( "mt-image-bed-watermark-text-color" ), fontSize: PopsPanel.getValue( "mt-image-bed-watermark-font-size" ), globalAlpha: PopsPanel.getValue( "mt-image-bed-watermark-font-opacity" ), xMoveDistance: PopsPanel.getValue( "mt-image-bed-watermark-left-right-margin" ), yMoveDistance: PopsPanel.getValue( "mt-image-bed-watermark-top-bottom-margin" ), rotateAngle: PopsPanel.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 (PopsPanel.getValue( "mt-image-bed-watermark-autoAddWaterMark" )) { await upload_callback(chooseImage); } else { __pops.confirm({ title: { text: "水印预览", position: "center" }, content: { text: ( /*html*/ ` <div class="upload-image-water">${needUploadImageArray.map((item) => { return ( /*html*/ `<img src="${item}" crossoriginNew="anonymous" loading="lazy">` ); }).join("\n")} </div> ` ), 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(); } } }, drag: true, width: "88vw", height: "80vh", style: ( /*css*/ ` .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 = ( /*html*/ ` <li> <a href="javascript:;" class="comiis-picture-tab" data-type="image-bed">${this.option.name}</a> </li> ` ); 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: ( /*html*/ ` <ul class="comiis_post_imglist cl" id="imglist_history"> </ul> ` ) }, { 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, /*html*/ ` <div class="comiis_upbox bg_f cl" style="display: none;"> <ul class="comiis_post_imglist cl" data-chartbed="${this.option.name}"> <li class="up_btn"> <a href="javascript:;" class="bg_e b_ok f_d"> <i class="comiis_font"></i> </a> <input type="file" name="Filedata" accept="image/*" multiple="" style="display: none;"> </li> </ul> </div> ` ); } /** * 创建图片缩略图,用于插入 */ createImageBtnElement(labelName, url) { let $li = domUtils.createElement("li", { innerHTML: ( /*html*/ ` <span class="delImg" data-id="${this.option.id}" data-name="${this.option.name}"> <a href="javascript:;"> <i class="comiis_font f_g"></i> </a> </span> <span class="charu f_f">${labelName}</span> <span class="p_img"> <a href="javascript:;" onclick="comiis_addsmilies('[img]${url}[/img]')"> <img style="height:54px;width:54px;" title="${url}" src="${url}" loading="lazy" class="vm b_ok"></a> </span> ` ) }); 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 r###lt = await this.option.delImageEvent(event, data); if (r###lt) { 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 r###lt = await findValue.callback(event, data.data); if (r###lt) { 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 PopsPanel.getValue("mt-image-bed-hello-account"); }, get password() { return PopsPanel.getValue("mt-image-bed-hello-password"); }, get token() { return PopsPanel.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 r###lt = await that.uploadImage(file); if (r###lt) { uploadList.push({ url: r###lt.data.links.url, data: r###lt.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 deleteR###lt = await that.deleteImage(data.data.key) ?? false; $loading.close(); return deleteR###lt; } 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; }, /** * 上传图片 * @param imageFile */ 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.r###lt; let r###lt = { imageUri, data: data.data }; resolve(r###lt); }; }); }, /** * 删除图片 * @param imageKey 删除的key */ 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 r###lt = await that.uploadImage(file); if (r###lt) { uploadList.push({ url: r###lt.data.links.url, data: r###lt.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; }, /** * 获取MT图床的CSRF参数 */ async getCSRFToken() { var _a2; 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 = (_a2 = doc.querySelector('meta[name="csrf-token"]')) == null ? void 0 : _a2.getAttribute("content"); if (!metaCSRFToken) { return; } log.info("获取的CSRF token:", metaCSRFToken); Qmsg.success(this.$config.TAG + "获取CSRF Token成功"); return metaCSRFToken; }, /** * 上传图片 * @param imageFile */ 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.r###lt; let r###lt = { imageUri, data: data.data }; resolve(r###lt); }; }); } }; 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 += // @ts-ignore parseInt(r).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(r).toString(16) ) : ( // @ts-ignore parseInt(r).toString(16) ); wr_rgb += // @ts-ignore parseInt(g).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(g).toString(16) ) : ( // @ts-ignore parseInt(g).toString(16) ); wr_rgb += // @ts-ignore parseInt(b).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(b).toString(16) ) : ( // @ts-ignore 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 += // @ts-ignore parseInt(r).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(r).toString(16) ) : ( // @ts-ignore parseInt(r).toString(16) ); wr_rgb += // @ts-ignore parseInt(g).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(g).toString(16) ) : ( // @ts-ignore parseInt(g).toString(16) ); wr_rgb += // @ts-ignore parseInt(b).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(b).toString(16) ) : ( // @ts-ignore 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 += // @ts-ignore parseInt(r).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(r).toString(16) ) : ( // @ts-ignore parseInt(r).toString(16) ); wr_rgb += // @ts-ignore parseInt(g).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(g).toString(16) ) : ( // @ts-ignore parseInt(g).toString(16) ); wr_rgb += // @ts-ignore parseInt(b).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(b).toString(16) ) : ( // @ts-ignore 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 += // @ts-ignore parseInt(r).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(r).toString(16) ) : ( // @ts-ignore parseInt(r).toString(16) ); wr_rgb += // @ts-ignore parseInt(g).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(g).toString(16) ) : ( // @ts-ignore parseInt(g).toString(16) ); wr_rgb += // @ts-ignore parseInt(255 - b).toString(16).length == 1 ? ( // @ts-ignore 0 + parseInt(255 - b).toString(16) ) : ( // @ts-ignore 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: { isU###odeInsertClick: 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 ( /*html*/ `<li><a href="javascript:;" onclick="comiis_addsmilies('${key}');"><img loading="lazy" data-src="${smilies_url}" class="vm"></a></li>` ); }); let second_smilies = Object.keys(smiliesList[1]).map((key) => { let smilies_url = smiliesList[1][key]; return ( /*html*/ `<li><a href="javascript:;" onclick="comiis_addsmilies('${key}');"><img loading="lazy" data-src="${smilies_url}" class="vm"></a></li>` ); }); let third_smilies = Object.keys(smiliesList[2]).map((key) => { let smilies_url = smiliesList[2][key]; return ( /*html*/ `<li><a href="javascript:;" onclick="comiis_addsmilies('${key}');"><img loading="lazy" data-src="${smilies_url}" class="vm"></a></li>` ); }); domUtils.after( $footMenu, /*html*/ ` <div id="comiis_foot_menu_beautify" class="bg_f b_t"> <div class="reply_area"> <ul> <li data-attr="回帖"><input type="text" class="bg_e f_c" placeholder="发帖千百度,文明第一步" readonly="readonly"></li> <li data-attr="评论数量">${$old_commentIcon.innerHTML}</li> <li data-attr="点赞">${$old_linkIcon.innerHTML}</li> <li data-attr="收藏">${$old_collectIcon.innerHTML}</li> </ul> </div> </div> <div id="comiis_foot_menu_beautify_big" data-model="comment" class="bg_f b_t" style="display:none;"> <div class="reply_area"> <div class="reply_user_content" style="display:none;"></div> <ul> <li data-attr="回帖"><textarea id="needmessage" placeholder="发帖千百度,文明第一步"></textarea></li> <li data-attr="发表"> <div class="fastpostform_new"><a href="${forum_url}" data-comment-url="${forum_url}" target="_blank"><i class="comiis_font f_d"></i></a></div> <div id="fastpostsubmitline"><input data-comment-url="${forum_url}" data-comment-action="${this.$data.forum_action}" data-comment-serialize="${forum_serialize}" data-text="false" type="button" value="发表" name="replysubmit" id="fastpostsubmit" comiis="handle"></div> </li> </ul> </div> <div class="other_area"> <div class="menu_icon"> <a href="javascript:;" class="comiis_pictitle"><i class="comiis_font"></i></a> <a href="javascript:;" class="comiis_smile"><i class="comiis_font"></i></a> <a href="javascript:;" class="commis_insert_bbs"><i class="comiis_font"></i></a> </div> <div class="menu_body"> <div id="comiis_pictitle_tab"> <!-- 列表项 --> <div class="comiis_upbox bg_f cl"> <ul id="imglist" class="comiis_post_imglist cl"> <li class="up_btn"> <a href="javascript:;" class="bg_e b_ok f_d"> <i class="comiis_font"></i> </a> <input type="file" name="Filedata" id="filedata" accept="image/*" multiple> </li> </ul> </div> <!-- 菜单项 --> <div class="bqbox_t"> <ul id="comiis_pictitle_key"> <li class="bg_f" id="comiis_pictitle_tab_n_1"><a href="javascript:;" class="">论坛</a></li> </ul> </div> </div> <div id="comiis_post_tab" class="comiis_bqbox"> <div class="comiis_smiley_box swiper-container-horizontal swiper-container-android"> <div class="swiper-wrapper bqbox_c comiis_optimization"> <div class="swiper-slide"> ${first_smilies.join("\n")} </div> <div class="swiper-slide" style="display: none;"> ${second_smilies.join("\n")} </div> <div class="swiper-slide" style="display: none;"> ${third_smilies.join("\n")} </div> </div> <div class="bqbox_t"> <ul id="comiis_smilies_key"> <li> <a href="javascript:;" id="comiis_smilies_tab_n_1" class="bg_f b_l b_r"> <img loading="lazy" data-src="https://cdn-bbs.mt2.cn/static/image/smiley/qq/qq063.gif" class="vm"> </a> </li> <li> <a href="javascript:;" id="comiis_smilies_tab_n_2" class=""> <img loading="lazy" data-src="https://cdn-bbs.mt2.cn/static/image/smiley/comiis_tb/tb_10.png" class="vm"> </a> </li> <li> <a href="javascript:;" id="comiis_smilies_tab_n_3" class=""> <img loading="lazy" data-src="https://cdn-bbs.mt2.cn/static/image/smiley/doge/21.png" class="vm"> </a> </li> </ul> </div> </div> </div> <div id="comiis_insert_ubb_tab" style="display: none;"> <div class="bg_f comiis_input_style"> <div class="comiis_post_urlico b_b"> <ul id="comiis_insert_ubb_tab_list"> </ul> </div> </div> </div> </div> </div> ` ); $( "#comiis_foot_menu_beautify .comiis_position_key" ); this.$el.$like = $( "#comiis_foot_menu_beautify .comiis_recommend_addkey" ); $( "#comiis_foot_menu_beautify #comiis_favorite_a" ); $("#comiis_pictitle_key"); this.$el.$btn_submit = $( '#comiis_foot_menu_beautify_big li[data-attr="发表"] input' ); this.$el.$input = $( "#comiis_foot_menu_beautify_big textarea" ); this.$el.$fastpostsubmit = $("#fastpostsubmit"); _unsafeWindow.textarea_scrollHeight = () => { }; if (typeof _unsafeWindow.comiis_addsmilies == "function") { _unsafeWindow.comiis_addsmilies = (smilies_text) => { _unsafeWindow.$("#needmessage").comiis_insert(smilies_text); _unsafeWindow.$("#needmessage")[0].dispatchEvent(new Event("propertychange")); }; } _unsafeWindow.$("#imglist .up_btn").append(_unsafeWindow.$("#filedata")); _unsafeWindow.$(document).on("click", "#imglist .up_btn a", function() { _unsafeWindow.$(this).next().click(); }); _unsafeWindow.$(document).on("click", "#imglist .p_img a", function() { let obj = _unsafeWindow.$(this); if (obj.attr("onclick") == null) { let img_id = obj.find("img").attr("id").replace("aimg_", ""); _unsafeWindow.comiis_addsmilies(`[attachimg]${img_id}[/attachimg]`); } }); domUtils.hide("#comiis_foot_menu_beautify_big .menu_body", false); this.setInputChangeEvent(); this.setLikeBtnClickEvent(); this.setSubmitBtnClickEvent(); this.setGlobalReplyBtnClickEvent(); this.setGlobalClickCheckEvent(); this.setMenuIconToggleEvent(); this.setMenuImageClickEvent(); this.setMenuImageToggleEvent(); this.setMenuSmileClickEvent(); this.setMenuSmileTabClickEvent(); this.setMenuInsertClickEvent(); this.setMenuQuickUBB(); PopsPanel.execMenu( "mt-forum-post-editorOptimizationNormal-recordInputText", () => { this.initReplyText(); this.setInputChangeSaveEvent(); } ); PopsPanel.execMenuOnce("mt-image-bed-hello-enable", () => { MTEditorImageBed_Hello.init(); }); PopsPanel.execMenuOnce("mt-image-bed-mt-enable", () => { MTEditorImageBed_MT.init(); }); }, /** * 处理错误的响应 * @param text */ handle_error(text) { let return_status = false; let messagetext = domUtils.text( domUtils.parseHTML(text, false, false).querySelector( "#messagetext" ) ); if (!messagetext || typeof messagetext === "string" && messagetext.trim() == "") { return return_status; } Object.keys(error_code).forEach((item) => { let value = error_code[item]; if (messagetext.indexOf(value.error_match) != -1) { if (messagetext.indexOf(`typeof errorhandle_=='function'`) != -1) { Qmsg.error(value.popup_text); } return_status = true; return; } }); return return_status; }, /** * 监听输入框内容改变 */ setInputChangeEvent() { const that = this; domUtils.on(that.$el.$input, ["input", "propertychange"], function(event) { var _a2, _b; let inputText = that.$el.$input.value; if (inputText === "") { that.$el.$btn_submit.setAttribute("data-text", "false"); (_a2 = $( "#comiis_foot_menu_beautify li[data-attr='回帖'] input" )) == null ? void 0 : _a2.setAttribute("placeholder", "发帖千百度,文明第一步"); } else { that.$el.$btn_submit.setAttribute("data-text", "true"); (_b = $( "#comiis_foot_menu_beautify li[data-attr='回帖'] input" )) == null ? void 0 : _b.setAttribute("placeholder", "[草稿待发送]"); } domUtils.css(that.$el.$input, "height", "70px"); domUtils.css( that.$el.$input, "height", that.$el.$input.scrollHeight - 20 + "px" ); }); }, /** * 监听输入框内容改变并保存到indexDB */ setInputChangeSaveEvent() { const that = this; domUtils.on(this.$el.$input, ["input", "propertychange"], (event) => { let inputText = that.$el.$input.value; let $reply = that.$el.$input.closest(".reply_area").querySelector(".reply_user_content"); let replyUrl = $reply.getAttribute("data-reply-url"); let data = { url: window.location.href, text: inputText, repquote: replyUrl ? MTUtils.getRepquote(replyUrl) : void 0, forumId: that.$data.tid }; that.$data.db.get("data").then((r###lt) => { if (!r###lt.success || r###lt.code === 201) { console.warn(r###lt); return; } let localDataIndex = r###lt.data.findIndex((item) => { return item.forumId === data.forumId && item.repquote === data.repquote; }); if (localDataIndex !== -1) { if (inputText == null || inputText === "") { r###lt.data.splice(localDataIndex, 1); } else { r###lt.data[localDataIndex] = utils.assign( r###lt.data[localDataIndex], { text: data.text } ); } } else { r###lt.data.push(data); } that.$data.db.save("data", r###lt.data).then((r###lt2) => { }); }); }); }, /** * 把存储回复框的内容设置到输入框中 * @param isUserReply 是否是来自点击回复的 * @param replyUrl 回复的url */ async initReplyText(isUserReply = false, replyUrl = void 0) { const that = this; let initR###lt = await this.$data.db.get( "data" ); if (initR###lt.code === 201) { await this.$data.db.save("data", []); } let queryR###lt = await this.$data.db.get( "data" ); if (!queryR###lt.success || queryR###lt.code === 201) { console.warn(queryR###lt); return; } let repquote = void 0; if (replyUrl) { repquote = MTUtils.getRepquote(replyUrl); } let localReplyData = queryR###lt.data.find((item) => { if (isUserReply) { return item.forumId === that.$data.tid && item.repquote == repquote; } else { return item.forumId === that.$data.tid && item.repquote == null; } }); if (localReplyData) { domUtils.val(this.$el.$input, localReplyData.text); utils.dispatchEvent(this.$el.$input, "input"); } }, /** * 设置点赞按钮点击事件 */ setLikeBtnClickEvent() { domUtils.on(this.$el.$like, "click", async (event) => { var _a2, _b; utils.preventEvent(event); if (_unsafeWindow.comiis_recommend_key == 0) { _unsafeWindow.comiis_recommend_key = 1; let response = await httpx.get(this.$el.$like.href + "&inajax=1", { headers: { Accept: "application/xml, text/xml, */*; q=0.01" }, fetch: true, allowInterceptConfig: false }); if (!response.status) { window.location.href = this.$el.$like.href; setTimeout(function() { _unsafeWindow.comiis_recommend_key = 0; }, 500); return; } let xmlDoc = utils.parseFromString( response.data.responseText, "text/xml" ); let r###ltText = (_b = (_a2 = xmlDoc.lastChild) == null ? void 0 : _a2.firstChild) == null ? void 0 : _b.nodeValue; if (r###ltText.includes("您已评价过本主题")) { let tid = this.$el.$like.href.match(MTRegExp.tid)[1]; let response2 = await httpx.get( `plugin.php?id=comiis_app&comiis=re_recommend&tid=${tid}&inajax=1`, { headers: { Accept: "application/xml, text/xml, */*; q=0.01" }, fetch: true, allowInterceptConfig: false } ); if (!response2.status) { Qmsg.error("取消点赞失败,网络异常"); return; } var recommend_num = Number(domUtils.text("#comiis_recommend_num")); if (document.querySelectorAll(".comiis_recommend_list_a").length > 0) { domUtils.remove("#comiis_recommend_list_a" + _unsafeWindow.uid); } if (document.querySelectorAll(".comiis_recommend_list_s").length > 0) { domUtils.remove("#comiis_recommend_list_s" + _unsafeWindow.uid); } if (document.querySelectorAll(".comiis_recommend_list_t").length > 0) { domUtils.remove("#comiis_recommend_list_t" + _unsafeWindow.uid); } if (recommend_num > 1) { domUtils.text( ".comiis_recommend_num", recommend_num - Number(_unsafeWindow.allowrecommend) ); domUtils.text( ".comiis_recommend_nums", "+" + (recommend_num - Number(_unsafeWindow.allowrecommend)) ); } else { domUtils.remove("#comiis_recommend_num"); domUtils.text(".comiis_recommend_nums", ""); if (document.querySelectorAll(".comiis_recommend_list_a").length > 0) { domUtils.empty(".comiis_recommend_list_a"); domUtils.removeClass( ".comiis_recommend_list_a", "comiis_recommend_list_on" ); } if (document.querySelectorAll(".comiis_recommend_list_t").length > 0) { domUtils.removeClass( ".comiis_recommend_list_t", "comiis_recommend_list_on" ); } } domUtils.html(".comiis_recommend_addkey i", ""); domUtils.removeClass(".comiis_recommend_color", "f_a"); domUtils.addClass(".comiis_recommend_color", "f_b"); if (document.querySelectorAll(".comiis_recommend_list_s").length > 0) { if (document.querySelectorAll(".comiis_recommend_list_s li").length < 7) { domUtils.hide(".txshow_more", false); } else { domUtils.show(".txshow_more", false); } } Qmsg.success("已取消点赞"); } else if (r###ltText.includes("您不能评价自己的帖子")) { Qmsg.error("不能点赞自己的帖子"); } else if (r###ltText.includes("今日评价机会已用完")) { Qmsg.warning("您今日的点赞机会已用完"); } else if (r###ltText.includes( "'recommendv':'+" + _unsafeWindow.allowrecommend + "'" )) { var recommendcList = { recommendc: 0, daycount: 0 }, recommendc; recommendc = r###ltText.match(/\'recommendc\':\'(.*?)\'/); if (recommendc != null) { recommendcList["recommendc"] = parseInt(recommendc[1]); } else { recommendcList["recommendc"] = 0; } recommendc = r###ltText.match(/\'daycount\':\'(.*?)\'/); if (recommendc != null) { recommendcList["daycount"] = parseInt(recommendc[1]); } else { recommendcList["daycount"] = 0; } if (document.querySelectorAll(".comiis_recommend_new span").length < 1) { domUtils.append( ".comiis_recommend_new", '<span class="bg_del f_f comiis_kmvnum comiis_recommend_num" id="comiis_recommend_num">0</span>' ); } var comiis_recommend_num = Number( domUtils.text("#comiis_recommend_num") ); if ($$(".comiis_recommend_list_a").length > 0) { let $list_a = $$(".comiis_recommend_list_a"); domUtils.removeClass($list_a, "comiis_recommend_list_on"); domUtils.addClass($list_a, "comiis_recommend_list_on"); domUtils.prepend( $list_a, ($$(".comiis_recommend_list_a li").length > 0 ? "" : '<li style="float:right;margin-right:0;"><a href="misc.php?op=recommend&tid= ' + _unsafeWindow.tid + '&mod=faq&mobile=2"><span class="bg_b f_c"><em class="comiis_recommend_num">' + comiis_recommend_num + "</em>赞</span></a></li>") + '<li id="comiis_recommend_list_a' + _unsafeWindow.uid + '"><a href="home.php?mod=space&uid=' + _unsafeWindow.uid + '"><img src="' + MTUtils.getAvatar(_unsafeWindow.uid, "small") + '"></a></li>' ); } if ($$(".comiis_recommend_list_t").length > 0) { let $list_t = $$(".comiis_recommend_list_t"); domUtils.removeClass($list_t, "comiis_recommend_list_on"); domUtils.addClass($list_t, "comiis_recommend_list_on"); domUtils.prepend( $list_t, `<span id="comiis_recommend_list_t${_unsafeWindow.uid}"> <a href="home.php?mod=space&uid=${_unsafeWindow.uid}" class="f_c">${_unsafeWindow.username}</a> ${$$(".comiis_recommend_list_t a").length > 0 ? '<span class="f_d"> , </span>' : ""} </span>` ); } if ($$(".comiis_recommend_list_s").length > 0) { let $list_s = $$(".comiis_recommend_list_s"); domUtils.removeClass($list_s, "comiis_recommend_list_on"); domUtils.addClass($list_s, "comiis_recommend_list_on"); domUtils.prepend( $list_s, ($$(".comiis_recommend_list_s li").length > 0 ? "" : "") + '<li id="comiis_recommend_list_s' + _unsafeWindow.uid + '"><a href="home.php?mod=space&uid=' + _unsafeWindow.uid + '"><img loading="lazy" src="' + MTUtils.getAvatar(_unsafeWindow.uid, "small") + '"></a></li>' ); } domUtils.text( ".comiis_recommend_num", comiis_recommend_num + Number(_unsafeWindow.allowrecommend) ); domUtils.text( ".comiis_recommend_nums", "+" + (comiis_recommend_num + Number(_unsafeWindow.allowrecommend)) ); domUtils.html(".comiis_recommend_addkey i", ""); domUtils.removeClass(".comiis_recommend_color", "f_b"); domUtils.addClass(".comiis_recommend_color", "f_a"); if ($$(".comiis_recommend_list_s").length > 0) { if ($$(".comiis_recommend_list_s li").length < 7) { domUtils.hide(".txshow_more", false); } else { domUtils.show(".txshow_more", false); } } Qmsg.success( "点赞成功" + (recommendcList["daycount"] ? `, 您今天还能点赞 ${recommendcList["daycount"] - 1} 次` : "") ); } else if (r###ltText.indexOf( "window.location.href = 'member.php?mod=logging&action=login&mobile=2'" ) >= 0) { window.location.href = "member.php?mod=logging&action=login&mobile=2"; } else { Qmsg.error("没有点赞权限或帖子不存在"); } setTimeout(function() { _unsafeWindow.comiis_recommend_key = 0; }, 500); } return false; }); }, /** * 发表按钮|回复按钮点击事件 */ setSubmitBtnClickEvent() { const that = this; domUtils.on(this.$el.$fastpostsubmit, "click", async (event) => { var _a2, _b, _c, _d, _e, _f; utils.preventEvent(event); var $message = $("#needmessage"); var message = domUtils.val($message); message = encodeURIComponent(message); if (message == null || message === "") { return; } if (domUtils.val(that.$el.$fastpostsubmit) == "发表") { let $loading = Qmsg.loading("发表中,请稍后..."); let data = "message=" + message; $$("#imglist input[type='hidden']").forEach( ($ele) => { let key = $ele.getAttribute("name"); data += `&${key}=`; } ); data = domUtils.serialize(that.$el.$form) + "&" + data; let url = that.$data.forum_action + "reply&handlekey=fastpost&loc=1&inajax=1"; let response = await httpx.post(url, { data, fetch: true, allowInterceptConfig: false, headers: { "Content-Type": "application/x-www-form-urlencoded" } }); $loading.close(); if (!response.status) { Qmsg.error("发表失败,网络异常"); return; } let xmlDoc = utils.parseFromString( response.data.responseText, "text/xml" ); let xmlText = (_b = (_a2 = xmlDoc.lastChild) == null ? void 0 : _a2.firstChild) == null ? void 0 : _b.nodeValue; _unsafeWindow.evalscript(xmlText); if (this.handle_error(xmlText)) { return; } window.scrollTo({ top: domUtils.height(document) }); domUtils.val("#needmessage", ""); (_c = $("#comiis_head")) == null ? void 0 : _c.click(); domUtils.hide( "#comiis_foot_menu_beautify_big .reply_user_content", false ); domUtils.attr( '#comiis_foot_menu_beautify_big li[data-attr="发表"] input', "data-text", "false" ); domUtils.attr( "#comiis_foot_menu_beautify li[data-attr='回帖'] input", "placeholder", "发帖千百度,文明第一步" ); this.deleteReplyTextStorage(); } else { let data = domUtils.attr( "#comiis_foot_menu_beautify_big .reply_user_content", "data-reply-serialize" ) + message; $$("#imglist input[type='hidden']").forEach( (item) => { data = `${data}&${item.getAttribute("name")}=`; } ); let replyUrl = domUtils.attr( "#comiis_foot_menu_beautify_big .reply_user_content", "data-reply-action" ); let response = await httpx.post( replyUrl + "&handlekey=fastposts&loc=1&inajax=1", { allowInterceptConfig: false, fetch: true, data, headers: { "Content-Type": "application/x-www-form-urlencoded" } } ); if (!response.status) { Qmsg.error("回复失败,网络异常"); return; } let xmlDoc = utils.parseFromString( response.data.responseText, "text/xml" ); let xmlText = (_e = (_d = xmlDoc.lastChild) == null ? void 0 : _d.firstChild) == null ? void 0 : _e.nodeValue; log.info(xmlText); _unsafeWindow.evalscript(xmlText); if (this.handle_error(xmlText)) { return; } (_f = $(xmlText)) == null ? void 0 : _f.click(); domUtils.val("#needmessage", ""); $("#comiis_head").click(); domUtils.val( '#comiis_foot_menu_beautify_big li[data-attr="发表"] input', "发表" ); domUtils.attr( '#comiis_foot_menu_beautify_big li[data-attr="发表"] input', "data-text", "false" ); domUtils.attr( "#comiis_foot_menu_beautify li[data-attr='回帖'] input", "placeholder", "发帖千百度,文明第一步" ); window.scrollTo({ top: domUtils.height(document) }); this.deleteReplyTextStorage(true, replyUrl); } return false; }); }, /** * 全局回复按钮点击事件 */ setGlobalReplyBtnClickEvent() { domUtils.on( document, "click", '.comiis_postli_times .dialog[href*="reply"]', async (event) => { var _a2, _b, _c, _d; utils.preventEvent(event); let $reply = event.target; domUtils.attr("#comiis_foot_menu_beautify_big", "data-model", "reply"); let response = await httpx.get( domUtils.attr($reply, "datahref") || $reply.href + "&inajax=1", { fetch: true, allowInterceptConfig: false } ); if (!response.status) { Qmsg.error("网络异常,获取回复参数失败"); return; } let xmlDoc = utils.parseFromString( response.data.responseText, "text/xml" ); let xmlText = (_b = (_a2 = xmlDoc.lastChild) == null ? void 0 : _a2.firstChild) == null ? void 0 : _b.nodeValue; if (this.handle_error(xmlText)) { return; } let requestDOM = domUtils.parseHTML( `<div>${xmlText}</div>`, true, false ); let reply_url = (_c = requestDOM.querySelector(".comiis_tip .tip_tit a")) == null ? void 0 : _c.getAttribute("href"); let reply_user = domUtils.text( requestDOM.querySelector(".comiis_tip span.f_0") ); let reply_content = domUtils.val( requestDOM.querySelector( "input[name='noticeauthormsg']" ) ); let reply_action = domUtils.attr( requestDOM.querySelector("#postforms"), "action" ); let reply_serialize = domUtils.serialize( requestDOM.querySelector("#postforms") ); domUtils.text( "#comiis_foot_menu_beautify_big .reply_user_content", `回复 ${reply_user}: ${reply_content}` ); domUtils.show( "#comiis_foot_menu_beautify_big .reply_user_content", false ); (_d = $( "#comiis_foot_menu_beautify li[data-attr='回帖'] input" )) == null ? void 0 : _d.click(); domUtils.focus("#comiis_foot_menu_beautify li[data-attr='回帖'] input"); domUtils.val("#fastpostsubmitline input", "回复"); domUtils.attr( "#comiis_foot_menu_beautify_big .fastpostform_new a", "href", reply_url ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_user_content", "data-reply-url", reply_url ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_user_content", "data-reply-action", reply_action ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_user_content", "data-reply-serialize", reply_serialize ); tempReplyBtnNode = $reply; domUtils.val("#needmessage", domUtils.attr($reply, "data-text") || ""); PopsPanel.execMenu( "mt-forum-post-editorOptimizationNormal-recordInputText", () => { this.initReplyText(true, reply_url); } ); }, { capture: true } ); }, /** * 全局点击检测事件 */ setGlobalClickCheckEvent() { const that = this; let forum_url = $("#fastpostform .header_y a").href; domUtils.on(document, "click", function(event) { var _a2; let $click = event.target; if ($(".popups-popmenu") || MTEditorOptimizationNormal.$data.isU###odeInsertClick) { log.info(`点击的是弹出层,不做处理`); MTEditorOptimizationNormal.$data.isU###odeInsertClick = false; return; } else if (($click == null ? void 0 : $click.classList) && ((_a2 = $click == null ? void 0 : $click.classList) == null ? void 0 : _a2.contains(".dialog_reply")) || ($click == null ? void 0 : $click.closest) && ($click == null ? void 0 : $click.closest(".dialog_reply")) || $click === $('li[data-attr="回帖"] input')) { log.info(`点击回复按钮或者是编辑器,显示编辑器`); domUtils.hide("#comiis_foot_menu_beautify", false); domUtils.show("#comiis_foot_menu_beautify_big", false); domUtils.focus("#needmessage"); } else if (window.event && !utils.checkUserClickInNode($("#comiis_foot_menu_beautify_big"))) { log.info(`点击的其它区域,隐藏大编辑器,显示小编辑器`); domUtils.show("#comiis_foot_menu_beautify", false); domUtils.hide("#comiis_foot_menu_beautify_big", false); if (domUtils.attr("#comiis_foot_menu_beautify_big", "data-model") == "reply") { domUtils.attr( "#comiis_foot_menu_beautify_big", "data-model", "comment" ); domUtils.val("#fastpostsubmitline input", "发表"); domUtils.attr( "#comiis_foot_menu_beautify_big .fastpostform_new a", "href", forum_url ); domUtils.text( "#comiis_foot_menu_beautify_big .reply_area .reply_user_content" ); domUtils.hide( "#comiis_foot_menu_beautify_big .reply_area .reply_user_content", false ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_area .reply_user_content", "data-reply-url", "" ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_area .reply_user_content", "data-reply-action", "" ); domUtils.attr( "#comiis_foot_menu_beautify_big .reply_area .reply_user_content", "data-reply-serialize", "" ); if (tempReplyBtnNode) { domUtils.attr( tempReplyBtnNode, "data-text", domUtils.val("#needmessage") ); domUtils.val("#needmessage", ""); domUtils.attr( '#comiis_foot_menu_beautify_big li[data-attr="发表"] input', "data-text", "false" ); domUtils.attr( "#comiis_foot_menu_beautify li[data-attr='回帖'] input", "placeholder", "发帖千百度,文明第一步" ); } } if (domUtils.val(that.$el.$input) === "") { PopsPanel.execMenu( "mt-forum-post-editorOptimizationNormal-recordInputText", () => { that.initReplyText(); } ); } } }); }, /** * 菜单-图标切换事件 */ setMenuIconToggleEvent() { domUtils.on( "#comiis_foot_menu_beautify_big .menu_icon a i", "click", function(event) { let $click = this; if ($click.classList.contains("f_0")) { domUtils.hide("#comiis_foot_menu_beautify_big .menu_body", false); domUtils.removeClass( "#comiis_foot_menu_beautify_big .menu_icon a i", "f_0" ); } else { domUtils.show("#comiis_foot_menu_beautify_big .menu_body", false); domUtils.removeClass( "#comiis_foot_menu_beautify_big .menu_icon a i", "f_0" ); domUtils.addClass($click, "f_0"); } } ); }, /** * 菜单-图片点击事件 */ setMenuImageClickEvent() { domUtils.on( "#comiis_foot_menu_beautify_big .menu_icon a.comiis_pictitle", "click", function(event) { domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_post_tab", false ); domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_insert_ubb_tab", false ); domUtils.show( "#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab", false ); } ); }, /** * 菜单-图标-切换图片组的事件 */ setMenuImageToggleEvent() { domUtils.on( "#comiis_foot_menu_beautify_big #comiis_pictitle_tab #comiis_pictitle_key", "click", "li", function(event) { let $click = event.target; domUtils.removeClass( "#comiis_foot_menu_beautify_big #comiis_pictitle_tab #comiis_pictitle_key li", "bg_f" ); domUtils.addClass($click, "bg_f"); _unsafeWindow.$( "#comiis_foot_menu_beautify_big #comiis_pictitle_tab div.comiis_upbox" ).hide().eq(_unsafeWindow.$($click).index()).fadeIn(); } ); }, /** * 菜单-表情点击事件 */ setMenuSmileClickEvent() { domUtils.on( "#comiis_foot_menu_beautify_big .menu_icon a.comiis_smile", "click", function(event) { domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab", false ); domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_insert_ubb_tab", false ); domUtils.show( "#comiis_foot_menu_beautify_big .menu_body #comiis_post_tab", false ); let smileDOM = $( "#comiis_foot_menu_beautify_big .menu_body .comiis_bqbox" ); if (domUtils.attr(smileDOM, "data-isLoaded") != 1) { domUtils.attr(smileDOM, "data-isLoaded", 1); smileDOM.querySelectorAll("img").forEach((item) => { let data_src = item.getAttribute("data-src"); if (data_src) { item.setAttribute("src", data_src); } }); } } ); }, /** * 菜单-表情-切换表情组的点击事件 */ setMenuSmileTabClickEvent() { domUtils.on( "#comiis_foot_menu_beautify_big #comiis_smilies_key li", "click", function(event) { let $click = this; domUtils.removeClass( "#comiis_foot_menu_beautify_big #comiis_smilies_key li a" ); domUtils.addClass($click.querySelector("a"), "bg_f b_l b_r"); _unsafeWindow.$( "#comiis_post_tab div.swiper-wrapper.bqbox_c.comiis_optimization .swiper-slide" ).hide().eq(_unsafeWindow.$($click).index()).fadeIn(); } ); }, /** * 菜单-插入点击事件 */ setMenuInsertClickEvent() { domUtils.on( "#comiis_foot_menu_beautify_big .menu_icon a.commis_insert_bbs", "click", (event) => { domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_post_tab", false ); domUtils.hide( "#comiis_foot_menu_beautify_big .menu_body #comiis_pictitle_tab", false ); domUtils.show( "#comiis_foot_menu_beautify_big .menu_body #comiis_insert_ubb_tab", false ); } ); }, /** * 获取回复记录的占用空间 */ async getReplyRecordSize() { var _a2; let r###lt = await this.$data.db.get("data"); if (r###lt.success) { let size = utils.getTextStorageSize( ((_a2 = r###lt == null ? void 0 : r###lt.data) == null ? void 0 : _a2.length) ? JSON.stringify(r###lt.data) : "" ); return size; } else { return utils.formatByteToSize(0); } }, /** * 清空所有的回复记录 */ async clearAllReplyRecord() { return await this.$data.db.deleteAll(); }, /** * 删除存储的回复框的内容到indexedDB * @param isUserReply 是否是来自点击回复的 * @param replyUrl 回复的url */ deleteReplyTextStorage(isUserReply = false, replyUrl = void 0) { const that = this; this.$data.db.get("data").then((r###lt) => { if (!r###lt.success || r###lt.code === 201) { console.warn(r###lt); return; } let localDataIndex = r###lt.data.findIndex((item) => { if (isUserReply) { return item.forumId === that.$data.tid && replyUrl && item.repquote === MTUtils.getRepquote(replyUrl); } else { return item.forumId === that.$data.tid && utils.isNull(item.repquote); } }); if (localDataIndex !== -1) { r###lt.data.splice(localDataIndex, 1); this.$data.db.save("data", r###lt.data).then((r###lt2) => { }); } }); }, /** * 注入UBB代码 */ setMenuQuickUBB() { let $tab_list = $("#comiis_insert_ubb_tab_list"); let u###odeMap = MTQuickUBB(); Reflect.set(u###odeMap, "code", { key: "代码", value: "[code][/code]", tagL: "]", tagR: "[", L: "[code]", R: "[/code]", cursorL: "[code]", cursorLength: 7, quickUBBReplace: "[code]replace[/code]" }); Reflect.set(u###odeMap, "password", { key: "密码", value: "[password][/password]", tagL: "]", tagR: "[", L: "[password]", R: "[/password]", cursorL: "[password]", cursorLength: 10, quickUBBReplace: "[password]replace[/password]" }); Object.keys(u###odeMap).forEach((keyName) => { let value = u###odeMap[keyName]; let $ubbs = domUtils.createElement("li", { className: "quickUBBs", innerHTML: ( /*html*/ ` <a href="javascript:;" class="comiis_xifont f_d"> <i class="comiis_font"></i>${value["key"]} </a> ` ) }); domUtils.on($ubbs, "click", (event) => { domUtils.removeClass( "#comiis_insert_ubb_tab div.comiis_post_urlico ul li.quickUBBs a.comiis_xifont", "f_0" ); domUtils.addClass( "#comiis_insert_ubb_tab div.comiis_post_urlico ul li.quickUBBs a.comiis_xifont", "f_d" ); let $font = $ubbs.querySelector(".comiis_xifont"); domUtils.removeClass($font, "f_d"); domUtils.removeClass($font, "f_d"); let $prompt = __pops.prompt({ title: { text: "UBB代码", position: "center" }, content: { text: "", placeholder: `请输入需要${value["key"]}的文字`, focus: true }, btn: { ok: { text: "插入", type: "primary", callback: (details) => { if (details.text.trim() === "") { Qmsg.error("输入框不能为空或纯空格"); return; } if (value["isFunc"]) { _unsafeWindow.comiis_addsmilies( MTUBB_Rainbow(value["num"], details.text) ); } else if (value["quickUBBReplace"]) { _unsafeWindow.comiis_addsmilies( value["quickUBBReplace"].replaceAll("replace", details.text) ); } else { _unsafeWindow.comiis_addsmilies(details.text); } $prompt.close(); } }, cancel: { text: "关闭", callback: () => { $prompt.close(); } } }, width: "300px", height: "200px" }); }); $tab_list.append($ubbs); }); } }; const optimizationCSS = '.f_c,\r\n.f_c a,\r\n.ntc_body {\r\n color: #000 !important;\r\n}\r\ninput::placeholder,\r\ntextarea::placeholder {\r\n color: #cfcfcf;\r\n}\r\n#needsubject::placeholder {\r\n font-weight: 700;\r\n}\r\n#postform #comiis_mh_sub {\r\n height: 60px;\r\n display: flex;\r\n align-items: center;\r\n}\r\n#postform #comiis_post_tab {\r\n display: inherit;\r\n width: 100%;\r\n}\r\n#postform .comiis_sendbtn {\r\n padding: 0 12px;\r\n display: flex !important;\r\n -webkit-box-align: center;\r\n -moz-box-align: center;\r\n align-items: center;\r\n}\r\n#postform .f_f {\r\n color: #fff !important;\r\n}\r\n#postform #comiis_post_tab .bg_f.b_b.cl:nth-child(2) .comiis_atlist a:hover,\r\n#postform #comiis_post_tab .bg_f.b_b.cl:nth-child(2) .comiis_atlist a:link,\r\n#postform #comiis_post_tab .bg_f.b_b.cl:nth-child(2) .comiis_atlist a:visited {\r\n color: #333 !important;\r\n}\r\n#postform .comiis_post_from .comiis_post_ico.comiis_minipost_icot {\r\n position: fixed;\r\n display: inline-table;\r\n z-index: 90;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: 100%;\r\n overflow: hidden;\r\n padding: 0;\r\n}\r\n#postform .comiis_post_from #comiis_post_tab .comiis_bqbox {\r\n height: 200px;\r\n}\r\n#postform .comiis_post_from #comiis_post_tab .comiis_smiley_box {\r\n height: 150px;\r\n}\r\n#postform\r\n .comiis_post_from\r\n #comiis_post_tab\r\n .comiis_input_style\r\n .comiis_post_urlico {\r\n overflow-y: auto;\r\n height: 110px;\r\n}\r\n#postform\r\n .comiis_post_from\r\n #comiis_post_tab\r\n .comiis_smiley_box\r\n .comiis_optimization {\r\n display: block;\r\n overflow-y: auto;\r\n height: 100%;\r\n}\r\n#postform #comiis_post_tab .comiis_input_style .comiis_xifont {\r\n width: -webkit-fill-available;\r\n width: -moz-available;\r\n}\r\n#postform #comiis_post_tab .comiis_input_style .comiis_xifont i.comiis_font {\r\n font-size: 16px;\r\n line-height: inherit;\r\n padding-top: 0;\r\n}\r\n#postform #comiis_post_tab .comiis_input_style .styli_h10 {\r\n display: none;\r\n}\r\n.gm_plugin_chartbed .comiis_chartbed_hello,\r\n.gm_plugin_chartbed .comiis_chartbed_history,\r\n.gm_plugin_chartbed .comiis_chartbed_kggzs,\r\n.gm_plugin_chartbed .comiis_chartbed_luntan,\r\n.gm_plugin_chartbed .comiis_chartbed_mt,\r\n.gm_plugin_chartbed .comiis_chartbed_z4a {\r\n height: 140px;\r\n overflow-y: auto;\r\n flex-direction: column;\r\n}\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 background: #f8f8f8;\r\n}\r\n#comiis_pictitle_key a {\r\n color: #333 !important;\r\n padding: 0 10px;\r\n}\r\n#comiis_mh_sub {\r\n height: auto !important;\r\n}\r\n#comiis_mh_sub .swiper-wrapper.comiis_post_ico {\r\n flex-flow: wrap;\r\n}\r\n#comiis_mh_sub a {\r\n margin: 5px 0;\r\n}\r\n#comiis_post_tab .comiis_over_box {\r\n max-height: 225px;\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\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.gm_plugin_chartbed .delImg a,\r\n.gm_plugin_chartbed .p_img a {\r\n padding: 0;\r\n}\r\n.gm_plugin_chartbed .delImg a i {\r\n line-height: inherit;\r\n}\r\n#filedata,\r\n#filedata_hello,\r\n#filedata_kggzs,\r\n#filedata_mt {\r\n display: none;\r\n}\r\n\r\n#comiis_mh_sub {\r\n height: 40px;\r\n}\r\n#imglist .del a {\r\n padding: 0;\r\n}\r\n.comiis_post_from.mt15 {\r\n margin-top: unset !important;\r\n}\r\n'; const pathname = globalThis.location.pathname; const search = globalThis.location.search; new URLSearchParams(search); const Router = { /** * 克米签到页面 */ isKMiSign() { return pathname.startsWith("/k_misign-sign.html"); }, /** * 帖子 */ isPost() { return pathname.startsWith("/thread-") || pathname.startsWith("/forum.php") && search.startsWith("?mod=viewthread"); }, /** * 首页、精华 */ isPage() { return Boolean(pathname.match(/^\/page-([0-9]+).html/g)); }, /** * 导读链接 */ isGuide() { return pathname.startsWith("/forum.php") && search.startsWith("?mod=guide"); }, /** * 板块 */ isPlate() { return Boolean(pathname.match(/\/forum-[0-9]{1,2}-[0-9]{1,2}.html/g)); }, /** * 搜索页面 */ isSearch() { return pathname.startsWith("/search.php"); }, /** * 空间 */ isSpace() { return pathname.startsWith("/home.php") && search.startsWith("?mod=space"); }, /** * 我的个人空间 */ isMySpace() { return pathname.startsWith("/home.php") && search.startsWith("?mod=space&do=profile&mycenter"); }, /** * 个人空间页的@点进去 */ isSpaceWithAt() { return pathname.startsWith("/space-uid-"); }, /** * 社区列表 */ isForumList() { return pathname.startsWith("/forum.php") && search.startsWith("?forumlist"); }, /** * 消息提醒 */ isMessage() { return pathname.startsWith("/home.php") && search.startsWith("?mod=space&do=notice"); }, /** * 消息提醒列表 */ isMessageList() { return pathname.startsWith("/home.php") && search.startsWith("?mod=space&do=pm"); }, /** * 积分商城 */ isPointsMall() { return pathname.startsWith("/keke_integralmall-keke_integralmall.html") || pathname.startsWith("/plugin.php") && search.startsWith("?id=keke_integralmal"); }, /** * 帖子发布/回复页面 */ isPostPublish() { return pathname.startsWith("/forum.php") && search.startsWith("?mod=post"); }, /** * 投票页面 */ isPostPublish_voting() { return pathname.startsWith("/forum.php") && search.includes("&special=1") || search.includes("&fid=42"); }, /** * 帖子编辑页面 */ isPostPublish_edit() { return this.isPostPublish() && search.includes("&action=edit"); }, /** * 发帖页面,该页面是尚未存入草稿 */ isPostPublish_newthread() { return this.isPostPublish() && search.includes("&action=newthread"); }, /** * 回复编辑页面 */ isPostPublish_reply() { return this.isPostPublish() && search.includes("&action=reply"); } }; const MTSmiliesDict = () => { 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/qq104.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 MTEditorPreview = { /** * 内容转换 */ parseText(text) { const smiliesDictionaries = MTSmiliesDict(); let attachimgmatch = text.match(/\[attachimg\]([\s\S]+?)\[\/attachimg\]/g); if (attachimgmatch) { attachimgmatch.forEach((item) => { let aimgidMatch = item.match(/\[attachimg\]([\s\S]+?)\[\/attachimg\]/); let aimg_id = aimgidMatch ? aimgidMatch[aimgidMatch.length - 1] : ""; let imgtitle = domUtils.attr(`#aimg_${aimg_id}`, "title"); let imgsrc = domUtils.attr(`#aimg_${aimg_id}`, "src"); if (!imgsrc) { imgtitle = "该图片不存在"; } text = text.replace( item, `<span class="comiis_postimg vm"><img loading="lazy" id="aimg_${aimg_id}" src="${imgsrc}" alt="${imgtitle}" title="${imgtitle}"></span>` ); }); } let code = text.match(/\[code\]([\s\S]*?)\[\/code\]/g); if (code) { code.forEach((item) => { let match_content = item.match(/\[code\]([\s\S]*?)\[\/code\]/); let contentAll = match_content ? match_content[match_content.length - 1] : ""; let content = ""; let brSplit = contentAll.split("\n"); if (brSplit.length == 1) { content = `<li>${contentAll}</li>`; } else { Array.from(brSplit).forEach((item2, index) => { if (index == brSplit.length - 1) { content = `${content}<li>${item2}</li>`; } else { content = `${content}<li>${item2}<br></li>`; } }); } text = text.replace( item, ` <div class="comiis_blockcode comiis_bodybg b_ok f_b"><div class="bg_f b_l"><ol>${content}</ol></div></div>` ); }); } let url = text.match(/\[url\=[\s\S]*?\]([\s\S]*?)\[\/url\]/g); if (url) { url.forEach((item) => { let urlMatch = item.match(/\[url=([\s\S]*?)\][\s\S]*\[\/url\]/); let urlNameMatch = item.match(/\[url=[\s\S]*?\]([\s\S]*?)\[\/url\]/); let _url_ = urlMatch ? urlMatch[urlMatch.length - 1] : ""; let _url_name_ = urlNameMatch ? urlNameMatch[urlNameMatch.length - 1] : ""; text = text.replace( item, `<a href="${_url_}" target="_blank">${_url_name_}</a>` ); }); } let color = text.match(/\[color\=[\s\S]*?\]([\s\S]*?)\[\/color\]/g); if (color) { color.forEach((item) => { let colorValueMatch = item.match( /\[color=([\s\S]*?)\][\s\S]*\[\/color\]/ ); let colorTextMatch = item.match( /\[color=[\s\S]*?\]([\s\S]*?)\[\/color\]/ ); let colorValue = colorValueMatch ? colorValueMatch[colorValueMatch.length - 1] : ""; let colorText = colorTextMatch ? colorTextMatch[colorTextMatch.length - 1] : ""; text = text.replace( item, `<font color="${colorValue}">${colorText}</font>` ); }); } let size = text.match(/\[size\=[\s\S]*?\]([\s\S]*?)\[\/size\]/g); if (size) { size.forEach((item) => { let sizeValueMatch = item.match(/\[size=([\s\S]*?)\][\s\S]*\[\/size\]/); let sizeTextMatch = item.match(/\[size=[\s\S]*?\]([\s\S]*?)\[\/size\]/); let sizeValue = sizeValueMatch ? sizeValueMatch[sizeValueMatch.length - 1] : ""; let sizeText = sizeTextMatch ? sizeTextMatch[sizeTextMatch.length - 1] : ""; text = text.replace( item, `<font size="${sizeValue}">${sizeText}</font>` ); }); } let img = text.match(/\[img(|\=[\s\S]+?)\]([\s\S]*?)\[\/img\]/g); if (img) { img.forEach((item) => { let widthInfo = null; let heightInfo = null; let img_size_match = item.match(/\[img\=([\s\S]+?)\][\s\S]*?\[\/img\]/); if (img_size_match) { img_size_match = img_size_match[img_size_match.length - 1].split(","); widthInfo = img_size_match[0]; heightInfo = img_size_match[1]; } widthInfo = widthInfo ? widthInfo : ""; heightInfo = heightInfo ? heightInfo : ""; let match_content = item.match( /\[img\]([\s\S]*?)\[\/img\]|\[img=[\s\S]*?\]([\s\S]*?)\[\/img\]/ ); let content = ""; if (match_content) { if (match_content[match_content.length - 1] == null) { content = match_content[match_content.length - 2]; } else { content = match_content[match_content.length - 1]; } } text = text.replace( item, `<img loading="lazy" src="${content}" border="0" alt="" width="${widthInfo}" height="${heightInfo}" crossoriginNew="anonymous">` ); }); } let hide = text.match(/\[hide\]([\s\S]*?)\[\/hide\]/g); if (hide) { hide.forEach((item) => { let match_content = item.match(/\[hide\]([\s\S]*?)\[\/hide\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace( item, `<div class="comiis_quote bg_h f_c"><h2 class="f_a">本帖隐藏的内容: </h2>${content}</div>` ); }); } let hide2 = text.match(/\[hide=[\s\S]*?\]([\s\S]*?)\[\/hide\]/g); if (hide2) { hide2.forEach((item) => { let match_content = item.match( /\[hide=([\s\S]*?)\]([\s\S]*?)\[\/hide\]/ ); let other_info = match_content ? match_content[match_content.length - 2] : ""; other_info = other_info.split(","); let integral_big_can_see = other_info.length == 2 ? other_info[1] : ""; text = text.replace( item, `<div class="comiis_quote bg_h f_c">以下内容需要积分高于 ${integral_big_can_see} 才可浏览</div>` ); }); } let quote = text.match(/\[quote\]([\s\S]*?)\[\/quote\]/g); if (quote) { quote.forEach((item) => { let match_content = item.match(/\[quote\]([\s\S]*?)\[\/quote\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace( item, `<div class="comiis_quote bg_h b_dashed f_c"><blockquote><font>回复</font> ${content}</blockquote></div>` ); }); } let free = text.match(/\[free\]([\s\S]*?)\[\/free\]/g); if (free) { free.forEach((item) => { let match_content = item.match(/\[free\]([\s\S]*?)\[\/free\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace( item, `<div class="comiis_quote bg_h f_c"><blockquote>${content}</blockquote></div>` ); }); } let strong = text.match(/\[b\]([\s\S]*?)\[\/b\]/g); if (strong) { strong.forEach((item) => { let match_content = item.match(/\[b\]([\s\S]*?)\[\/b\]/i); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<strong>${content}</strong>`); }); } let xhx = text.match(/\[u\]([\s\S]*?)\[\/u\]/g); if (xhx) { xhx.forEach((item) => { let match_content = item.match(/\[u\]([\s\S]*?)\[\/u\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<u>${content}</u>`); }); } let qx = text.match(/\[i\]([\s\S]*?)\[\/i\]/g); if (qx) { qx.forEach((item) => { let match_content = item.match(/\[i\]([\s\S]*?)\[\/i\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<i>${content}</i>`); }); } let strike = text.match(/\[s\]([\s\S]*?)\[\/s\]/g); if (strike) { strike.forEach((item) => { let match_content = item.match(/\[s\]([\s\S]*?)\[\/s\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<strike>${content}</strike>`); }); } let smilies = text.match(/\[([\s\S]+?)\]/g); if (smilies) { smilies.forEach((item) => { let smiliesMatchSrc = smiliesDictionaries[item]; if (smiliesMatchSrc) { text = text.replace( item, `<img loading="lazy" src="${smiliesMatchSrc}" border="0" alt="" smilieid="">` ); } }); } let media = text.match(/\[media=[\s\S]+?\][\s\S]+?\[\/media\]/g); if (media) { media.forEach((item) => { let match_content = item.match( /\[media=[\s\S]*?\]([\s\S]*?)\[\/media\]/ ); let content = match_content ? match_content[match_content.length - 1] : ""; if (content) { text = text.replace( item, `<ignore_js_op><span><iframe src="${content}" border="0" scrolling="no" framespacing="0" allowfullscreen="true" style="max-width: 100%" width="100%" height="auto" frameborder="no"></iframe></span></ignore_js_op>` ); } }); } let email = text.match(/\[email=[\s\S]+?\][\s\S]+?\[\/email\]/g); if (email) { email.forEach((item) => { let email_match = item.match(/\[email=([\s\S]*?)\][\s\S]*?\[\/email\]/); let content_match = item.match( /\[email=[\s\S]*?\]([\s\S]*?)\[\/email\]/ ); let _email_ = email_match.length ? ( // @ts-ignore email_match[email_match.length - 1] ) : ""; let _content_ = content_match.length ? ( // @ts-ignore content_match[content_match.length - 1] ) : ""; if (_email_ || _content_) { text = text.replace( item, `<a href="mailto:${_email_}">${_content_}</a>` ); } }); } let align = text.match(/\[align=[\s\S]+?\][\s\S]+?\[\/align\]/g); if (align) { align.forEach((item) => { let align_match = item.match(/\[align=([\s\S]*?)\][\s\S]+?\[\/align\]/); let content_match = item.match( /\[align=[\s\S]*?\]([\s\S]+?)\[\/align\]/ ); let _align_ = align_match.length ? ( // @ts-ignore align_match[align_match.length - 1] ) : ""; let _content_ = content_match.length ? ( // @ts-ignore content_match[content_match.length - 1] ) : ""; if (_align_ || _content_) { text = text.replace( item, `<div align="${_align_}">${_content_}</div>` ); } }); } let qq = text.match(/\[qq\][\s\S]*?\[\/qq\]/g); if (qq) { qq.forEach((item) => { let match_content = item.match(/\[qq\]([\s\S]*?)\[\/qq\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace( item, `<a href="http://wpa.qq.com/msgrd?v=3&uin=${content}&site=[Discuz!]&from=discuz&menu=yes" target="_blank"><img loading="lazy" src="static/image/common/qq_big.gif" border="0"></a>` ); }); } let td = text.match(/\[td\][\s\S]+?\[\/td\]/g); if (td) { td.forEach((item) => { let match_content = item.match(/\[td\]([\s\S]*?)\[\/td\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<td>${content}</td>`); }); } let tr = text.match(/\[tr\][\s\S]+?\[\/tr\]/g); if (tr) { tr.forEach((item) => { let match_content = item.match(/\[tr\]([\s\S]*?)\[\/tr\]/); let content = match_content ? match_content[match_content.length - 1] : ""; text = text.replace(item, `<tr>${content}</tr>`); }); } let table = text.match(/\[table\][\s\S]+?\[\/table\]/g); if (table) { table.forEach((item) => { let match_content = item.match(/\[table\]([\s\S]*?)\[\/table\]/); let content = match_content ? match_content[match_content.length - 1] : ""; content = content.replace(/\n/g, ""); text = text.replace(item, `<table>${content}</table>`); }); } let list = text.match(/\[list=[\s\S]+?\][\s\S]+?\[\/list\]/g); if (list) { list.forEach((item) => { let list_model_match = item.match( /\[list=([\s\S]*?)\][\s\S]*?\[\/list\]/ ); let list_content_match = item.match( /\[list=[\s\S]*?\]([\s\S]*?)\[\/list\]/ ); let list_model = list_model_match ? list_model_match[list_model_match.length - 1] : ""; let list_type = ""; if (list_model === "a") { list_type = "litype_2"; } else if (list_model === "A") { list_type = "litype_3"; } else if (list_model.length === 1 && list_model.match(/[0-9]{1}/)) { list_type = "litype_1"; } let content = list_content_match ? list_content_match[list_content_match.length - 1] : ""; let li_split = content.split("[*]"); if (li_split.length > 1) { let newContent = ""; if (li_split[0].replace(/[\s]*/, "") == "") { li_split = li_split.slice(1); } Array.from(li_split).forEach((item2) => { newContent = `${newContent}<li>${item2}</li>`; }); content = newContent; } content = content.replace(/\n/g, ""); text = text.replace( item, `<ul type="${list_model}" class="${list_type}">${content}</ul>` ); }); } return text; }, /** * 投票的内容转换 */ parseVoteText() { let chooseColor = [ "rgb(233, 39, 37)", "rgb(242, 123, 33)", "rgb(242, 166, 31)", "rgb(90, 175, 74)", "rgb(66, 196, 245)", "rgb(0, 153, 204)", "rgb(51, 101, 174)", "rgb(42, 53, 145)", "rgb(89, 45, 142)", "rgb(219, 49, 145)", "rgb(233, 39, 37)", "rgb(242, 123, 33)", "rgb(242, 166, 31)", "rgb(90, 175, 74)", "rgb(66, 196, 245)", "rgb(0, 153, 204)", "rgb(51, 101, 174)", "rgb(42, 53, 145)", "rgb(89, 45, 142)", "rgb(219, 49, 145)" ]; let chooseContent = $$( ".comiis_polloption_add ul li:first-child div.flex .comiis_input.kmshow[type='text']" ); let maxchoices = parseInt(domUtils.val("input#maxchoices")); maxchoices = isNaN(maxchoices) ? 0 : maxchoices; maxchoices = maxchoices > 0 ? maxchoices : 0; maxchoices = maxchoices > chooseContent.length ? chooseContent.length : maxchoices; let polldatas = parseInt(domUtils.val("input#polldatas")); polldatas = isNaN(polldatas) ? 0 : polldatas; _unsafeWindow.$("input#visibilitypoll").parent().find(".comiis_checkbox").hasClass("comiis_checkbox_close") ? false : true; let overt = _unsafeWindow.$("input#overt").parent().find(".comiis_checkbox").hasClass("comiis_checkbox_close") ? false : true; let html = ""; let choosehtml = ""; chooseContent.forEach((item, index) => { if (index >= 20) { return; } choosehtml = choosehtml + ` <li class="kmnop"> <input type="${maxchoices > 1 ? "checkbox" : "radio"}"> <label><i class="comiis_font f_d"></i>${item.value}</label> </li> <li class="poll_ok cl"> <span class="bg_b"> <em style="width:2%;background-color:${chooseColor[index]}"></em> </span> <em style="color:${chooseColor[index]}">0% (0)</em> </li>`; }); html = ` <div class="comiis_poll cl comiis_input_style b_t postforum_vote"> <div class="comiis_poll_top"> <i class="comiis_font bg_a f_f"></i> <h2>${maxchoices > 1 ? '多选投票<em class="f_c"> 最多可选 ' + maxchoices + " 项</em>" : "单选投票"}</h2> <p class="f_c">共有 0 人参与投票</p> ${polldatas > 0 ? ` <p class="kmbtn"> <span class="bg_e">距结束还有: ${polldatas > 1 ? '<em class="f_a">' + (polldatas - 1) + "</em> 天 " : ""}<em class="f_a">23</em> 小时 <em class="f_a">59</em> 分钟</span> </p>` : ""} </div> <div class="comiis_poll_list comiis_input_style cl"> <ul> ${choosehtml} </ul> </div> <div class="comiis_poll_bottom cl"> <input type="submit" value="提交" class="formdialog comiis_btn kmshow bg_c f_f" disabled> ${overt ? '<div class="comiis_quote bg_h b_dashed f_a"><i class="comiis_font"></i>此为公开投票,其他人可看到您的投票项目</div>' : ""} </div> </div> `; _unsafeWindow.$(".gm_plugin_previewpostforum_html .postforum_vote").remove(); _unsafeWindow.$(".gm_plugin_previewpostforum_html .comiis_messages.comiis_aimg_show").children().eq(0).before(_unsafeWindow.$(html)); } }; const MTEditorOptimization = { $data: { db: new Utils.indexedDB("mt_full_reply_record", "input_text"), get type() { return Router.isPostPublish_voting() ? "post-vote" : "post"; }, get tid() { return MTUtils.getThreadId(window.location.href); }, get pid() { return MTUtils.getPostId(window.location.href); } }, $key: { /** 尚未发布、尚未存入草稿的序列化内容 */ noPublishSerializeText: "mt-editor-no-publish-serialize-text", /** 尚未发布、尚未存入草稿的序列化投票内容 */ noPublishVotingSerializeText: "mt-editor-no-publish-voting-serialize-text" }, $el: { /** 标题框 */ $title: null, /** 输入框 */ $input: null, /** 表单元素 */ $form: null }, init() { log.info(`编辑器优化`); addStyle(optimizationCSS); this.overridePageEditor(); }, /** * 覆盖页面的编辑器 */ overridePageEditor() { const that = this; this.$el.$title = $("#needsubject"); this.$el.$form = $("#postform"); this.$el.$input = $("#needmessage"); domUtils.hide(domUtils.parent(".comiis_scrollTop_box"), false); domUtils.css("#postform .comiis_post_from.mt15", { "margin-top": "0px !important" }); let comiis_post_tab = _unsafeWindow.$( "#postform .comiis_post_from #comiis_post_tab" ); _unsafeWindow.$("#postform .comiis_post_from .comiis_post_ico").append(comiis_post_tab); comiis_post_tab.remove(); _unsafeWindow.textarea_scrollHeight = () => { }; let comiis_delete = _unsafeWindow.$.fn.comiis_delete; _unsafeWindow.$.fn.extend({ comiis_delete: function(...args) { let r###lt = comiis_delete.call(this, ...args); utils.dispatchEvent(that.$el.$input, "input"); return r###lt; } }); domUtils.hide(".comiis_btnbox", false); this.initVotePage(); _unsafeWindow.$( ".gm_plugin_chartbed .comiis_over_box.comiis_input_style #imglist" ); addStyle( /*css*/ ` #imglist_settings button{ font-size: 13.333px; color: #9baacf; outline: none; border: none; height: 35px; width: 80px; border-radius: 10px; box-shadow: 0.3rem 0.3rem 0.6rem #c8d0e7, -0.2rem -0.2rem 0.5rem #ffffff; font-weight: 800; line-height: 40px; background: #efefef; padding: 0; display: flex; align-items: center; justify-content: center; } #imglist_settings button:active{box-shadow:inset .2rem .2rem .5rem #c8d0e7,inset -.2rem -.2rem .5rem #fff!important;color:#638ffb!important} ` ); domUtils.attr("#filedata", "multiple", true); domUtils.remove(".gm_plugin_chartbed .comiis_over_box.comiis_input_style"); domUtils.on(document, "#comiis_pictitle_key li", "click", function() { domUtils.removeClass("#comiis_pictitle_key li", "bg_f"); domUtils.addClass(this, "bg_f"); _unsafeWindow.$(".gm_plugin_chartbed .comiis_upbox").hide().eq(_unsafeWindow.$(this).index()).fadeIn(); }); let top_height = parseInt(domUtils.css("#comiis_head", "height")) || 0; let fatie_toupiao = parseInt(domUtils.css("#comiis_sub", "height")) || 0; let extra_margin_bottom = $("#pollm_c_1") ? 60 : 0; let title_height = parseInt(domUtils.css(".comiis_styli.comiis_flex", "height")) || 0; let nav_bottom_height = parseInt( domUtils.css(".comiis_post_ico.comiis_minipost_icot", "height") ) || 0; domUtils.css( "#needmessage", "height", `${window.screen.height - top_height - fatie_toupiao - 48 - title_height - nav_bottom_height - 10}px` ); domUtils.css("#needmessage", "marginBottom", extra_margin_bottom + "px"); if (Router.isPostPublish_edit() && domUtils.val("#needsubject") === "") { domUtils.hide(".comiis_styli.comiis_flex", false); } else { domUtils.attr( "#needsubject", "placeholder", "请输入完整的帖子标题 (1-80个字)" ); } domUtils.attr("#needmessage", "placeholder", "来吧,尽情发挥吧..."); if (typeof _unsafeWindow.comiis_addsmilies == "function") { _unsafeWindow.comiis_addsmilies = (_str_) => { _unsafeWindow.$("#needmessage").comiis_insert(_str_); _unsafeWindow.$("#needmessage")[0].dispatchEvent(new Event("input")); }; } if (PopsPanel.getValue( "mt-forum-post-editorOptimizationNormal-recordInputText" ) || PopsPanel.getValue("mt-forum-post-editorOptimization-recordInputText")) { this.setInputChangeEvent(); this.initReplyText(); } this.initDeleteBtn(); this.initSaveDraftBtn(); this.initSaveBtn(); this.initPostBtn(); this.initReplyBtn(); this.observerChangeEditorHeight(); this.listenResize(); this.initSelectPostingSection(); this.initUBB(); this.initImage(); this.initPreview(); this.initCharacterCount(); this.initSettingImmersionMode(); }, /** * 把存储回复框的内容设置到输入框中 */ async initReplyText() { const that = this; let data = null; let save_callback = null; let delete_callback = null; if (Router.isPostPublish_newthread()) { log.info(`新发布帖子的页面`); if (Router.isPostPublish_voting()) { log.info(`投票页面`); data = _GM_getValue( this.$key.noPublishVotingSerializeText ); delete_callback = () => { _GM_deleteValue(that.$key.noPublishVotingSerializeText); }; } else { log.info(`普通帖子页面`); data = _GM_getValue(this.$key.noPublishSerializeText); delete_callback = () => { _GM_deleteValue(this.$key.noPublishSerializeText); }; } } else if (Router.isPostPublish_edit()) { log.info(`草稿的页面`); log.info( `type:${this.$data.type} tid:${this.$data.tid} pid:${this.$data.pid}` ); let initR###lt = await this.$data.db.get("data"); if (initR###lt.code === 201) { await this.$data.db.save("data", []); } let queryR###lt = await this.$data.db.get("data"); if (queryR###lt.data) { let findValue = queryR###lt.data.find((item) => { if (item.type !== that.$data.type) { return; } if (item.tid !== that.$data.tid || item.pid !== that.$data.pid) { return; } return true; }); if (findValue) { data = findValue.data; delete_callback = async () => { let deleteQuery = await this.$data.db.get( "data" ); if (deleteQuery.data) { let deleteFindIndex = deleteQuery.data.findIndex((item) => { if (item.type !== that.$data.type) { return; } if (item.tid !== that.$data.tid || item.pid !== that.$data.pid) { return; } return true; }); if (deleteFindIndex != -1) { deleteQuery.data.splice(deleteFindIndex, 1); await this.$data.db.save( "data", deleteQuery.data ); } } }; } } } else if (Router.isPostPublish_reply()) { log.info(`回复页面`); if (PopsPanel.getValue( "mt-forum-post-editorOptimizationNormal-recordInputText" )) { let initR###lt = await MTEditorOptimizationNormal.$data.db.get("data"); if (initR###lt.code === 201) { await this.$data.db.save("data", []); } let queryR###lt = await MTEditorOptimizationNormal.$data.db.get("data"); if (queryR###lt.data) { let findValue = queryR###lt.data.find((item) => { return item.forumId === that.$data.tid && item.repquote === MTUtils.getRepquote(window.location.href); }); if (findValue) { data = findValue; } } } } if (!data) { return; } if (Router.isPostPublish_voting()) { save_callback = () => { let $title = that.$el.$form.querySelector( "input[name='subject']" ); let $content = that.$el.$form.querySelector( "textarea[name='message']" ); let $maxchoices = that.$el.$form.querySelector( "input[name='maxchoices']" ); let $expiration = that.$el.$form.querySelector( "input[name='expiration']" ); let $visibilitypoll = that.$el.$form.querySelector( "input[name='visibilitypoll']" ); let $overt = that.$el.$form.querySelector( "input[name='overt']" ); domUtils.val($title, data.title); domUtils.val($content, data.content); domUtils.val($maxchoices, data.maxchoices); domUtils.val($expiration, data.expiration); domUtils.val( $visibilitypoll, data.visibilitypoll ); domUtils.val($overt, data.overt); utils.dispatchEvent($title, "input"); utils.dispatchEvent($content, "input"); utils.dispatchEvent($maxchoices, "input"); utils.dispatchEvent($expiration, "input"); utils.dispatchEvent($visibilitypoll, "input"); utils.dispatchEvent($overt, "input"); return true; }; } else { if (Router.isPostPublish_reply()) { save_callback = () => { let $content = that.$el.$form.querySelector( "textarea[name='message']" ); domUtils.val($content, data.text); utils.dispatchEvent($content, "input"); return true; }; } else { save_callback = () => { let $title = that.$el.$form.querySelector( "input[name='subject']" ); let $content = that.$el.$form.querySelector( "textarea[name='message']" ); domUtils.val($title, data.title); domUtils.val($content, data.content); utils.dispatchEvent($title, "input"); utils.dispatchEvent($content, "input"); return true; }; } } if (Router.isPostPublish_newthread()) { log.info(`新发布帖子的页面`); if (typeof save_callback === "function") { save_callback(); } } else if (Router.isPostPublish_edit()) { log.info(`草稿的页面`); if (typeof save_callback === "function" && typeof delete_callback === "function") { __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "<p>存在历史写入的数据,是否恢复到编辑器里?</p>", html: true }, btn: { merge: true, position: "space-between", ok: { text: "恢复", callback: async (details) => { if (await save_callback()) { Qmsg.success("恢复成功"); details.close(); } } }, other: { enable: true, type: "danger", text: "删除该数据", callback: async (details) => { await delete_callback(); details.close(); Qmsg.success("删除成功"); } } }, width: "300px", height: "200px" }); } } else if (Router.isPostPublish_reply()) { log.info(`回复页面`); if (typeof save_callback === "function") { save_callback(); } } }, /** * 获取回复记录的占用空间 */ async getReplyRecordSize() { var _a2; let r###lt = await this.$data.db.get("data"); if (r###lt.success) { let size = utils.getTextStorageSize( ((_a2 = r###lt == null ? void 0 : r###lt.data) == null ? void 0 : _a2.length) ? JSON.stringify(r###lt.data) : "" ); return size; } else { return utils.formatByteToSize(0); } }, /** * 清空所有的回复记录 */ async clearAllReplyRecord() { return await this.$data.db.deleteAll(); }, /** * 删除存储的数据 */ deleteReplyTextStorage() { const that = this; this.$data.db.get("data").then((r###lt) => { if (!r###lt.success) { console.warn(r###lt); return; } let type = Router.isPostPublish_voting() ? "post-vote" : "post"; let tid = MTUtils.getThreadId(window.location.href); let pid = MTUtils.getPostId(window.location.href); let localDataIndex = r###lt.data.findIndex((item) => { if (item.type !== type) { return; } if (item.tid !== tid || item.pid !== pid) { return; } return true; }); if (localDataIndex !== -1) { r###lt.data.splice(localDataIndex, 1); that.$data.db.save("data", r###lt.data).then((r###lt2) => { }); } }); }, /** * 监听输入框内容改变 */ setInputChangeEvent() { const that = this; domUtils.on( [this.$el.$input, this.$el.$title].filter(Boolean), ["input", "propertychange"], function(event) { let data = null; if (Router.isPostPublish_voting()) { let $title = that.$el.$form.querySelector( "input[name='subject']" ); let $content = that.$el.$form.querySelector( "textarea[name='message']" ); let $maxchoices = that.$el.$form.querySelector( "input[name='maxchoices']" ); let $expiration = that.$el.$form.querySelector( "input[name='expiration']" ); let $visibilitypoll = that.$el.$form.querySelector( "input[name='visibilitypoll']" ); let $overt = that.$el.$form.querySelector( "input[name='overt']" ); data = { title: $title.value, maxchoices: $maxchoices.value, expiration: $expiration.value, visibilitypoll: $visibilitypoll.checked, overt: $overt.checked, content: $content.value }; } else { let $title = that.$el.$form.querySelector( "input[name='subject']" ); let $content = that.$el.$form.querySelector( "textarea[name='message']" ); data = { title: $title == null ? void 0 : $title.value, content: $content.value }; } if (Router.isPostPublish_newthread()) { log.info(`内容改变 ==> 新发布帖子的页面`); if (Router.isPostPublish_voting()) { _GM_setValue(that.$key.noPublishVotingSerializeText, data); } else { _GM_setValue(that.$key.noPublishSerializeText, data); } } else if (Router.isPostPublish_edit()) { log.info(`内容改变 ==> 草稿的页面`); that.$data.db.get("data").then((r###lt) => { if (!r###lt.success) { console.warn(r###lt); return; } let localDataIndex = r###lt.data.findIndex((item) => { if (item.type !== that.$data.type) { return; } if (item.tid !== that.$data.tid || item.pid !== that.$data.pid) { return; } return true; }); if (localDataIndex !== -1) { r###lt.data.splice(localDataIndex, 1); } r###lt.data.push({ url: window.location.href, data, pid: that.$data.pid, tid: that.$data.tid, type: that.$data.type }); that.$data.db.save("data", r###lt.data).then((r###lt2) => { }); }); } else if (Router.isPostPublish_reply()) { log.info(`内容改变 ==> 回复页面`); PopsPanel.execMenu( "mt-forum-post-editorOptimizationNormal-recordInputText", () => { MTEditorOptimizationNormal.$data.db.get("data").then((r###lt) => { if (!r###lt.success || r###lt.code === 201) { console.warn(r###lt); return; } let localDataIndex = r###lt.data.findIndex((item) => { return item.forumId === that.$data.tid && item.repquote === MTUtils.getRepquote(window.location.href); }); if (localDataIndex !== -1) { if (data.content == null || data.content === "") { r###lt.data.splice(localDataIndex, 1); } else { r###lt.data[localDataIndex] = utils.assign( r###lt.data[localDataIndex], { text: data.content } ); } } else { r###lt.data.push({ forumId: that.$data.tid, url: window.location.href, repquote: MTUtils.getRepquote(window.location.href), text: data.content }); } MTEditorOptimizationNormal.$data.db.save("data", r###lt.data).then((r###lt2) => { }); }); } ); } } ); }, /** * 初始化删除按钮 */ initDeleteBtn() { let btn_del = $(".comiis_btnbox .comiis_btn.bg_del"); if (!btn_del) { return; } let $header = $("#comiis_head .header_y"); let $btn = domUtils.createElement( "input", { className: "new_btn_del" }, { type: "button", value: "删除" } ); domUtils.append($header, $btn); domUtils.on($btn, "click", function() { __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "<p>是否删除帖子?</p>", html: true }, btn: { ok: { callback: (details) => { details.close(); _unsafeWindow.comiis_delthread(); } } }, width: "300px", height: "200px" }); }); }, /** * 初始化保存按钮 */ initSaveBtn() { let $save = domUtils.selector( ".comiis_btnbox button#postsubmit:contains('保存')" ); if (!$save) { return; } if (domUtils.text($save).includes("草稿")) { return; } let $header = $("#comiis_head .header_y"); let $btn = domUtils.createElement( "input", { className: "new_btn_save" }, { type: "button", value: "保存" } ); domUtils.append($header, $btn); domUtils.on($btn, "click", function() { $save.click(); }); }, /** * 初始化发表按钮 */ initPostBtn() { let $post = domUtils.selector( ".comiis_btnbox button#postsubmit:contains('发表')" ); if (!$post) { return; } let $header = $("#comiis_head .header_y"); let $btn = domUtils.createElement( "input", { className: "new_btn_post" }, { type: "button", value: "发表" } ); domUtils.append($header, $btn); domUtils.on($btn, "click", function() { domUtils.val("#postsave", 0); $post.click(); }); }, /** * 初始化回复按钮 */ initReplyBtn() { const that = this; let $reply = domUtils.selector( ".comiis_btnbox button#postsubmit:contains('回复')" ); if (!$reply) { return; } let $header = $("#comiis_head .header_y"); let $btn = domUtils.createElement( "input", { className: "new_btn_reply" }, { type: "button", value: "回复" } ); domUtils.append($header, $btn); domUtils.on($btn, "click", function() { $reply.click(); that.deleteReplyTextStorage(); }); }, /** * 初始化投票页面 */ initVotePage() { if (!$$(".comiis_scrollTop_box").length) { return; } _unsafeWindow.$("#htmlon").parent().append( /*html*/ ` <li class="comiis_styli_m f15 comiis_flex b_b"> <div class="flex">发表帖子</div> <div class="styli_r"> <input type="checkbox" name="usesig" value="1" class="comiis_checkbox_key"> <label for="" class="wauto"> <code class="bg_f b_ok comiis_checkbox comiis_choose_post comiis_checkbox_close"></code> </label> </div> </li> <li class="comiis_styli_m f15 comiis_flex b_b"> <div class="flex">发投票</div> <div class="styli_r"> <input type="checkbox" name="usesig" value="1" class="comiis_checkbox_key"> <label for="" class="wauto"> <code class="bg_f b_ok comiis_checkbox comiis_choose_vote comiis_checkbox_close"></code> </label> </div> </li> ` ); if (_unsafeWindow.$(".comiis_scrollTop_box .swiper-slide a:contains('发表帖子')").attr("class") != "f_c") { _unsafeWindow.$(".comiis_checkbox.comiis_choose_post").removeClass("comiis_checkbox_close"); } else { _unsafeWindow.$(".comiis_checkbox.comiis_choose_vote").removeClass("comiis_checkbox_close"); } _unsafeWindow.$(".comiis_checkbox.comiis_choose_post").on("click", function() { let obj = _unsafeWindow.$(this); obj.addClass("comiis_checkbox_close"); _unsafeWindow.$(".comiis_checkbox.comiis_choose_vote").addClass("comiis_checkbox_close"); obj.removeClass("comiis_checkbox_close"); window.location.href = window.location.href.replace("&special=1", ""); }); _unsafeWindow.$(".comiis_checkbox.comiis_choose_vote").on("click", function() { let obj = _unsafeWindow.$(this); obj.addClass("comiis_checkbox_close"); _unsafeWindow.$(".comiis_checkbox.comiis_choose_post").addClass("comiis_checkbox_close"); obj.removeClass("comiis_checkbox_close"); window.location.href = window.location.href + "&special=1"; }); }, /** * 初始化保存草稿按钮 */ initSaveDraftBtn() { let $saveDraft = domUtils.selector( ".comiis_btnbox button#postsubmit em:contains('保存草稿')" ); if (!$saveDraft) { return; } let $header = $("#comiis_head .header_y"); let $btn = domUtils.createElement( "input", { className: "new_btn_save_temp" }, { type: "button", value: "保存草稿" } ); $("#needsubject"); domUtils.append($header, $btn); domUtils.selector( ".comiis_scrollTop_box .swiper-slide a:contains('发表帖子')" ); domUtils.on($btn, "click", function() { $saveDraft.click(); }); }, /** * 动态修改编辑器的高度 */ observerChangeEditorHeight() { var recordHeight = 0; utils.waitNode("#postform > div > div.comiis_post_ico.comiis_minipost_icot").then((element) => { utils.mutationObserver(element, { callback: (mutations) => { var $tar = $( "#postform > div > div.comiis_post_ico.comiis_minipost_icot" ); let height = window.getComputedStyle($tar).getPropertyValue("height"); if (height.toString() === recordHeight.toString()) { return; } recordHeight = parseInt(height); let needMessageSeeHeight = document.documentElement.clientHeight - $( "#postform > div > div.comiis_post_ico.comiis_minipost_icot" ).getBoundingClientRect().height - $("#needmessage").getBoundingClientRect().top; if (needMessageSeeHeight - 5 < 100) { _unsafeWindow.$("#needmessage").css("height", "100px"); _unsafeWindow.$( ".gm_plugin_previewpostforum_html.double-preview .comiis_over_box" ).css("height", "100px"); } else { _unsafeWindow.$("#needmessage").css("height", needMessageSeeHeight - 5 + "px"); _unsafeWindow.$( ".gm_plugin_previewpostforum_html.double-preview .comiis_over_box" ).css("height", needMessageSeeHeight - 5 + "px"); } }, config: { childList: true, /* 属性的变动 */ attributes: true, /* 节点内容或节点文本的变动 */ characterData: true, /* 是否将观察器应用于该节点的所有后代节点 */ subtree: true } }); }); }, /** * 监听窗口大小变化 */ listenResize() { domUtils.on(window, "resize", function() { let needMessageSeeHeight = document.documentElement.clientHeight - $( "#postform > div > div.comiis_post_ico.comiis_minipost_icot" ).getBoundingClientRect().height - $("#needmessage").getBoundingClientRect().top; if (needMessageSeeHeight - 5 < 100) { domUtils.css("#needmessage", "height", "100px"); domUtils.css( ".gm_plugin_previewpostforum_html.double-preview .comiis_over_box", "height", "100px" ); } else { log.info("设置输入框、预览高度", needMessageSeeHeight - 5); domUtils.css("#needmessage", "height", needMessageSeeHeight - 5 + "px"); domUtils.css( ".gm_plugin_previewpostforum_html.double-preview .comiis_over_box", "height", needMessageSeeHeight - 5 + "px" ); } }); }, /** * 注入选择板块功能 */ initSelectPostingSection() { addStyle( /*css*/ ` #select-post-section { height: 28px; width: 160px; line-height: 28px; border: 1px solid #ececec; background: url(w.png) no-repeat; background-position: 95% 50%; -webkit-appearance: none; appearance: none; -moz-appearance: none; } ` ); let section_dict = { 2: "版本发布", 37: "插件交流", 38: "建议反馈", 41: "逆向交流", 39: "玩机交流", 42: "编程开发", 40: "求助问答", 44: "综合交流", 50: "休闲灌水", 46: "官方公告", 53: "申诉举报", 92: "站务专区" }; domUtils.before( ".comiis_post_from .comiis_wzpost.comiis_input_style .comiis_styli:contains('标题')", /*html*/ ` <li class="comiis_styli_section comiis_flex b_b" style="padding: 10px 12px;font-size: 16px;"> <div class="styli_section f_c" style="padding-right: 8px;vertical-align: top;">板块</div> <div class="flex"> <select id="select-post-section" style="vertical-align:top;border-color:transparent;font-size: 17px;font-weight: 300;text-overflow:ellipsis;white-space:nowrap;"> <option value="2">版本发布</option> <option value="37">插件交流</option> <option value="38">建议反馈</option> <option value="39">玩机交流</option> <option value="40">求助问答</option> <option value="41">逆向交流</option> <option value="42">编程开发</option> <option value="44">综合交流</option> <option value="46">官方公告</option> <option value="50">休闲灌水</option> <option value="53">申诉举报</option> <option value="92">站务专区</option> </select> </div> </li> ` ); let $select = $(`#select-post-section`); let currentSection = MTUtils.getForumId(window.location.href); if (Router.isPostPublish_newthread()) { log.info(`发帖`); domUtils.on($select, "change", function() { let fid = domUtils.val($select); let postSection = `forum.php?mod=post&action=newthread&fid=${fid}&extra=&topicsubmit=yes&mobile=2`; log.info(`修改发帖板块: ${section_dict[fid]} ${postSection}`); let classifyClassNameDict = { 求助问答: { className: "gm_user_select_help", optionHTML: `<option value="0" selected="selected">请选择</option> <option value="59">求助问答</option> <option value="58">已解决</option>` }, 建议反馈: { className: "gm_user_select_feedback", optionHTML: `<option value="0" selected="selected">请选择</option> <option value="62">BUG反馈</option> <option value="63">意见反馈</option> <option value="65">论坛问题</option> <option value="64">已解决</option>` }, 站务专区: { className: "gm_user_select_depot", optionHTML: `<option value="0" selected="selected">请选择</option> <option value="42">版主申请</option> <option value="43">职位调整</option>` } }; let otherSelect = classifyClassNameDict[section_dict[fid]]; if (otherSelect) { domUtils.remove( domUtils.parent(".comiis_post_from .styli_tit:contains('分类')") ); domUtils.before( ".comiis_stylino.comiis_needmessage", /*html*/ ` <li class="comiis_styli comiis_flex b_b ${otherSelect["className"]}"> <div class="styli_tit f_c">分类</div> <div class="flex comiis_input_style"> <div class="comiis_login_select"> <span class="inner"> <i class="comiis_font f_d"></i> <span class="z"> <span class="comiis_question" id="typeid_name">请选择</span> </span> </span> <select id="typeid" name="typeid"> ${otherSelect["optionHTML"]} </select> </div> </div> </li> ` ); } else { Object.keys(classifyClassNameDict).forEach((key) => { domUtils.remove( ".comiis_post_from ." + classifyClassNameDict[key]["className"] ); }); } domUtils.attr("#postform", "action", postSection); }); } else { domUtils.attr($select, "disabled", true); } domUtils.val($select, currentSection); domUtils.trigger($select, "change"); }, /** * 字符计数 */ initCharacterCount() { log.info(`添加功能:字符计数`); addStyle( /*css*/ ` .gm_plugin_word_count{display:flex} .gm_plugin_word_count::after{content:"/20000"} ` ); domUtils.append( "#comiis_mh_sub .swiper-wrapper.comiis_post_ico", /*html*/ ` <a href="javascript:;" class="swiper-slide gm_plugin_word_count"> <p>0</p> </a>` ); domUtils.on(this.$el.$input, ["input", "propertychange"], (event) => { let userInputText = this.$el.$input.value; let userInputTextLength = utils.getTextLength(userInputText); let parsedText = MTEditorPreview.parseText(userInputText); domUtils.html( ".gm_plugin_previewpostforum_html .comiis_message_table", parsedText ); let wordCountDom = $(".gm_plugin_word_count p"); domUtils.text(wordCountDom, userInputTextLength); if (userInputTextLength > 2e4 || userInputTextLength < 10) { domUtils.attr(wordCountDom, "style", "color: red;"); } else { domUtils.attr(wordCountDom, "style", ""); } }); }, /** * 自定义的其它ubb */ initUBB() { if (!$(".comiis_post_urlico")) { log.error("未找到插入元素"); return; } addStyle( /*css*/ ` #comiis_post_tab .comiis_input_style .comiis_post_urlico li a.f_0{ color: #53bcf5 !important; } ` ); let u###ode = MTQuickUBB(); let parentEle = $(".comiis_post_urlico > ul"); let contentEle = $("#comiis_post_qydiv > ul"); let childNums = $$("#comiis_post_qydiv ul li").length; ExtendJQueryFn(); domUtils.on( "#comiis_post_tab .comiis_input_style .comiis_post_urlico li", "click", function() { domUtils.removeClass( "#comiis_post_tab .comiis_input_style .comiis_post_urlico li a", "f_0" ); domUtils.addClass( "#comiis_post_tab .comiis_input_style .comiis_post_urlico li a", "f_d" ); domUtils.attr(this.querySelector("a"), "class", "comiis_xifont f_0"); _unsafeWindow.$("#comiis_post_qydiv ul li").hide().eq(_unsafeWindow.$(this).index()).fadeIn(); } ); _unsafeWindow.$.each(u###ode, function(key, value) { let $ubbs = domUtils.createElement("li", { className: "quickUBBs", innerHTML: ( /*html*/ ` <a href="javascript:;" class="comiis_xifont f_d"><i class="comiis_font"></i>${value["key"]}</a> ` ) }); domUtils.on($ubbs, "click", (event) => { let bottomEle = $( `#comiis_post_qydiv li[data-key='${value.key}']` ); if (!bottomEle) { log.error("未找到该元素"); return; } $$( "#comiis_post_tab div.comiis_post_urlico ul li a.comiis_xifont" ).forEach(($ele) => { $ele.className = "comiis_xifont f_d"; }); let $childAnchor = $ubbs.querySelector("a"); $childAnchor.className = "comiis_xifont f_0"; let contentIndex = childNums + Object.keys(u###ode).indexOf(key); _unsafeWindow.$("#comiis_post_qydiv ul li").hide().eq(contentIndex).fadeIn(); }); domUtils.append(parentEle, $ubbs); let ubbs_content = document.createElement("li"); ubbs_content.setAttribute("style", "display: none;"); ubbs_content.setAttribute("data-key", value["key"]); ubbs_content.innerHTML = /*html*/ ` <div class="comiis_styli_m f15" style="padding-top:12px;"> <div class="bg_e comiis_p5" style="border-radius:4px"> <textarea class="comiis_pt kmshow f_c" id="comiis_input_${key}" style="font-size:15px" placeholder="请输入需要${value["key"]}的文字"></textarea> </div> </div> <div class="comiis_styli_m f15 comiis_flex" style="padding-top:0;"> <div class="styli_tit"> <button class="comiis_sendbtn bg_0 f_f" data-keyI="${key}" type="button">插入</button> </div> <div class="flex"></div> </div>`; domUtils.append(contentEle, ubbs_content); domUtils.on(`.comiis_sendbtn[data-keyI="${key}"]`, "click", () => { let text = _unsafeWindow.$(`#comiis_input_${key}`).val(); if (text == "") { Qmsg.warning("请输入需要插入的内容"); return; } let currentUBBObj = u###ode[key]; if (currentUBBObj["isFunc"]) { text = MTUBB_Rainbow(currentUBBObj["num"], text); } if (currentUBBObj.hasOwnProperty("L")) { text = currentUBBObj["L"] + text + currentUBBObj["R"]; } _unsafeWindow.$("#needmessage").insertAtCaret(text); if (currentUBBObj.hasOwnProperty("cursorL")) { _unsafeWindow.$("#needmessage").moveCursorToCenterByTextWithLeft( currentUBBObj["cursorL"], currentUBBObj["cursorLength"] ); } if (currentUBBObj.hasOwnProperty("cursorR")) { _unsafeWindow.$("#needmessage").moveCursorToCenterByTextWithRight( currentUBBObj["cursorR"], currentUBBObj["cursorLength"] ); } }); }); }, /** * 图片功能 */ initImage() { log.info(`添加功能:图片`); addStyle( /*css*/ ` #comiis_pictitle_tab .comiis_upbox{ height: 140px; overflow-y: auto; } ` ); let imageBtnHTML = ( /*html*/ ` <a href="javascript:;" class="comiis_pictitle"><i class="comiis_font"><em>图片</em></i></a>` ); domUtils.append( "#comiis_mh_sub .swiper-wrapper.comiis_post_ico", imageBtnHTML ); domUtils.on(".comiis_pictitle", "click", function() { let $click = this; let $font = $click.querySelector("i.comiis_font"); if (!$font.classList.contains("f_0")) { domUtils.show(".gm_plugin_chartbed", false); } else { domUtils.hide(".gm_plugin_chartbed", false); } }); domUtils.append( "#comiis_post_tab", /*html*/ ` <div id="comiis_pictitle_tab" class="gm_plugin_chartbed" style="display: none"> <!-- <div class="comiis_upbox bg_f cl"> <ul id="mt-imglist" class="comiis_post_imglist cl"> <li class="up_btn"> <a href="javascript:;" class="bg_e b_ok f_d"> <i class="comiis_font"></i> </a> </li> </ul> </div> --> <div class="bqbox_t"> <ul id="comiis_pictitle_key"> <li class="bg_f" id="comiis_pictitle_tab_n_1"><a href="javascript:;" class="">论坛</a></li> </ul> </div> </div> ` ); let originImageList = $("#imglist"); let originImageListParent = domUtils.parent(originImageList); domUtils.before(".gm_plugin_chartbed .bqbox_t", originImageListParent); domUtils.on("#imglist .comiis_font", "click", (event) => { $("#filedata").click(); }); domUtils.on( "#comiis_pictitle_tab #comiis_pictitle_key", "click", "li", function(event) { let $click = event.target; domUtils.removeClass( "#comiis_pictitle_tab #comiis_pictitle_key li", "bg_f" ); domUtils.addClass($click, "bg_f"); _unsafeWindow.$("#comiis_pictitle_tab div.comiis_upbox").hide().eq(_unsafeWindow.$($click).index()).fadeIn(); } ); PopsPanel.execMenuOnce("mt-image-bed-hello-enable", () => { MTEditorImageBed_Hello.init(); }); PopsPanel.execMenuOnce("mt-image-bed-mt-enable", () => { MTEditorImageBed_MT.init(); }); }, /** * 双列预览 */ initPreview() { const that = this; log.info(`添加功能:双列预览`); addStyle( /*css*/ ` .gm_plugin_previewpostforum_html .comiis_message_table{margin-top:10px;font-weight:initial;line-height:24px} .gm_plugin_previewpostforum_html .comiis_message_table a{height:auto;float:unset;color:#507daf!important} .gm_plugin_previewpostforum_html .comiis_message_table i{text-align:unset;font-size:unset;line-height:unset;padding-top:unset;display:unset} .comiis_postli.comiis_list_readimgs.nfqsqi{width:100vw} .gm_plugin_previewpostforum_html.double-preview{width:50vw} .gm_plugin_previewpostforum_html.double-preview .comiis_over_box.comiis_input_style{border-left:1px solid} ` ); let previewBtnHTML = ( /*html*/ ` <a href="javascript:;" class="swiper-slide gm_plugin_previewpostforum"> <i class="comiis_font" style="display: flex;flex-direction: column;padding-top: 1px;"> <svg t="1661243615511" class="icon" viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2399" width="22" height="22" fill="currentColor"> <path d="M470.1 885.3H208.8V138.7h597.3v336c0 20.6 16.7 37.3 37.3 37.3 20.6 0 37.3-16.7 37.3-37.3v-336c0-41.2-33.4-74.7-74.7-74.7H208.8c-41.2 0-74.7 33.4-74.7 74.7v746.7c0 41.2 33.4 74.7 74.7 74.7h261.3c20.6 0 37.3-16.7 37.3-37.3 0.1-20.8-16.6-37.5-37.3-37.5z" p-id="2400"></path> <path d="M641.3 496.5c-54.3 0-108.5 23.5-146.2 70.5-54.7 68.3-53.4 168.6 2.8 235.6 37.5 44.8 90.5 67.2 143.4 67.2 35.9 0 71.8-10.3 103-30.9l81.8 81.8c7.3 7.3 16.8 10.9 26.4 10.9 9.6 0 19.1-3.6 26.4-10.9 14.6-14.6 14.6-38.2 0-52.8l-81.8-81.8c48-72.5 40.1-171.1-23.7-234.9-36.5-36.4-84.3-54.7-132.1-54.7z m0 298.7c-36.5 0-72.9-17.6-95.3-52.9-22.6-35.6-22.6-82.5 0-118.1 22.4-35.3 58.9-52.9 95.3-52.9 36.5 0 72.9 17.6 95.3 52.9 22.6 35.6 22.6 82.5 0 118.1-22.4 35.2-58.8 52.9-95.3 52.9z" p-id="2401"></path> </svg> <em style="bottom: 1px;position: relative;">预览</em> </i> </a>` ); domUtils.append( "#comiis_mh_sub .swiper-wrapper.comiis_post_ico", previewBtnHTML ); domUtils.css(domUtils.parent(this.$el.$input), "display", "flex"); domUtils.after( this.$el.$input, /*html*/ ` <div class="bg_f cl gm_plugin_previewpostforum_html double-preview" style="display: none;"> <div class="comiis_over_box comiis_input_style"> <div class="comiis_postli comiis_list_readimgs nfqsqi" style="width: 50vw;"> <div class="comiis_message bg_f view_one cl message" style="margin-bottom: auto;padding: 0px 12px 0px 12px;"> <div class="comiis_messages comiis_aimg_show cl" style="overflow-y: auto;position: relative;"> <div class="comiis_a comiis_message_table cl" style="margin: 0;"></div> </div> </div> </div> </div> </div>` ); domUtils.on( ".gm_plugin_previewpostforum", "click", function(event) { let $click = this; if ($$("#polldatas").length) { MTEditorPreview.parseVoteText(); } let $font = $click.querySelector("i.comiis_font"); if (!$font.classList.contains("f_0")) { domUtils.show(".gm_plugin_previewpostforum_html", false); let parsedText = MTEditorPreview.parseText( domUtils.val(that.$el.$input) ); domUtils.html( ".gm_plugin_previewpostforum_html .comiis_message_table", parsedText ); domUtils.css( ".gm_plugin_previewpostforum_html.double-preview .comiis_over_box.comiis_input_style", "height", domUtils.css(that.$el.$input, "height") ); } else { domUtils.hide(".gm_plugin_previewpostforum_html", false); } } ); }, /** * 初始化设置功能-使用沉浸模式 */ initSettingImmersionMode() { log.info(`初始化设置功能-使用沉浸模式`); domUtils.append( domUtils.parent("#htmlon"), /*html*/ ` <li class="comiis_styli_m f15 comiis_flex b_b"> <div class="flex">使用沉浸输入</div> <div class="styli_r"> <input type="checkbox" name="immersiveinput" id="immersiveinput" value="" class="comiis_checkbox_key"> <label for="immersiveinput" class="wauto"> <code class="bg_f b_ok comiis_checkbox comiis_checkbox_close"></code> </label> </div> </li> ` ); domUtils.on("#immersiveinput", "click", function() { let $click = this; let code_obj = domUtils.parent($click).querySelector(".comiis_checkbox"); let elementList = [ /* 板块、标题 */ ".comiis_wzpost ul li.comiis_flex", /* 回复别人的quote */ ".comiis_wzpost ul li.comiis_styli.kmquote", /* 投票,最多可填写 20 个选项 */ domUtils.parent(domUtils.parent("#pollchecked")), /* 投票,增加一项 */ "#pollm_c_1", /* 投票,增加一项(编辑状态下) */ ".comiis_polloption_add+div.f_0", /* 投票,内容 */ ".comiis_wzpost ul li.comiis_thread_content:contains('内容')", /* 顶部header */ "div#comiis_head", /* 后面的 */ "div#comiis_head+*:not([class])" ]; if (domUtils.hasClass(code_obj, "comiis_checkbox_close")) { elementList.forEach(($ele) => { $ele && domUtils.hide($ele, false); }); } else { elementList.forEach(($ele) => { $ele && domUtils.show($ele, false); }); } window.dispatchEvent(new Event("resize")); }); } }; const Component_ForumPost = { id: "component-forum-post", title: "帖子", forms: [ { text: "", type: "forms", forms: [ { text: "功能", type: "deepMenu", forms: [ { text: "", type: "forms", forms: [ UISwitch( "自动展开内容", "mt-forum-post-autoExpandContent", true, void 0, "注入CSS展开帖子的内容" ), UISwitch( "修复图片宽度", "mt-forum-post-repairImageWidth", true, void 0, "修复图片宽度超出页面宽度的问题" ), UISwitch( "移除帖子字体效果", "mt-forum-post-removeFontStyle", false, void 0, "" ), UISwitch( "移除评论区的字体效果", "mt-forum-post-removeCommentFontStyle", false, void 0, "" ), UISwitch( "添加【点评】按钮", "mt-forum-post-addCommentOnBtn", false, void 0, "在评论区的每个评论右下角添加按钮" ), UISwitch( "附件点击提醒", "mt-forum-post-setAttachmentsClickTip", true, void 0, "阻止默认点击附件就会触发附件下载" ), UISwitch( "代码块优化", "mt-forum-post-codeQuoteOptimization", true, void 0, "自动检测代码块语言并设置关键字高亮" ), UISwitch( "图片查看优化", "mt-forum-post-optimizationImagePreview", true, void 0, "使用Viewer查看图片" ) ] } ] }, { text: "自动加载评论", type: "deepMenu", forms: [ { type: "forms", text: "", forms: [ UISwitch( "自动加载下一页评论", "mt-forum-post-loadNextPageComment", true, void 0, "" ), UISwitch( "同步加载的地址", "mt-forum-post-syncNextPageUrl", false, void 0, "便于刷新页面会停留在当前查看的评论页面" ) ] } ] }, { text: "编辑器-简略版", type: "deepMenu", forms: [ { type: "forms", text: "", forms: [ UISwitch( "启用", "mt-forum-post-editorOptimizationNormal", true, void 0, "优化样式,插入###ode代码等" ), UISwitch( "自动保存输入记录", "mt-forum-post-editorOptimizationNormal-recordInputText", true, void 0, "当回复时会自动清空记录" ), UIButton( "清空回复记录", "当前占用空间大小:计算中", "清理", void 0, false, false, "default", async (event) => { let $click = event.target; let $li = $click.closest("li"); let $desc = $li.querySelector( ".pops-panel-item-left-desc-text" ); let r###lt = await MTEditorOptimizationNormal.clearAllReplyRecord(); if (r###lt.success) { Qmsg.success("清理成功"); domUtils.text( $desc, `当前占用空间大小:${await MTEditorOptimizationNormal.getReplyRecordSize()}` ); } else { Qmsg.error("清理失败 " + r###lt.msg); } }, async (formCOnfig, container) => { let $desc = container.target.querySelector( ".pops-panel-item-left-desc-text" ); domUtils.text( $desc, `当前占用空间大小:${await MTEditorOptimizationNormal.getReplyRecordSize()}` ); } ) ] } ] }, { text: "编辑器-完整版", type: "deepMenu", forms: [ { type: "forms", text: "", forms: [ UISwitch( "启用", "mt-forum-post-publish-editorOptimization", true, void 0, "优化样式,插入###ode代码,双列预览等" ), UISwitch( "自动保存输入记录", "mt-forum-post-editorOptimization-recordInputText", true, void 0, "当回复/发表时会自动清空记录" ), UIButton( "清空回复记录", "当前占用空间大小:计算中", "清理", void 0, false, false, "default", async (event) => { let $click = event.target; let $li = $click.closest("li"); let $desc = $li.querySelector( ".pops-panel-item-left-desc-text" ); let r###lt = await MTEditorOptimization.clearAllReplyRecord(); if (r###lt.success) { Qmsg.success("清理成功"); domUtils.text( $desc, `当前占用空间大小:${await MTEditorOptimization.getReplyRecordSize()}` ); } else { Qmsg.error("清理失败 " + r###lt.msg); } }, async (formCOnfig, container) => { let $desc = container.target.querySelector( ".pops-panel-item-left-desc-text" ); domUtils.text( $desc, `当前占用空间大小:${await MTEditorOptimization.getReplyRecordSize()}` ); } ) ] } ] }, { text: "编辑器-图床配置", type: "deepMenu", forms: [ { type: "forms", text: `<a href="https://www.helloimg.com/" target="_blank">Hello图床</a>`, forms: [ UISwitch( "启用", "mt-image-bed-hello-enable", false, void 0, "启用Hello图床" ), UIInput( "账号", "mt-image-bed-hello-account", "", "", void 0, "必填" ), UIInput( "密码", "mt-image-bed-hello-password", "", "", void 0, "必填", false, true ), UIInput( "token", "mt-image-bed-hello-token", "", "", void 0, "必填", false, true ) ] }, { type: "forms", text: `<a href="https://img.binmt.cc/" target="_blank">MT图床</a>`, forms: [ UISwitch( "启用", "mt-image-bed-mt-enable", true, void 0, "启用MT图床" ) ] }, { type: "forms", text: "图片水印", forms: [ UISwitch( "启用", "mt-image-bed-watermark-enable", false, void 0, "开启后会为图床图片添加文字水印" ), UISwitch( "自动添加水印", "mt-image-bed-watermark-autoAddWaterMark", false, void 0, "开启后会自动添加水印,关闭后会有添加水印后的图片预览" ), UIInput("水印文字", "mt-image-bed-watermark-text", "MT论坛"), UIInput( "颜色", "mt-image-bed-watermark-text-color", "#000000", void 0, void 0, "", false, false, (formCOnfig, container) => { var _a2, _b; let $input = (_a2 = container.target) == null ? void 0 : _a2.querySelector("input"); let $suffix = (_b = container.target) == null ? void 0 : _b.querySelector( ".pops-panel-input__suffix" ); domUtils.hide($suffix, false); $input.setAttribute("type", "color"); domUtils.css($input, { margin: "unset", padding: "unset", width: "80px" }); } ), UIInput( "大小", "mt-image-bed-watermark-font-size", 16, void 0, void 0, void 0, true ), UIInput( "透明度", "mt-image-bed-watermark-font-opacity", 1, void 0, void 0, void 0, true ), UIInput( "左右间距", "mt-image-bed-watermark-left-right-margin", 80, void 0, void 0, void 0, true ), UIInput( "上下间距", "mt-image-bed-watermark-top-bottom-margin", 80, void 0, void 0, void 0, true ), UIInput( "旋转角度", "mt-image-bed-watermark-rotate", 45, void 0, void 0, void 0, true ) ] } ] } ] } ] }; const Component_Search = { id: "component-search", title: "搜索", forms: [ { type: "forms", text: "", forms: [ UISwitch( "显示搜索历史", "mt-search-showSearchHistory", true, void 0, "自动记住搜索历史并显示" ), UISwitch( "修复清空按钮", "mt-search-repairClearBtn", true, void 0, "修复点击清空按钮不清空输入框的问题" ), UISwitch( "搜索框自动获取焦点", "mt-search-searchInputAutoFocus", true, void 0, "" ) ] } ] }; const MTAutoSignIn = { $key: { signTime: "mt-sign-time" }, init() { this.sign(); }, /** * 判断今日是否已签到 */ todayIsSign() { let signTime = this.getSignTime(); if (signTime == null) { return false; } if (utils.formatTime(Date.now(), "yyyyMMdd") !== utils.formatTime(signTime, "yyyyMMdd")) { return false; } return true; }, /** * 设置签到时间 */ setSignTime() { _GM_setValue(this.$key.signTime, Date.now()); }, /** * 获取签到时间 */ getSignTime() { return _GM_getValue(this.$key.signTime); }, /** * 清空签到信息 */ clearSignTime() { _GM_deleteValue(this.$key.signTime); }, /** * 检测是否登录 */ checkLogin() { if (MTUtils.envIsMobile()) { let mobile_login_exitBtn = $( ".sidenv_exit a[href*='member.php?mod=logging&action=logout']" ); return mobile_login_exitBtn; } else { let pc_login = $("#comiis_key"); return pc_login; } }, /** * 签到 */ async sign() { let formHash = MTUtils.getFormHash(); if (formHash == null) { if ($("#comiis_picshowbox")) { log.info("当前为评论区的看图模式 "); return; } log.error("自动签到:获取账号formhash失败"); _GM_deleteValue("mt_sign"); Qmsg.error({ content: "自动签到:获取账号formhash失败" }); return; } if (this.todayIsSign()) { log.info("今日已签到"); return; } let searchParamsData = { operation: "qiandao", format: "button", formhash: formHash, inajax: 1, ajaxtarget: "midaben_sign" }; let useFetch = Boolean(PopsPanel.getValue("mt-auto-sign-useFetch")); let response = await httpx.get( `/k_misign-sign.html?${utils.toSearchParamsStr(searchParamsData)}`, { fetch: useFetch, headers: { "User-Agent": utils.getRandomPCUA() }, allowInterceptConfig: false } ); if (!response.status) { log.error("签到:网络异常,请求失败"); Qmsg.error("签到:网络异常,请求失败"); return; } this.setSignTime(); log.info("签到信息:", response); let responseText = response.data.responseText; let CDATA = utils.parseCDATA(responseText); let CDATAElement = domUtils.parseHTML(`<div>${CDATA}</div>`, true, false); let content = domUtils.text(CDATAElement); if (content.includes("需要先登录")) { Qmsg.error("签到:请先登录账号", { timeout: 3e3 }); this.clearSignTime(); 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( /*html*/ ` <div style="display: flex;${!MTUtils.envIsMobile() ? "padding: 20px;" : ""}"> <div style="align-self: center;margin-right: 20px;">签到</div> <div>排名 ${line}<br>金币 ${con}</div> </div>`, { timeout: 4e3, isHTML: true } ); return; } 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 = response.data.responseText; } }; const Component_Sign = { id: "component-sigh", title: "签到", forms: [ { text: "功能", type: "forms", forms: [ UISwitch( "显示【今日签到之星】", "mt-sign-showTodaySignStar", true, void 0, "在签到按钮上面显示今日签到之星" ), UISwitch( "显示【今日最先】", "mt-sign-showTodayRanking", true, void 0, "在签到排名上面新增【今日最先】" ) ] }, { text: "自动签到", type: "forms", forms: [ UISwitch("启用", "mt-auto-sign", true, void 0, "自动请求签到"), UISwitch("使用fetch请求", "mt-auto-sign-useFetch", false, void 0, ""), UIButton( "签到信息", `上次签到时间:${MTAutoSignIn.getSignTime() == null ? "尚未签到" : Utils.formatTime(MTAutoSignIn.getSignTime())}`, "清空信息", void 0, void 0, void 0, "primary", (event) => { let $click = event.composedPath()[0]; let $desc = $click.closest("li").querySelector(".pops-panel-item-left-desc-text"); __pops.confirm({ title: { text: "提示 ", position: "center" }, content: { text: "<p>是否清空脚本签到记录的时间?</p>", html: true }, btn: { ok: { enable: true, callback: (event2) => { MTAutoSignIn.clearSignTime(); Qmsg.success("删除成功"); domUtils.text( $desc, `上次签到时间:${MTAutoSignIn.getSignTime() == null ? "尚未签到" : Utils.formatTime(MTAutoSignIn.getSignTime())}` ); event2.close(); } } }, mask: { enable: true }, width: "88vw", height: "200px" }); } ) ] } ] }; const Component_Space = { id: "component-space", title: "空间", forms: [ { type: "forms", text: "", forms: [ UISwitch( "修复无法进入空间", "mt-space-repairEnterSpace", true, void 0, "修复链接错误导致不能进入空间的问题" ), UISwitch( "显示帖子回复内容", "mt-space-showCommentContent", true, void 0, "在帖子-回复下面显示具体评论的内容" ) ] } ] }; const Component_Guide = { id: "component-guide", title: "导读", forms: [ { type: "forms", text: "", forms: [ UISwitch( "显示最新帖子", "mt-guide-showLatestPost", true, void 0, "在最上面显示最新发布的帖子" ) ] } ] }; const PanelUISize = { /** * 一般设置界面的尺寸 */ setting: { get width() { return window.innerWidth < 550 ? "88vw" : "550px"; }, get height() { return window.innerHeight < 450 ? "70vh" : "450px"; } } }; const PopsPanel = { /** 数据 */ $data: { __data: null, __on###ccessExecMenu: null, __onceExec: null, __listenData: null, /** * 菜单项的默认值 */ get data() { if (PopsPanel.$data.__data == null) { PopsPanel.$data.__data = new utils.Dictionary(); } return PopsPanel.$data.__data; }, /** * 成功只执行了一次的项 */ get on###ccessExecMenu() { if (PopsPanel.$data.__on###ccessExecMenu == null) { PopsPanel.$data.__on###ccessExecMenu = new utils.Dictionary(); } return PopsPanel.$data.__on###ccessExecMenu; }, /** * 成功只执行了一次的项 */ get onceExec() { if (PopsPanel.$data.__onceExec == null) { PopsPanel.$data.__onceExec = new utils.Dictionary(); } return PopsPanel.$data.__onceExec; }, /** 脚本名,一般用在设置的标题上 */ get scriptName() { return SCRIPT_NAME; }, /** 菜单项的总值在本地数据配置的键名 */ key: KEY, /** 菜单项在attributes上配置的菜单键 */ attributeKeyName: ATTRIBUTE_KEY, /** 菜单项在attributes上配置的菜单默认值 */ attributeDefaultValueName: ATTRIBUTE_DEFAULT_VALUE }, /** 监听器 */ $listener: { /** * 值改变的监听器 */ get listenData() { if (PopsPanel.$data.__listenData == null) { PopsPanel.$data.__listenData = new utils.Dictionary(); } return PopsPanel.$data.__listenData; } }, init() { this.initPanelDefaultValue(); this.initExtensionsMenu(); }, /** 判断是否是顶层窗口 */ isTopWindow() { return _unsafeWindow.top === _unsafeWindow.self; }, /** 初始化进行注册油猴菜单 */ initExtensionsMenu() { if (!this.isTopWindow()) { return; } GM_Menu.add([ { key: "show_pops_panel_setting", text: "⚙ 设置", autoReload: false, isStoreValue: false, showText(text) { return text; }, callback: () => { this.showPanel(); } } ]); ElementUtils.registerLeftMenu({ name: "MT论坛脚本设置", icon: "", iconColor: "#ff0505", iconSize: "23px", callback: () => { this.showPanel(); } }); }, /** 初始化菜单项的默认值保存到本地数据中 */ initPanelDefaultValue() { let that = this; function initDefaultValue(config) { if (!config.attributes) { return; } let needInitConfig = {}; let key = config.attributes[ATTRIBUTE_KEY]; if (key != null) { needInitConfig[key] = config.attributes[ATTRIBUTE_DEFAULT_VALUE]; } let __attr_init__ = config.attributes[ATTRIBUTE_INIT]; if (typeof __attr_init__ === "function") { let __attr_r###lt__ = __attr_init__(); if (typeof __attr_r###lt__ === "boolean" && !__attr_r###lt__) { return; } } let initMoreValue = config.attributes[ATTRIBUTE_INIT_MORE_VALUE]; if (initMoreValue && typeof initMoreValue === "object") { Object.assign(needInitConfig, initMoreValue); } let needInitConfigList = Object.keys(needInitConfig); if (!needInitConfigList.length) { log.warn(["请先配置键", config]); return; } needInitConfigList.forEach((__key) => { let __defaultValue = needInitConfig[__key]; if (that.$data.data.has(__key)) { log.warn("请检查该key(已存在): " + __key); } that.$data.data.set(__key, __defaultValue); }); } function loopInitDefaultValue(configList) { for (let index = 0; index < configList.length; index++) { let configItem = configList[index]; initDefaultValue(configItem); let childForms = configItem.forms; if (childForms && Array.isArray(childForms)) { loopInitDefaultValue(childForms); } } } let contentConfigList = this.getPanelContentConfig(); for (let index = 0; index < contentConfigList.length; index++) { let leftContentConfigItem = contentConfigList[index]; if (!leftContentConfigItem.forms) { continue; } let rightContentConfigList = leftContentConfigItem.forms; if (rightContentConfigList && Array.isArray(rightContentConfigList)) { loopInitDefaultValue(rightContentConfigList); } } }, /** * 设置值 * @param key 键 * @param value 值 */ setValue(key, value) { let locaData = _GM_getValue(KEY, {}); let oldValue = locaData[key]; locaData[key] = value; _GM_setValue(KEY, locaData); if (this.$listener.listenData.has(key)) { this.$listener.listenData.get(key).callback(key, oldValue, value); } }, /** * 获取值 * @param key 键 * @param defaultValue 默认值 */ getValue(key, defaultValue) { let locaData = _GM_getValue(KEY, {}); let localValue = locaData[key]; if (localValue == null) { if (this.$data.data.has(key)) { return this.$data.data.get(key); } return defaultValue; } return localValue; }, /** * 删除值 * @param key 键 */ deleteValue(key) { let locaData = _GM_getValue(KEY, {}); let oldValue = locaData[key]; Reflect.deleteProperty(locaData, key); _GM_setValue(KEY, locaData); if (this.$listener.listenData.has(key)) { this.$listener.listenData.get(key).callback(key, oldValue, void 0); } }, /** * 监听调用setValue、deleteValue * @param key 需要监听的键 * @param callback */ addValueChangeListener(key, callback, option) { let listenerId = Math.random(); this.$listener.listenData.set(key, { id: listenerId, key, callback }); if (option) { if (option.immediate) { callback(key, this.getValue(key), this.getValue(key)); } } return listenerId; }, /** * 移除监听 * @param listenerId 监听的id */ removeValueChangeListener(listenerId) { let deleteKey = null; for (const [key, value] of this.$listener.listenData.entries()) { if (value.id === listenerId) { deleteKey = key; break; } } if (typeof deleteKey === "string") { this.$listener.listenData.delete(deleteKey); } else { console.warn("没有找到对应的监听器"); } }, /** * 主动触发菜单值改变的回调 * @param key 菜单键 * @param newValue 想要触发的新值,默认使用当前值 * @param oldValue 想要触发的旧值,默认使用当前值 */ triggerMenuValueChange(key, newValue, oldValue) { if (this.$listener.listenData.has(key)) { let listenData = this.$listener.listenData.get(key); if (typeof listenData.callback === "function") { let value = this.getValue(key); let __newValue = value; let __oldValue = value; if (typeof newValue !== "undefined" && arguments.length > 1) { __newValue = newValue; } if (typeof oldValue !== "undefined" && arguments.length > 2) { __oldValue = oldValue; } listenData.callback(key, __oldValue, __newValue); } } }, /** * 判断该键是否存在 * @param key 键 */ hasKey(key) { let locaData = _GM_getValue(KEY, {}); return key in locaData; }, /** * 自动判断菜单是否启用,然后执行回调 * @param key * @param callback 回调 * @param isReverse 逆反判断菜单启用 * @param checkEnableCallBack 自定义检测菜单的值,可自行决定是否强制启用菜单,true是启用菜单,false是不启用菜单 */ execMenu(key, callback, isReverse = false, checkEnableCallBack) { if (!(typeof key === "string" || typeof key === "object" && Array.isArray(key))) { throw new TypeError("key 必须是字符串或者字符串数组"); } let runKeyList = []; if (typeof key === "object" && Array.isArray(key)) { runKeyList = [...key]; } else { runKeyList.push(key); } let value = void 0; for (let index = 0; index < runKeyList.length; index++) { const runKey = runKeyList[index]; if (!this.$data.data.has(runKey)) { log.warn(`${key} 键不存在`); return; } let runValue = PopsPanel.getValue(runKey); if (isReverse) { runValue = !runValue; } if (typeof checkEnableCallBack === "function") { let checkR###lt = checkEnableCallBack(runKey, runValue); if (typeof checkR###lt === "boolean") { runValue = checkR###lt; } } if (!runValue) { break; } value = runValue; } if (value) { callback(value); } }, /** * 自动判断菜单是否启用,然后执行回调,只会执行一次 * @param key * @param callback 回调 * @param getValueFn 自定义处理获取当前值,值true是启用并执行回调,值false是不执行回调 * @param handleValueChangeFn 自定义处理值改变时的回调,值true是启用并执行回调,值false是不执行回调 * @param checkEnableCallBack 自定义检测菜单的值,可自行决定是否强制启用菜单,true是启用菜单,false是不启用菜单 */ execMenuOnce(key, callback, getValueFn, handleValueChangeFn, checkEnableCallBack) { if (typeof key !== "string") { throw new TypeError("key 必须是字符串"); } if (!this.$data.data.has(key)) { log.warn(`${key} 键不存在`); return; } if (this.$data.on###ccessExecMenu.has(key)) { return; } this.$data.on###ccessExecMenu.set(key, 1); let __getValue = () => { let localValue = PopsPanel.getValue(key); return typeof getValueFn === "function" ? getValueFn(key, localValue) : localValue; }; let r###ltStyleList = []; let dynamicPushStyleNode = ($style) => { let __value = __getValue(); let dynamicR###ltList = []; if ($style instanceof HTMLStyleElement) { dynamicR###ltList = [$style]; } else if (Array.isArray($style)) { dynamicR###ltList = [ ...$style.filter( (item) => item != null && item instanceof HTMLStyleElement ) ]; } if (__value) { r###ltStyleList = r###ltStyleList.concat(dynamicR###ltList); } else { for (let index = 0; index < dynamicR###ltList.length; index++) { let $css = dynamicR###ltList[index]; $css.remove(); dynamicR###ltList.splice(index, 1); index--; } } }; let checkMenuEnableCallBack = (currentValue) => { return typeof checkEnableCallBack === "function" ? checkEnableCallBack(key, currentValue) : currentValue; }; let changeCallBack = (currentValue) => { let r###ltList = []; if (checkMenuEnableCallBack(currentValue)) { let r###lt = callback(currentValue, dynamicPushStyleNode); if (r###lt instanceof HTMLStyleElement) { r###ltList = [r###lt]; } else if (Array.isArray(r###lt)) { r###ltList = [ ...r###lt.filter( (item) => item != null && item instanceof HTMLStyleElement ) ]; } } for (let index = 0; index < r###ltStyleList.length; index++) { let $css = r###ltStyleList[index]; $css.remove(); r###ltStyleList.splice(index, 1); index--; } r###ltStyleList = [...r###ltList]; }; this.addValueChangeListener( key, (__key, oldValue, newValue) => { let __newValue = newValue; if (typeof handleValueChangeFn === "function") { __newValue = handleValueChangeFn(__key, newValue, oldValue); } changeCallBack(__newValue); } ); let value = __getValue(); if (value) { changeCallBack(value); } }, /** * 父子菜单联动,自动判断菜单是否启用,然后执行回调,只会执行一次 * @param key 菜单键 * @param childKey 子菜单键 * @param callback 回调 * @param replaceValueFn 用于修改mainValue,返回undefined则不做处理 */ execInheritMenuOnce(key, childKey, callback, replaceValueFn) { let that = this; const handleInheritValue = (key2, childKey2) => { let mainValue = that.getValue(key2); let childValue = that.getValue(childKey2); if (typeof replaceValueFn === "function") { let changedMainValue = replaceValueFn(mainValue, childValue); if (changedMainValue != null) { return changedMainValue; } } return mainValue; }; this.execMenuOnce( key, callback, () => { return handleInheritValue(key, childKey); }, () => { return handleInheritValue(key, childKey); } ); this.execMenuOnce( childKey, () => { }, () => false, () => { this.triggerMenuValueChange(key); return false; } ); }, /** * 根据自定义key只执行一次 * @param key 自定义key */ onceExec(key, callback) { if (typeof key !== "string") { throw new TypeError("key 必须是字符串"); } if (this.$data.onceExec.has(key)) { return; } callback(); this.$data.onceExec.set(key, 1); }, /** * 显示设置面板 */ showPanel() { __pops.panel({ title: { text: `${SCRIPT_NAME}-设置`, position: "center", html: false, style: "" }, content: this.getPanelContentConfig(), mask: { enable: true, clickEvent: { toClose: true, toHide: false } }, width: PanelUISize.setting.width, height: PanelUISize.setting.height, drag: true, only: true }); }, /** * 判断是否是移动端 */ isMobile() { return window.innerWidth < 550; }, /** * 获取设置面板的宽度 */ getWidth() { if (window.innerWidth < 550) { return "88vw"; } else { return "550px"; } }, /** * 获取设置面板的高度 */ getHeight() { if (window.innerHeight > 450) { return "450px"; } else { return "88vh"; } }, /** * 获取配置内容 */ getPanelContentConfig() { let configList = [ Component_Common, Component_ForumPost, Component_Search, Component_Sign, Component_Space, Component_Guide ]; return configList; } }; 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 MTBlackHome = { $data: { cid: "" }, init() { this.registerMenu(); }, /** * 注册菜单 */ registerMenu() { ElementUtils.registerLeftMenu({ name: "小黑屋", iconColor: "#000000", icon: "", callback: () => { this.showBlackHome(); } }); }, /** * 显示小黑屋dialog */ 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*/ ` <div class="blackhome-user-filter"> <input placeholder="过滤用户名/操作人员/UID(可正则)"> </div> <div class="blackhome-user-list"></div> ` ), 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}条数据`); } } }, cancel: { text: "关闭" } }, width: "88vw", height: "82vh", style: blackHomeCSS, mask: { enable: true } }); 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: ( /*html*/ ` <div class="blackhome-user-avatar"> <div class="blackhome-user"> <img src="${MTUtils.getAvatar( userInfo["uid"], "big" )}" loading="lazy"> <div class="blackhome-user-info"> <p>${userInfo["username"]}</p> <p>${userInfo["dateline"]}</p> </div> </div> <div class="blackhome-user-action"> <p>${userInfo["action"]}</p> <p>到期: ${userInfo["groupexpiry"]}</p> </div> <div class="blackhome-user-uuid">UID: ${userInfo["uid"]}</div> <div class="blackhome-operator"> <div class="blackhome-operator-user"> <img loading="lazy" src="${MTUtils.getAvatar( userInfo["operatorid"], "big" )}"> <p>${userInfo["operator"]}</p> </div> <div class="blackhome-operator-user-info"> ${userInfo["reason"]} </div> </div> </div> ` ) }, { "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(); } }); }, /** * 显示在线用户dialog */ 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: ( /*html*/ ` <div class="online-user-info">${onlineUserInfo.totalOnline} 人在线 - ${onlineUserInfo.onlineUser} 会员${onlineUserInfo.invisibleUser == 0 ? "" : `(${onlineUserInfo.invisibleUser}隐身)`} - ${onlineUserInfo.noRegisterUser} 位游客</div> <div class="online-user-filter"> <input placeholder="过滤用户名/身份/UID(可正则)"></div> <div class="online-user-list"></div> ` ), html: true }, btn: { ok: { text: "关闭", type: "default" } }, width: "88vw", height: "82vh", style: onlineUserCSS, mask: { enable: true } }); 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 r###lt = { 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 = "未知身份"; } r###lt.data.push({ uid, avatar, name, sf, space }); }); let onlineInfo = pageHTML.querySelector("#online div.bm_h span.xs1").textContent; r###lt.totalOnline = utils.parseInt( onlineInfo.match(/([0-9]*)\s*人在线/i), 0 ); r###lt.onlineUser = utils.parseInt( onlineInfo.match(/([0-9]*)\s*会员/i), 0 ); r###lt.noRegisterUser = utils.parseInt( onlineInfo.match(/([0-9]*)\s*位游客/i), 0 ); r###lt.invisibleUser = utils.parseInt( onlineInfo.match(/([0-9]*)\s*隐身/i), 0 ); return r###lt; }, /** * 创建在线用户节点 */ createListViewItem(userInfo) { let $item = DOMUtils.createElement( "div", { className: "online-item", innerHTML: ( /*html*/ ` <div class="online-user"> <img data-avatar src="${userInfo["avatar"]}" loading="lazy" class="online-user-avatar"> <div class="online-user-info"> <p data-name>${userInfo["name"]}</p> <span data-sf="${userInfo["sf"]}">${userInfo["sf"]}</span> <span data-uid>UID: ${userInfo["uid"]}</span> </div> </div> ` ) }, { "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, '<a href="$1" target="_blank" class="texttolink">$1</a>' ); 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, XPathR###lt.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 MTForumPost = { $flag: { isSetHljsCSS: false }, init() { PopsPanel.execMenuOnce("mt-forum-post-autoExpandContent", () => { return this.autoExpandContent(); }); PopsPanel.execMenuOnce("mt-forum-post-repairImageWidth", () => { return this.repairImageWidth(); }); domUtils.ready(() => { PopsPanel.execMenu("mt-forum-post-removeFontStyle", () => { this.removeFontStyle(); }); PopsPanel.execMenu("mt-forum-post-removeCommentFontStyle", () => { this.removeCommentFontStyle(); }); PopsPanel.execMenu("mt-forum-post-addCommentOnBtn", () => { this.addCommentOnBtn(); }); PopsPanel.execMenuOnce("mt-forum-post-loadNextPageComment", () => { this.loadNextPageComment(); }); PopsPanel.execMenuOnce("mt-forum-post-codeQuoteOptimization", () => { this.codeQuoteOptimization(); }); PopsPanel.execMenuOnce("mt-forum-post-editorOptimizationNormal", () => { MTEditorOptimizationNormal.init(); }); PopsPanel.execMenu("mt-forum-post-optimizationImagePreview", () => { this.optimizationImagePreview(); }); PopsPanel.execMenuOnce("mt-forum-post-setAttachmentsClickTip", () => { this.setAttachmentsClickTip(); }); }); }, /** * 自动展开帖子内容 */ autoExpandContent() { log.info(`自动展开帖子内容`); return addStyle( /*css*/ ` div.comiis_message.bg_f.view_one.b_b.cl.message>div.comiis_messages.comiis_aimg_show.cl{max-height:inherit!important;overflow-y:inherit!important;position:inherit!important} .comiis_lookfulltext_bg,.comiis_lookfulltext_key{display:none!important} ` ); }, /** * 修复图片宽度 */ repairImageWidth() { log.info(`修复图片宽度`); return addStyle( /*css*/ ` .comiis_messages img{ max-width: 100% !important; }` ); }, /** * 移除帖子字体效果 */ removeFontStyle() { log.info(`移除帖子字体效果`); let $messageTable = $(".comiis_a.comiis_message_table"); if (!$messageTable) { return; } domUtils.html( $messageTable, domUtils.html($messageTable).replace(MTRegExp.fontSpecial, "") ); }, /** * 移除评论区的字体效果 */ removeCommentFontStyle() { var _a2; log.info(`移除评论区的字体效果`); let $fontList = $$("font"); let $postForumMainContent = ((_a2 = $(".comiis_postlist .comiis_postli")) == null ? void 0 : _a2.innerHTML) || ""; if ($postForumMainContent !== "") { $fontList.forEach(($font) => { if (!$postForumMainContent.includes($font.innerHTML)) { $font.removeAttribute("color"); $font.removeAttribute("style"); $font.removeAttribute("size"); } }); $$(".comiis_message.message").forEach(($message) => { if ($postForumMainContent.includes($message.innerHTML)) { $message.innerHTML = $message.innerHTML.replace( MTRegExp.fontSpecial, "" ); let $next = $message.nextElementSibling; if ($next && $next.localName === "strike") { $next.outerHTML = $next.outerHTML.replace(/^<strike>(\n|)/g, "").replace(/<\/strike>$/g, ""); } } }); } $$(".comiis_postli.comiis_list_readimgs.nfqsqi").forEach((item) => { let $parent = item.parentElement; if ($parent && $parent.localName === "strike") { $parent.outerHTML = $parent.outerHTML.replace(/^<strike>(\n|)/g, "").replace(/<\/strike>$/g, ""); } }); }, /** * 添加【点评】按钮 */ addCommentOnBtn() { log.info(`添加【点评】按钮`); utils.waitNodeList( ".bottom_zhan:not([data-isaddreviews])" ).then(($bottomZhanList) => { $bottomZhanList.forEach(($bottmZhan) => { var _a2, _b, _c; $bottmZhan.setAttribute("data-isaddreviews", "true"); var replyNode = $bottmZhan.querySelector("a"); if (!replyNode) { return; } var replyUrl = replyNode.getAttribute("datahref") || replyNode.getAttribute("data-href") || replyNode.href || ""; var rewardUrl = replyUrl.replace("mod=post&", "mod=misc&").replace("action=reply&", "action=comment&"); var reviewPage = (_a2 = replyUrl == null ? void 0 : replyUrl.match(/&page=([\w]+)/i)) == null ? void 0 : _a2[1]; var reviewsUrl = `${rewardUrl}&extra=page%3D1&page=${reviewPage}`; var $postli = $bottmZhan == null ? void 0 : $bottmZhan.closest(".comiis_postli[id]"); var reviewsPID = (_b = $postli.getAttribute("id")) == null ? void 0 : _b.replace("pid", "&pid="); reviewsUrl = reviewsUrl + reviewsPID; var reviewsUserName = ((_c = $postli.querySelector(".top_user.f_b")) == null ? void 0 : _c.textContent) || ""; var reviewsNode = domUtils.parseHTML( /*html*/ ` <a href="${reviewsUrl}" class="f_c dialog"> <i class="comiis_font mt_review" style="content: url("https://s1.ax1x.com/2020/04/26/Jcq8VU.png"); height: 15px;"></i> </a> `, true, false ); domUtils.on(reviewsNode, "click", function() { utils.waitNode("div[id=ntcmsg_popmenu]>div>span.f_c").then((element) => { try { element.innerText = "点评 " + reviewsUserName; } catch (err) { log.error("修改点评失败", err); } }); }); domUtils.prepend($bottmZhan, reviewsNode); }); }); }, /** * 自动加载下一页评论 */ loadNextPageComment() { var _a2; log.info(`自动加载下一页评论`); if (document.title.includes("提示信息 - MT论坛")) { return; } function getLoadingCommentTip() { return $("#loading-comment-tip"); } function getLoadingCommentTipParent() { return $("#loading-comment-tip").parentElement; } function autoLoadNextPageComments(post_comments_list) { let $loadingCommentTip = getLoadingCommentTip(); let $loadingCommentTipParent = getLoadingCommentTipParent(); domUtils.css($loadingCommentTipParent, "display", ""); let $nextPage = Array.from( post_comments_list.querySelectorAll("a[href]") ).find((item) => { var _a3; return ((_a3 = item.textContent) == null ? void 0 : _a3.trim()) === "下一页"; }); let next_page_url = $nextPage.href; log.info("获取下一页url:", next_page_url); if (next_page_url.includes("javascript:;")) { log.info("暂无下一页的评论"); domUtils.remove($loadingCommentTipParent); return; } function removeLoadNextCommentsListener() { domUtils.remove(".comiis_page.bg_f"); domUtils.remove($loadingCommentTipParent); domUtils.off($loadingCommentTip, "click", loadNextComments); domUtils.off(window, "scroll", lockFn.run); } async function loadNextComments() { domUtils.text($loadingCommentTip, "正在加载评论中..."); domUtils.css($loadingCommentTipParent, "display", ""); log.info(`请求下一页评论:` + next_page_url); let url = next_page_url; let response = await httpx.get(url, { fetch: true }); if (!response.status) { return; } let nextPageDoc = domUtils.parseHTML( response.data.responseText, true, true ); let $kqide = $(".comiis_postlist.kqide"); let $nextPage_kqide = nextPageDoc.querySelector( ".comiis_postlist.kqide" ); let $getNextPage = nextPageDoc.querySelector(".nxt"); let queryNextPageUrl = ($getNextPage == null ? void 0 : $getNextPage.getAttribute("href")) || ($getNextPage == null ? void 0 : $getNextPage.href); if (queryNextPageUrl) { log.success("成功获取到下一页评论"); if (queryNextPageUrl === next_page_url) { log.warn( "获取到下一页评论的url和上次请求的url相同,判定为已加载完全部评论,移除监听事件" ); removeLoadNextCommentsListener(); return; } next_page_url = queryNextPageUrl; } else { log.error("评论全部加载完毕,移除监听事件"); removeLoadNextCommentsListener(); } let $pageStrong = $getNextPage == null ? void 0 : $getNextPage.parentElement.querySelector("strong"); if ($pageStrong) { let $pageSelect = $("#select_a"); if ($pageSelect) { let $pageText = Array.from($pageSelect.childNodes).find( (item) => item.nodeName === "#text" ); if ($pageText) { $pageText.textContent = `第 ${$pageStrong.textContent} 页`; } } } PopsPanel.execMenu("mt-forum-post-syncNextPageUrl", () => { if (window === (top == null ? void 0 : top.window)) { let urlObj = new URL(url); let setLocationUrl = `${urlObj.pathname}${urlObj.search}`; window.history.pushState("forward", "", setLocationUrl); } }); domUtils.append($kqide, $nextPage_kqide); MTForumPost.init(); } var lockFn = new utils.LockFunction(async () => { if (utils.isNearBottom(50)) { await loadNextComments(); } }); domUtils.text($loadingCommentTip, "请上下滑动或点击加载"); domUtils.on(window, "scroll", lockFn.run); domUtils.on($loadingCommentTip, "click", loadNextComments); lockFn.run(); } let tip_html = ( /*html*/ ` <div class="comiis_multi_box bg_f b_t"> <label class="comiis_loadbtn bg_e f_d" id="loading-comment-tip">正在等待页面加载完毕</label> </div>` ); let $tip = domUtils.parseHTML(tip_html, true, false); let $bodybox = $(".comiis_bodybox"); domUtils.append($bodybox, $tip); let commentsEle = $(".comiis_pltit span.f_d") || $("#comiis_foot_memu .comiis_kmvnum"); if ($(".comiis_pltit h2") && ((_a2 = $(".comiis_pltit h2")) == null ? void 0 : _a2.textContent.includes("暂无评论"))) { domUtils.remove(getLoadingCommentTipParent()); log.info("暂无评论"); return; } let commentsNum = parseInt(commentsEle.textContent); if (commentsNum >= 10) { utils.waitNode(".comiis_page.bg_f").then(($nextPage) => { autoLoadNextPageComments($nextPage); }); } else { domUtils.remove(getLoadingCommentTipParent()); log.info("无多页评论"); } }, /** * 代码块优化 **/ codeQuoteOptimization() { log.info(`代码块优化`); function hljs_smali(hljs2) { var smali_instr_low_prio = [ "add", "and", "cmp", "cmpg", "cmpl", "const", "div", "double", "float", "goto", "if", "int", "long", "move", "mul", "neg", "new", "nop", "not", "or", "rem", "return", "shl", "shr", "sput", "sub", "throw", "ushr", "xor" ]; var smali_instr_high_prio = [ "aget", "aput", "array", "check", "execute", "fill", "filled", "goto/16", "goto/32", "iget", "instance", "invoke", "iput", "monitor", "packed", "sget", "sparse" ]; var smali_keywords = [ "transient", "constructor", "abstract", "final", "synthetic", "public", "private", "protected", "static", "bridge", "system" ]; return { aliases: ["smali"], contains: [ { className: "string", begin: '"', end: '"', relevance: 0 }, hljs2.COMMENT("#", "$", { relevance: 0 }), { className: "keyword", variants: [ { begin: "\\s*\\.end\\s[a-zA-Z0-9]*" }, { begin: "^[ ]*\\.[a-zA-Z]*", relevance: 0 }, { begin: "\\s:[a-zA-Z_0-9]*", relevance: 0 }, { begin: "\\s(" + smali_keywords.join("|") + ")" } ] }, { className: "built_in", variants: [ { begin: "\\s(" + smali_instr_low_prio.join("|") + ")\\s" }, { begin: "\\s(" + smali_instr_low_prio.join("|") + ")((\\-|/)[a-zA-Z0-9]+)+\\s", relevance: 10 }, { begin: "\\s(" + smali_instr_high_prio.join("|") + ")((\\-|/)[a-zA-Z0-9]+)*\\s", relevance: 10 } ] }, { className: "class", begin: "L[^(;:\n]*;", relevance: 0 }, { begin: "[vp][0-9]+" } ] }; } if (!this.$flag.isSetHljsCSS) { hljs.registerLanguage("smali", hljs_smali); addStyle( /*css*/ ` .hljs ol{margin:0 0 0 10px;padding:10px 10px 10px 25px} .hljs li{padding-left:10px;list-style-type:decimal-leading-zero;font-family:Monaco,Consolas,'Lucida Console','Courier New',serif;font-size:12px;line-height:1.8em} .hljs li:hover{background:#2c313c} .hljs li::marker{unicode-bidi:isolate;font-variant-numeric:tabular-nums;text-transform:none;text-indent:0!important;text-align:start!important;text-align-last:start!important} select.code-select-language{height:40px;line-height:40px;font-size:14px;border:1px solid #5c5c5c;border-radius:5px;text-align:center;outline:0;margin-left:10px} ` ); addStyle( /*css*/ ` .reader-copy-button{background:#000;background-size:cover;background-repeat:no-repeat;background-position:0;color:#fff;line-height:40px;display:block;text-align:center;border-radius:5px;cursor:pointer;font-size:15px;width:70px;user-select:none} .reader-copy-button i{display:inline-block;margin-right:6px;width:16px;height:16px;background-size:cover;vertical-align:sub;user-select:none} ` ); domUtils.on( document, "click", ".reader-copy-button", async function(event) { utils.preventEvent(event); let $click = event.target; let codeElement = $( $click.getAttribute("data-code-selector") ); await utils.setClip(codeElement.outerText || codeElement.innerText); Qmsg.success("已复制到剪贴板"); return false; } ); } let comiis_blockcode = $$(".comiis_blockcode.comiis_bodybg"); comiis_blockcode.forEach(($comiis_bodybg) => { if ($comiis_bodybg.getAttribute("data-copy")) { return; } $comiis_bodybg.setAttribute("data-copy", "true"); let $temp = domUtils.createElement( "div", { innerHTML: ( /*html*/ ` <span class="reader-copy-button"> <i> <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title>复制按钮</title> <defs> <rect id="path-1" x="0" y="0" width="16" height="16"></rect> </defs> <g id="阅读页复制-拦截" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g> <mask id="mask-2" fill="white"> <use xlink:href="#path-1"></use> </mask> <g id="矩形"></g> <path d="M4.11794319,3.55555556 L9.51168644,3.55555556 C10.4768443,3.55555556 11.2592593,4.33797056 11.2592593,5.30312837 L11.2592593,13.067242 C11.2592593,14.0323998 10.4768443,14.8148148 9.51168644,14.8148148 L4.11794319,14.8148148 C3.15278537,14.8148148 2.37037037,14.0323998 2.37037037,13.067242 L2.37037037,5.30312837 C2.37037037,4.33797056 3.15278537,3.55555556 4.11794319,3.55555556 Z" id="矩形" stroke="#DFDFDF" stroke-width="1.45631068" mask="url(#mask-2)"></path> <path d="M5.03703704,0.888888889 L12.1481481,0.888888889 C13.1299877,0.888888889 13.9259259,1.68482711 13.9259259,2.66666667 L13.9259259,12.7407407" id="形状" stroke="#DFDFDF" stroke-width="1.45631068" mask="url(#mask-2)"></path> </g> </g> </svg> </i> 复制 </span>` ) }, { style: "height: 34px;margin: 14px 0px;display: inline-flex;align-items: flex-end;" } ); domUtils.before($comiis_bodybg, $temp); function setElementHighlight(ele, language = "java") { if (!ele.oldValue) { ele.oldValue = ele.textContent; } ele.innerHTML = hljs.highlight(ele.oldValue, { language }).value.replace(/\\n$/gi, ""); } let codeLanguage = hljs.highlightAuto( $comiis_bodybg.textContent ).language; let selectElementParentDiv = document.createElement("div"); let selectElement = document.createElement("select"); let selectLanguageList = hljs.listLanguages().sort(); selectLanguageList = selectLanguageList.concat("自动检测"); let selectInnerHTML = ""; selectLanguageList.forEach((languageName) => { if (languageName.startsWith("自动检测")) { selectInnerHTML += `<option data-value="${codeLanguage}" selected="selected">${languageName}(${codeLanguage})</option>`; } else { selectInnerHTML += `<option data-value="${languageName}">${languageName}</option>`; } }); selectElement.className = "code-select-language"; selectElement.innerHTML = selectInnerHTML; domUtils.on(selectElement, "change", function() { let changeCodeLanguage = selectElement.selectedOptions[0].getAttribute("data-value"); selectElement.setAttribute("aria-label", changeCodeLanguage); log.info("切换代码块语言: ", changeCodeLanguage); $comiis_bodybg.querySelectorAll("li").forEach((liElement) => { setElementHighlight(liElement, changeCodeLanguage); }); }); utils.preventEvent(selectElement, "click"); selectElementParentDiv.appendChild(selectElement); $temp.append(selectElementParentDiv); utils.dispatchEvent(selectElement, "change"); $comiis_bodybg.className = "hljs"; $comiis_bodybg.firstChild.removeAttribute("class"); $temp.querySelector(".reader-copy-button").setAttribute( "data-code-selector", utils.getElementSelector($comiis_bodybg) ); }); }, /** * 图片查看优化 */ optimizationImagePreview() { log.info(`图片查看优化`); function viewIMG(imgList = [], index = 0) { let viewerULNodeHTML = ""; imgList.forEach((item) => { viewerULNodeHTML += `<li><img data-src="${item}"></li>`; }); let viewerULNode = domUtils.createElement("ul", { innerHTML: viewerULNodeHTML }); let viewer = new Viewer(viewerULNode, { inline: false, url: "data-src", zIndex: utils.getMaxZIndex() + 100, hidden: () => { viewer.destroy(); } }); log.info("查看的图片的下标", index); viewer.view(index); viewer.zoomTo(1); viewer.show(); } let blackListNoViewIMG = [ { hostName: "avatar-bbs.mt2.cn", pathName: "*" }, { hostName: "cdn-bbs.mt2.cn", pathName: "^(/static(/|//)image|/template)" }, { hostName: window.location.hostname, pathName: "^(/static(/|//)image|/template)" }, { hostName: window.location.hostname, pathName: "/uc_server/avatar.php" } ]; utils.waitNodeList( "div.comiis_postlist.kqide .comiis_postli:not([data-isHandlingViewIMG])" ).then((nodeList) => { nodeList.forEach((item) => { item.setAttribute("data-isHandlingViewIMG", "true"); let clickShowIMGList = []; item.querySelectorAll("img").forEach(($img) => { let IMG_URL = $img.src; let IMG_URL_HOSTNAME = new URL(IMG_URL).hostname; let IMG_URL_PATHNAME = new URL(IMG_URL).pathname; let imgParentNode = $img.parentElement; if (imgParentNode.nodeName.toLowerCase() === "span") { imgParentNode.removeAttribute("onclick"); } if (imgParentNode.nodeName.toLowerCase() === "a" && imgParentNode.getAttribute("href") === IMG_URL) { imgParentNode.setAttribute("href", "javascript:;"); imgParentNode.removeAttribute("target"); } let isMatching = false; for (let item2 of blackListNoViewIMG) { if (IMG_URL_HOSTNAME.indexOf(item2["hostName"]) != -1 && IMG_URL_PATHNAME.match(item2["pathName"])) { isMatching = true; break; } } if (isMatching) { return; } clickShowIMGList = [...clickShowIMGList, IMG_URL]; domUtils.on($img, "click", function() { log.info("点击图片", $img); let _index_ = clickShowIMGList.findIndex((_img_) => { return _img_ == IMG_URL; }); viewIMG(clickShowIMGList, _index_); }); }); if (clickShowIMGList.length) { log.info("处理的图片", clickShowIMGList); } }); }); }, /** * 附件点击提醒 */ setAttachmentsClickTip() { log.info(`附件点击提醒`); function handleClick($ele) { if ($ele.hasAttribute("href")) { let attachmentURL = $ele.getAttribute("href"); let attachmentNameNode = $ele.querySelector("span.f_ok"); let attachmentDownloadInfo = $ele.querySelector(".attach_size"); if (domUtils.text(attachmentDownloadInfo).indexOf("金币") === -1) { return; } log.info("发现附件", $ele); log.info("该附件是金币附件,拦截!"); let attachmentName = domUtils.text(attachmentNameNode); $ele.setAttribute("data-href", $ele.getAttribute("href")); $ele.removeAttribute("href"); attachmentNameNode.innerText = "【已拦截】" + attachmentName; $ele.onclick = function() { log.info("附件url:", attachmentURL); __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: ( /*html*/ `<br />确定花费2金币下载附件 <a style="color: #507daf !important;">${attachmentName}</a> ?<br /><br />` ), html: true }, btn: { ok: { callback: (details) => { window.open(attachmentURL, "_blank"); details.close(); } } }, mask: { enable: true }, width: "88vw", height: "200px" }); }; } } utils.mutationObserver(document.documentElement, { callback: () => { $$(".attnm a").forEach((item) => { handleClick(item); }); $$(".comiis_attach a").forEach((item) => { handleClick(item); }); }, config: { childList: true, subtree: true } }); utils.waitNodeList(".attnm a").then((nodeList) => { nodeList.forEach((item) => { handleClick(item); }); }); utils.waitNodeList(".comiis_attach a").then((nodeList) => { nodeList.forEach((item) => { handleClick(item); }); }); } }; const MTSearch = { init() { addStyle( /*css*/ ` /* 去除搜索框的蒙版 */ #comiis_search_noe{ display: none !important; } /* 显示真正的试搜索框 */ #comiis_search_two{ display: block !important; } ` ); DOMUtils.ready(() => { PopsPanel.execMenuOnce("mt-search-showSearchHistory", () => { this.showSearchHistory(); }); PopsPanel.execMenuOnce("mt-search-repairClearBtn", () => { this.repairClearBtn(); }); PopsPanel.execMenuOnce("mt-search-searchInputAutoFocus", () => { this.searchInputAutoFocus(); }); }); }, /** * 显示搜索历史 */ async showSearchHistory() { log.info(`显示搜索历史`); let searchHistoryList = _GM_getValue("search_history", []); let $input = $("#scform_srchtxt"); let $submit = $("#searchform"); let suggestion = __pops.searchSuggestion({ target: $input, inputTarget: $input, data: searchHistoryList, getItemHTML: function(item) { return item; }, getData(inputValue) { return searchHistoryList.filter((item) => { return item.includes(inputValue); }); }, deleteIcon: { enable: true, callback(event, liElement, data) { let findIndex = searchHistoryList.findIndex((item) => item === data); if (findIndex !== -1) { searchHistoryList.splice(findIndex, 1); _GM_setValue("search_history", searchHistoryList); } liElement.remove(); } }, itemClickCallBack(event, liElement, data) { $input.value = data; $submit.submit(); } }); suggestion.init(); suggestion.setAllEvent(); function search_event() { let $submit2 = document.querySelector("#scform_submit"); DOMUtils.on($submit2, "click", function() { let searchText = $input.value; if (searchText != "") { let localHistorySearchText = _GM_getValue( "search_history", [] ); if (localHistorySearchText.includes(searchText)) { log.info(`已有该搜索历史记录`); } else { log.info(`无该记录,追加`); localHistorySearchText.push(searchText); } _GM_setValue("search_history", localHistorySearchText); } }); } function add_clear_history() { let localHistorySearchText = _GM_getValue("search_history", []); let clear_history_innerHTML = ( /*html*/ `<div class="comiis_p12 f14 bg_f f_c b_b cl" style="padding-bottom:10px">搜索记录个数: ` + localHistorySearchText.length + /*html*/ `<button class="btn_clear_search_history" style=" border: none; float: right; background: red; color: #fff; border-radius: 3px; font-weight: 600; min-width: 20vw; width: 20vw; ">清理记录</button></div>` ); DOMUtils.before( document.querySelector(".comiis_p12"), clear_history_innerHTML ); let $searchHistory = document.querySelector(".btn_clear_search_history"); DOMUtils.on($searchHistory, "click", (event) => { utils.preventEvent(event); _GM_deleteValue("search_history"); window.location.reload(); }); } search_event(); add_clear_history(); }, /** * 修复清空按钮 */ repairClearBtn() { utils.waitNode("a.ssclose").then(($empty) => { log.info(`修复清空按钮`); DOMUtils.on( $empty, "click", (event) => { let $input = document.querySelector("#scform_srchtxt"); if ($input) { $input.value = ""; } else { Qmsg.error("获取输入框失败"); } }, { capture: true } ); }); }, /** * 搜索框自动获取焦点 */ searchInputAutoFocus() { let searchParams = new URLSearchParams(window.location.search); if (searchParams.has("kw")) { return; } utils.waitNode("#scform_srchtxt").then(($input) => { log.info(`搜索框自动获取焦点`); $input.focus(); }); } }; const MTSign = { init() { domUtils.ready(() => { PopsPanel.execMenuOnce("mt-sign-showTodaySignStar", () => { this.showTodaySignStar(); }); PopsPanel.execMenuOnce("mt-sign-showTodayRanking", () => { this.showTodayRanking(); }); }); }, /** * 显示【今日签到之星】 */ async showTodaySignStar() { log.info(`显示【今日签到之星】`); let todayStarParent = document.querySelector( ".pg_k_misign .comiis_qdinfo" ); let todayStar = document.createElement("ul"); let response = await httpx.get("/k_misign-sign.html", { headers: { "User-Agent": utils.getRandomPCUA() } }); if (!response.status) { return; } let doc = domUtils.parseHTML(response.data.responseText, true, true); let todatastarele = doc.querySelector("#pt span.xg1"); if (!todatastarele) { return; } let todaypeople = domUtils.text(todatastarele).replace( "今日签到之星:", "" ); todayStar.innerHTML = /*html*/ ` <li class="f_f" style="display: flex;flex-direction: column;width: 100%;"> <span class="comiis_tm">今日签到之星</span> ${todaypeople} </li> `; let $comiisSpaceBox = document.querySelector(".comiis_space_box"); let comiis_space_box_height = parseInt( getComputedStyle($comiisSpaceBox, null)["height"].replace("px", "") ); let comiis_space_box_padding_bottom = parseInt( getComputedStyle($comiisSpaceBox, null)["paddingBottom"].replace("px", "") ); let total_height = comiis_space_box_height + comiis_space_box_padding_bottom + 50; addStyle( /*css*/ ` .comiis_space_box{ height: ${total_height}px; background-size: 100% 100%; } .pg_k_misign .comiis_qdinfo{ height: 110px !important; }` ); todayStarParent.append(todayStar); }, /** * 显示【今日最先】 */ showTodayRanking() { log.info(`显示【今日最先】`); let today_ranking_ele = document.querySelector( ".comiis_topnv .comiis_flex .flex" ); let $li = domUtils.createElement("li", { className: "flex" }); let $todayLatest = domUtils.createElement( "a", { id: "k_misignlist_today_latest", href: "javascript:;", innerHTML: "今日最先" }, { onclick: "ajaxlist('todayLatest');" } ); $li.appendChild($todayLatest); domUtils.after(today_ranking_ele, $li); let getMaxPage = async (urlextra2) => { let response = await httpx.get( `/k_misign-sign.html?operation=${urlextra2}`, { responseType: "html", headers: { "User-Agent": utils.getRandomPCUA() } } ); if (!response.status) { return; } let doc = domUtils.parseHTML(response.data.responseText, true, true); let last_page = doc.querySelector( "#J_list_detail .pg span" ); if (last_page && typeof last_page.title != "undefined") { let last_page_match = last_page.title.match(/([0-9]+)/); if (last_page_match && last_page_match.length == 2) { return parseInt(last_page_match[last_page_match.length - 1]); } else { Qmsg.error("获取页失败"); } } else { Qmsg.error("请求最先签到的页失败"); } }; let getPagePeople = async (page) => { let response = await httpx.get( `/k_misign-sign.html?operation=list&op=&page=${page}`, { responseType: "html", headers: { "User-Agent": utils.getRandomPCUA() } } ); if (!response.status) { return; } let doc = domUtils.parseHTML(response.data.responseText, true, true); let peoples = doc.querySelectorAll( "#J_list_detail tbody tr" ); let ret_array = []; if (peoples.length == 2 && peoples[0].textContent.indexOf("暂无内容") != -1) { return ret_array; } for (let index = 1; index <= peoples.length - 2; index++) { let people = peoples[index]; let ret_json = { user: "", uid: "", avatar: "", days: "", monthDays: "", time: "", reward: "" }; let user_name = people.children[0].getElementsByTagName("a")[0].textContent; let space_url = people.children[0].getElementsByTagName("a")[0].href; let uid = space_url.match(/space-uid-([0-9]*)/)[1]; let sign_all_days = people.children[1].textContent; let sign_month_days = people.children[2].textContent; let sign_time = people.children[3].textContent; let sign_reward = people.children[5].textContent; ret_json["user"] = user_name; ret_json["uid"] = uid; ret_json["avatar"] = MTUtils.getAvatar(uid, "small"); ret_json["days"] = sign_all_days; ret_json["monthDays"] = sign_month_days; ret_json["time"] = sign_time; ret_json["reward"] = sign_reward; ret_array.push(ret_json); } return ret_array; }; function changeRankList(data, listtype) { let $ranklist = document.querySelector("#ranklist"); domUtils.html($ranklist, data); domUtils.attr($ranklist, "listtype", listtype); } _unsafeWindow.ajaxlist = async (listtype) => { listtype = listtype; if (listtype == "today") { loadingdelay = false; urlextra = "list&op=today"; } else if (listtype == "month") { loadingdelay = false; urlextra = "list&op=month"; } else if (listtype == "zong") { loadingdelay = false; urlextra = "list&op=zong"; } else if (listtype == "calendar") { loadingdelay = true; urlextra = "calendar"; } else { loadingdelay = false; urlextra = "list"; } if (listtype == "todayLatest") { loadingdelay = false; urlextra = "list&op=&page=0"; let maxPage = await getMaxPage(urlextra); if (!maxPage) { return; } let latestPeople = await getPagePeople(maxPage); latestPeople.reverse(); if (latestPeople.length < 10) { let latestPeople_2 = await getPagePeople(maxPage - 1); latestPeople_2.reverse(); latestPeople = latestPeople.concat(latestPeople_2); latestPeople.reverse(); } let peopleHTML = ""; latestPeople.reverse(); latestPeople.forEach((people) => { peopleHTML = peopleHTML + /*html*/ ` <tbody id="autolist_${people["uid"]}"> <tr> <td class="k_misign_lu"> <a href="home.php?mod=space&uid=${people["uid"]}"> <img src="${people["avatar"]}" loading="lazy"> </a> </td> <td class="k_misign_ll"><span></span></td> <td class="k_misign_lc"> <h4 class="f_c"> <a href="home.php?mod=space&uid=${people["uid"]}">${people["user"]}</a> <span>${people["time"]}</span> <span class="y">总天数 ${people["days"]}天</span> </h4> <p class="f_0">月天数 ${people["monthDays"]} 天,上次奖励 ${people["reward"]}</p> </td> </tr> </tbody>`; }); let latestHTML = ( /*html*/ ` <li class="styli_h bg_e"></li> <div class="comiis_topnv bg_f b_t b_b"> <ul class="comiis_flex"> <li class="flex"><a href="javascript:;" id="k_misignlist_today" onclick="ajaxlist('today');">今日排行</a></li> <li class="flex f_0"><em class="bg_0"></em><a href="javascript:;" id="k_misignlist_today_latest" onclick="ajaxlist('todayLatest');">今日最先</a> </li> <li class="flex"><a href="javascript:;" id="k_misignlist_month" onclick="ajaxlist('month');" class="f_c">本月排行</a> </li> <li class="flex"><a href="javascript:;" id="k_misignlist_zong" onclick="ajaxlist('zong');" class="f_c">总排行</a></li> </ul> </div> <div class="k_misign_wp"> <div class="k_misign_list bg_f"> <table id="misign_list"> ${peopleHTML} </table> </div> </div>` ); changeRankList(latestHTML, listtype); } else { httpx.get(`plugin.php?id=k_misign:sign&operation=${urlextra}`, { responseType: "html", fetch: true }).then((response) => { let data = response.data.responseText; data = data.replace( `今日排行</a></li>`, `今日排行</a></li> <li class="flex"> <a href="javascript:;" id="k_misignlist_today_latest" onclick="ajaxlist('todayLatest');" class="f_c">今日最先</a> </li>` ); if (listtype == "today") { data = data.replace( `<li class="flex"><a href="javascript:;" id="k_misignlist_today" onclick="ajaxlist('today');">今日排行</a></li>`, /*html*/ ` <li class="flex f_0"> <em class="bg_0"></em> <a href="javascript:;" id="k_misignlist_today" onclick="ajaxlist('today');">今日排行</a> </li> ` ); } changeRankList(data, listtype); }); } }; } }; const MTSpace = { init() { PopsPanel.execMenuOnce("mt-space-repairEnterSpace", () => { this.repairEnterSpace(); }); domUtils.ready(() => { PopsPanel.execMenuOnce("mt-space-showCommentContent", () => { this.showCommentContent(); }); }); }, /** * 修复无法进入空间 */ repairEnterSpace() { log.info(`修复无法进入空间`); if (Router.isSpace()) { let hrefParamsMatchArray = window.location.href.match(/home.php\?(.+)/gi); let href_params = hrefParamsMatchArray[hrefParamsMatchArray.length - 1]; let params_split = href_params.split("&"); if (params_split.length == 2 && href_params.indexOf("uid=") != -1 && href_params.indexOf("mod=space") != -1) { window.location.href = window.location.href + "&do=profile"; } } else if (Router.isSpaceWithAt()) { let hrefParamsMatchArray = window.location.href.match(/space-uid-(.+).html/i); let href_params = hrefParamsMatchArray[hrefParamsMatchArray.length - 1]; window.location.href = `${window.location.origin}/home.php?mod=space&uid=${href_params}&do=profile`; } }, /** * 显示帖子回复内容 */ async showCommentContent() { log.info(`显示帖子回复内容`); addStyle( /*css*/ ` div.contrete-reply{padding:5px 10px;border-top:1px solid #f3f3f3} div.contrete-reply a{margin:0 10px} ` ); async function getPCReply() { let response = await httpx.get(window.location.href, { headers: { "User-Agent": utils.getRandomPCUA() } }); if (!response.status) { return; } let doc = domUtils.parseHTML(response.data.responseText, true, true); let r###ltList = []; doc.querySelectorAll("#delform tr.bw0_all+tr").forEach((item) => { let replyData = []; let tagTDNode = item.querySelector("td"); let tagTDValue = domUtils.html(tagTDNode).replace(/^ /, ""); replyData.push(tagTDValue); let nextHTML = domUtils.next(item); let $tr = doc.querySelectorAll("#delform tr"); for (let index = 0; index < $tr.length; index++) { if (!nextHTML || domUtils.attr(nextHTML, "class") === "bw0_all") { break; } let nextTdHTML = nextHTML.querySelector("td"); let nextValue = domUtils.html(nextTdHTML).replace(/^ /, ""); replyData = replyData.concat(nextValue); nextHTML = domUtils.next(nextHTML); } r###ltList.push(...replyData); }); return r###ltList; } function getForumList() { return utils.getNodeListValue( ElementUtils.comiisForumList(), ElementUtils.comiisPostli(), ElementUtils.comiisMmlist() ); } function formatPCReply(dataList) { let r###ltJSON = {}; dataList.forEach((item) => { var _a2; let divItem = domUtils.createElement("div", { innerHTML: item }); let url = (_a2 = divItem.querySelector("a")) == null ? void 0 : _a2.getAttribute("href"); let paramPtidMatch = url.match(MTRegExp.ptid); let paramPidMatch = url.match(MTRegExp.pid); if (!paramPtidMatch) { Qmsg.error("获取ptid失败"); return; } if (!paramPidMatch) { Qmsg.error("获取pid失败"); return; } let paramPtid = paramPtidMatch[paramPtidMatch.length - 1]; let paramPid = paramPidMatch[paramPidMatch.length - 1]; if (r###ltJSON[paramPtid]) { r###ltJSON[paramPtid]["data"].push(item); } else { r###ltJSON[paramPtid] = { ptid: paramPtid, pid: paramPid, data: [item] }; } }); return r###ltJSON; } var pcReplyArray = await getPCReply(); if (pcReplyArray == null) { return; } var pcReplyJSON = formatPCReply(pcReplyArray); let forumList = getForumList(); forumList.forEach((forumListItem, forumListItemIndex) => { let praiseNode = forumListItem.querySelector( ".comiis_xznalist_bottom a" ); let forumTid = praiseNode.getAttribute("tid"); if (!forumTid) { Qmsg.error("获取帖子tid失败"); log.error(forumListItem); return; } if (!pcReplyJSON[forumTid]) { return; } pcReplyJSON[forumTid]["data"].forEach((forumListReplyHTMLItem) => { domUtils.append( forumListItem, `<div class="contrete-reply">${forumListReplyHTMLItem}</div>` ); }); }); } }; const MTPaidThemePost = { $key: { tipData: "tipToFre###bjectForumPost" }, init() { this.registerMenu(); let setTipForumPostList = this.getTipData(); if (Router.isPost()) { let $kmren = document.querySelector("span.kmren"); if ($kmren) { log.info("当前帖子存在需要购买主题"); let isAddTip = false; let $tipBtn; setTipForumPostList.forEach((item, index) => { if (window.location.href.match(item["url"])) { isAddTip = true; return; } }); if (isAddTip) { log.warn("已设置提醒"); $tipBtn = domUtils.createElement("a", { href: "javascript:;", className: "styli_tit f_c", innerHTML: ( /*html*/ ` <i class="comiis_font" style="color: #ffffff;"></i> ` ) }); domUtils.on($tipBtn, "click", function() { __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "<p>确定移出付费主题白嫖列表?</p>", html: true }, btn: { ok: { callback: function() { let findIndex = setTipForumPostList.findIndex( (item, index) => { return window.location.href.match(item["url"]); } ); if (findIndex !== -1) { setTipForumPostList.splice(findIndex, 1); MTPaidThemePost.setTipData(setTipForumPostList); Qmsg.success("移除成功"); } else { Qmsg.error("移除失败"); } } } }, mask: { enable: true }, width: "88vw", height: "300px" }); }); } else { log.info("未设置提醒"); $tipBtn = domUtils.createElement("a", { href: "javascript:;", className: "styli_tit f_c", innerHTML: ( /*html*/ ` <i class="comiis_font" style="color: #FF9900;"></i> ` ) }); domUtils.on($tipBtn, "click", () => { let $_kmren = document.querySelector(".kmren"); let $_kmren_parent = domUtils.parent($_kmren); let expirationTimeMatch = domUtils.text($_kmren_parent).replace(/\t|\n/g, "").match( /[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}[\s]{1}[0-9]{1,2}:[0-9]{1,2}/ ); if (!expirationTimeMatch || expirationTimeMatch.length == 0) { Qmsg.error("获取付费主题到期时间失败"); return; } let expirationTime = expirationTimeMatch[0]; let expirationTimeStamp = utils.formatToTimeStamp(expirationTime); setTipForumPostList.push({ url: window.location.href, title: document.title.replace(" - MT论坛", ""), expirationTime, expirationTimeStamp, isVisited: false }); _GM_setValue("tipToFre###bjectForumPost", setTipForumPostList); Qmsg.success("添加成功"); setTimeout(function() { window.location.reload(); }, 1500); }); } let $header_y = document.querySelector( ".comiis_head.f_top .header_y" ); domUtils.append($header_y, $tipBtn); } } function getTipNums() { let needTipNums = 0; Array.from(MTPaidThemePost.getTipData()).forEach((item, index) => { if ((/* @__PURE__ */ new Date()).getTime() > item["expirationTimeStamp"] && item["isVisited"] == false) { needTipNums += 1; } }); return needTipNums; } if (Router.isMySpace() || Router.isGuide() || Router.isForumList() || Router.isPlate()) { let redBtn2 = document.querySelector( ".icon_msgs.bg_del.f_f" ); let tipNums2 = 0; if (redBtn2) { tipNums2 = parseInt(domUtils.text(redBtn2)); domUtils.html(redBtn2, (tipNums2 + getTipNums()).toString()); domUtils.append( ".comiis_head .header_z .kmuser em", `<span class="icon_msgs bg_del"></span>` ); } else { let tipnums = getTipNums(); if (tipnums) { domUtils.append( ".comiis_head .header_z .kmuser em", `<span class="icon_msgs bg_del"></span>` ); } } } let redBtn = document.querySelector( ".sidenv_num.bg_del.f_f" ); let tipNums = 0; if (redBtn) { tipNums = parseInt(domUtils.text(redBtn)); domUtils.html( ".sidenv_num.bg_del.f_f", (tipNums + getTipNums()).toString() ); } else { let tipnums = getTipNums(); if (tipnums) { domUtils.before( ".sidenv_user em", `<span class="sidenv_num bg_del f_f">${tipnums}</span>` ); } } if (getTipNums()) { domUtils.append( ".comiis_left_Touch .paymentsubjectreminder div.flex", /*html*/ ` <span class="sidenv_num bg_del f_f" style=" position: relative; border-radius: 18px; height: 6px; width: 6px; left: 3px; display: inline-flex; bottom: 8px; "></span>` ); } }, registerMenu() { ElementUtils.registerLeftMenu({ name: "付费主题白嫖提醒", icon: "", iconColor: "#ec0000", callback: () => { this.showView(); } }); }, /** * 显示白嫖列表 */ showView() { log.info(`显示白嫖列表`); let data = MTPaidThemePost.getTipData(); __pops.alert({ title: { text: "付费主题白嫖列表", position: "center" }, content: { text: "", html: true }, btn: { ok: { text: "关闭", type: "default" } }, mask: { enable: true }, width: "88vw", height: "88vh" }); let notVisitedTipContent = ""; let notVisitedNums = 0; let isFreeContent = ""; let isPaidContent = ""; let isFreeNotVisitedContentList = []; let isFreeContentList = []; let isPaidContentList = []; data.forEach((item, index) => { let timeColor = "#f91212"; let leftRedBtn = ""; if ((/* @__PURE__ */ new Date()).getTime() > item["expirationTimeStamp"]) { timeColor = "#1e90ff"; if (item["isVisited"]) ; else { leftRedBtn = /*html*/ ` <span class="icon_msgs bg_del" style="position: fixed;width: 10px;height: 10px;border-radius: 50%;margin: 10px 0px 0px -15px;"></span> `; notVisitedNums = notVisitedNums + 1; } } let contentInfo = { content: ( /*html*/ ` <tbody id="autolist"> <tr> <td style="width: 100%;"> <div style="display: inline-flex;"> ${leftRedBtn} <div style="width: 240px;"> <a href="javascript:void(0);" t-href="${item["url"]}" t-index="${index}" style="color: #1e90ff;">${item["title"]}</a> <li style="margin: 5px 15px;color: ${timeColor};">${item["expirationTime"]}</li> </div> <div style="align-self: center;margin-left: 10px;" t-index="${index}" class="delsubjecttip"> <i class="comiis_font" style="font-size: 24px;padding: 0px 6px;"></i> </div> </div> </td> </tr> <tr style="height:15px;"></tr> </tbody>` ), timestamp: item["expirationTimeStamp"] }; if ((/* @__PURE__ */ new Date()).getTime() > item["expirationTimeStamp"]) { if (leftRedBtn != "") { isFreeNotVisitedContentList.push(contentInfo); } else { isFreeContentList.push(contentInfo); } } else { isPaidContentList.push(contentInfo); } }); log.info("可白嫖但未访问:", isFreeNotVisitedContentList); log.info("可白嫖:", isFreeContentList); log.info("未到白嫖时间:", isPaidContentList); utils.sortListByProperty( isFreeNotVisitedContentList, "expirationTimeStamp", false ); utils.sortListByProperty(isFreeContentList, "timestamp", false); utils.sortListByProperty(isPaidContentList, "timestamp", false); log.info("排序后——可白嫖但未访问:", isFreeNotVisitedContentList); log.info("排序后——可白嫖:", isFreeContentList); log.info("排序后——未到白嫖时间:", isPaidContentList); isFreeContent = utils.mergeArrayToString(isFreeNotVisitedContentList, "content") + utils.mergeArrayToString(isFreeContentList, "content"); isPaidContent = utils.mergeArrayToString(isPaidContentList, "content"); if (notVisitedNums > 0) { notVisitedTipContent = /*html*/ ` <span class="icon_msgs bg_del f_f" style=" display: inline-block; position: absolute; width: 16px; height: 16px; line-height: 16px; border-radius: 50%; font-size: 14px; text-align: center; margin: 3px 0px 0px 10px; ">${notVisitedNums}</span>`; } let dialogIsFreeContent = ( /*html*/ ` <details class="subjectcanvisit" open=""> <summary>可白嫖${notVisitedTipContent}</summary> <table id="paymentSubjectReminderIsFreeList" style="overflow: auto;height: inherit;margin: 15px 0px;"> ${isFreeContent} </table> </details> ` ); let dialogIsPaidContent = ( /*html*/ ` <details class="subjectnotvisit"> <summary>需付费</summary> <table id="paymentSubjectReminderIsPaidList" style="overflow: auto;height: inherit;margin: 15px 0px;"> ${isPaidContent} </table> </details> ` ); let $msgcon = document.querySelector(".msgcon"); domUtils.html($msgcon, ""); domUtils.append($msgcon, dialogIsFreeContent); domUtils.append($msgcon, dialogIsPaidContent); domUtils.css($msgcon, "height", "400px"); domUtils.on( document.querySelector(".delsubjecttip i.comiis_font"), "click", (event) => { let $click = event.target; let $parent = domUtils.parent($click); var t_index = parseInt($parent.getAttribute("t-index")); __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "<p>确定移出付费主题白嫖列表?</p>", html: true }, mask: { enable: true }, btn: { ok: { callback: (details) => { data.splice(t_index, 1); MTPaidThemePost.setTipData(data); utils.deleteParentNode($click, "tr"); details.close(); } } }, width: "80vw", height: "300px" }); } ); let $paymentSubjectReminderIsFreeList = document.querySelector( "#paymentSubjectReminderIsFreeList" ); domUtils.on($paymentSubjectReminderIsFreeList, "click", "a", (event) => { var _a2, _b, _c, _d, _e, _f; let $click = event.target; var tIndex = parseInt($click.getAttribute("t-index")); var tHref = $click.getAttribute("t-href"); data[tIndex]["isVisited"] = true; MTPaidThemePost.setTipData(data); window.open(tHref, "_blank"); $click.setAttribute("style", "color: #000000;"); if (((_b = (_a2 = $click == null ? void 0 : $click.parentElement) == null ? void 0 : _a2.parentElement) == null ? void 0 : _b.children[0].className) != "icon_msgs bg_del") { return; } $click.parentElement.parentElement.children[0].remove(); domUtils.append( $paymentSubjectReminderIsFreeList, (_f = (_e = (_d = (_c = $click == null ? void 0 : $click.parentElement) == null ? void 0 : _c.parentElement) == null ? void 0 : _d.parentElement) == null ? void 0 : _e.parentElement) == null ? void 0 : _f.parentElement ); let $del = document.querySelector( ".subjectcanvisit summary span.icon_msgs.bg_del.f_f" ); let notVisitedNumsStr = domUtils.text($del); let notVisitedNums2 = parseInt(notVisitedNumsStr) - 1; if (notVisitedNums2 > 0) { domUtils.html($del, notVisitedNums2.toString()); } else { $del.remove(); } }); let $paymentSubjectReminderIsPaidList = document.querySelector( "paymentSubjectReminderIsPaidList" ); domUtils.on($paymentSubjectReminderIsPaidList, "click", "a", (event) => { let $click = event.target; $click.getAttribute("t-index"); var t_href = $click.getAttribute("t-href"); window.open(t_href, "_blank"); $click.setAttribute("style", "color: #000000;"); }); }, getTipData() { return _GM_getValue(this.$key.tipData, []); }, setTipData(data) { _GM_setValue(this.$key.tipData, data); } }; const smallWindowCSS = ".pops {\r\n --icon-width: 24px;\r\n --right-btn-width: 115px;\r\n}\r\n\r\n.small-window-drag {\r\n width: 100%;\r\n position: relative;\r\n height: 10px;\r\n}\r\n.small-window-drag div {\r\n width: 50px;\r\n margin: 0 auto;\r\n height: 4px;\r\n background: #d9d9d9;\r\n border-radius: 15px;\r\n bottom: 3px;\r\n position: relative;\r\n}\r\n\r\n.pops[type-value] .pops-drawer-title {\r\n display: block;\r\n background: #fff;\r\n width: 100%;\r\n box-sizing: border-box;\r\n padding: 16px 0px;\r\n border-bottom: 1px solid #d6d6d6;\r\n}\r\n\r\n.small-window-title-container {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 0px 16px;\r\n}\r\n.small-window-website-icon {\r\n width: var(--icon-width);\r\n height: var(--icon-width);\r\n align-self: center;\r\n border-radius: 3px;\r\n}\r\n.small-window-title-text-container {\r\n margin-right: auto;\r\n max-width: calc(100% - var(--icon-width) - var(--right-btn-width));\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n padding: 0px 16px;\r\n}\r\n.small-window-title-text,\r\n.small-window-website-host {\r\n min-width: 150px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n.xtiper_sheet_tit.xtiper_sheet_left {\r\n display: block;\r\n background: #fff;\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n.small-window-protocol-info {\r\n display: flex;\r\n align-items: center;\r\n}\r\n.small-window-control {\r\n display: flex;\r\n align-items: center;\r\n align-content: center;\r\n width: var(--right-btn-width);\r\n justify-content: center;\r\n gap: 12px;\r\n}\r\n.small-window-control-image-view,\r\n.small-window-control-open-blank,\r\n.small-window-control-close {\r\n width: 2rem;\r\n height: 2rem;\r\n text-align: center;\r\n margin: 0 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.refresh-icon {\r\n width: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 0px 16px;\r\n}\r\n.refresh-icon-in,\r\n.refresh-icon-out {\r\n position: absolute;\r\n border: 5px solid rgba(0, 183, 229, 0.9);\r\n opacity: 0.9;\r\n border-radius: 50px;\r\n box-shadow: 0 0 15px #2187e7;\r\n width: 20px;\r\n height: 20px;\r\n margin: 0 auto;\r\n}\r\n.refresh-icon-out {\r\n background-color: rgba(0, 0, 0, 0);\r\n border-right: 5px solid transparent;\r\n border-left: 5px solid transparent;\r\n -moz-animation: spinPulse 1s infinite ease-in-out;\r\n -webkit-animation: spinPulse 1s infinite ease-in-out;\r\n -o-animation: spinPulse 1s infinite ease-in-out;\r\n -ms-animation: spinPulse 1s infinite ease-in-out;\r\n}\r\n.refresh-icon-in {\r\n background: rgba(0, 0, 0, 0) no-repeat center center;\r\n border-top: 5px solid transparent;\r\n border-bottom: 5px solid transparent;\r\n -moz-animation: spinoffPulse 3s infinite linear;\r\n -webkit-animation: spinoffPulse 3s infinite linear;\r\n -o-animation: spinoffPulse 3s infinite linear;\r\n -ms-animation: spinoffPulse 3s infinite linear;\r\n}\r\n@-moz-keyframes spinPulse {\r\n 0% {\r\n -moz-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -moz-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -moz-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-moz-keyframes spinoffPulse {\r\n 0% {\r\n -moz-transform: rotate(0);\r\n }\r\n 100% {\r\n -moz-transform: rotate(360deg);\r\n }\r\n}\r\n@-webkit-keyframes spinPulse {\r\n 0% {\r\n -webkit-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -webkit-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -webkit-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-webkit-keyframes spinoffPulse {\r\n 0% {\r\n -webkit-transform: rotate(0);\r\n }\r\n 100% {\r\n -webkit-transform: rotate(360deg);\r\n }\r\n}\r\n@-o-keyframes spinPulse {\r\n 0% {\r\n -o-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -o-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -o-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-o-keyframes spinoffPulse {\r\n 0% {\r\n -o-transform: rotate(0);\r\n }\r\n 100% {\r\n -o-transform: rotate(360deg);\r\n }\r\n}\r\n@-ms-keyframes spinPulse {\r\n 0% {\r\n -ms-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -ms-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -ms-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-ms-keyframes spinoffPulse {\r\n 0% {\r\n -ms-transform: rotate(0);\r\n }\r\n 100% {\r\n -ms-transform: rotate(360deg);\r\n }\r\n}\r\n@-moz-keyframes spinPulse {\r\n 0% {\r\n -moz-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -moz-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -moz-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-moz-keyframes spinoffPulse {\r\n 0% {\r\n -moz-transform: rotate(0);\r\n }\r\n 100% {\r\n -moz-transform: rotate(360deg);\r\n }\r\n}\r\n@-webkit-keyframes spinPulse {\r\n 0% {\r\n -webkit-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -webkit-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -webkit-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-webkit-keyframes spinoffPulse {\r\n 0% {\r\n -webkit-transform: rotate(0);\r\n }\r\n 100% {\r\n -webkit-transform: rotate(360deg);\r\n }\r\n}\r\n@-o-keyframes spinPulse {\r\n 0% {\r\n -o-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -o-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -o-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-o-keyframes spinoffPulse {\r\n 0% {\r\n -o-transform: rotate(0);\r\n }\r\n 100% {\r\n -o-transform: rotate(360deg);\r\n }\r\n}\r\n@-ms-keyframes spinPulse {\r\n 0% {\r\n -ms-transform: rotate(160deg);\r\n opacity: 0;\r\n box-shadow: 0 0 1px #505050;\r\n }\r\n 50% {\r\n -ms-transform: rotate(145deg);\r\n opacity: 1;\r\n }\r\n 100% {\r\n -ms-transform: rotate(-320deg);\r\n opacity: 0;\r\n }\r\n}\r\n@-ms-keyframes spinoffPulse {\r\n 0% {\r\n -ms-transform: rotate(0);\r\n }\r\n 100% {\r\n -ms-transform: rotate(360deg);\r\n }\r\n}\r\n"; class GestureBack { constructor(config) { /** * 是否正在后退 */ __publicField(this, "isBacking", false); __publicField(this, "config"); this.config = config; this.enterGestureBackMode = this.enterGestureBackMode.bind(this); this.quitGestureBackMode = this.quitGestureBackMode.bind(this); this.popStateEvent = this.popStateEvent.bind(this); if (typeof this.config.backDelayTime !== "number" || isNaN(this.config.backDelayTime)) { this.config.backDelayTime = 150; } if (this.config.win == null) { this.config.win = self; } } /** * popstate事件函数 * @param event */ popStateEvent(event) { utils.preventEvent(event); if (this.isBacking) { return; } this.quitGestureBackMode(true); } /** * 进入手势模式 */ enterGestureBackMode() { log.success("进入手势模式"); let pushUrl = this.config.hash; if (!pushUrl.startsWith("#")) { if (!pushUrl.startsWith("/")) { pushUrl = "/" + pushUrl; } pushUrl = "#" + pushUrl; } if (this.config.useUrl) { pushUrl = this.config.win.location.origin + this.config.win.location.pathname + this.config.win.location.search + pushUrl; } this.config.win.history.pushState({}, "", pushUrl); log.success("监听popstate事件"); domUtils.on(this.config.win, "popstate", this.popStateEvent, { capture: true }); } /** * 退出手势模式 * @param isUrlChange 是否是url改变触发的 */ async quitGestureBackMode(isUrlChange = false) { this.isBacking = true; log.success("退出手势模式"); if (typeof this.config.beforeHistoryBackCallBack === "function") { this.config.beforeHistoryBackCallBack(isUrlChange); } let maxDate = Date.now() + 1e3 * 5; while (true) { if (Date.now() > maxDate) { log.error("未知情况,history.back()失败,无法退出手势模式"); break; } if (this.config.win.location.hash.endsWith(this.config.hash)) { log.info("history.back()"); this.config.win.history.back(); await utils.sleep(this.config.backDelayTime || 150); } else { break; } } log.success("移除popstate事件"); domUtils.off(this.config.win, "popstate", this.popStateEvent, { capture: true }); this.isBacking = false; if (typeof this.config.afterHistoryBackCallBack === "function") { this.config.afterHistoryBackCallBack(isUrlChange); } } } const MTSmallWindowIcon = { /** 锁图标 */ https: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" width="12" height="12" style="margin: 0px 6px 0px 2px;"> <path fill="#000000" d="M842.666667 384h-74.666667V277.333333a234.666667 234.666667 0 1 0-469.333333 0v106.666667H224a53.393333 53.393333 0 0 0-53.333333 53.333333v490.666667a53.393333 53.393333 0 0 0 53.333333 53.333333h618.666667a53.393333 53.393333 0 0 0 53.333333-53.333333V437.333333a53.393333 53.393333 0 0 0-53.333333-53.333333zM341.333333 277.333333c0-105.866667 86.133333-192 192-192s192 86.133333 192 192v106.666667H341.333333z"></path> </svg>` ), /** 开锁图标 */ http: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" width="12" height="12"> <path fill="#2c2c2c" d="M770.423989 451.309956H368.89432V284.246158c0-80.739434 65.689748-146.429182 146.429182-146.429182S661.738235 203.506724 661.738235 284.246158a43.350032 43.350032 0 0 0 86.700063 0c0-128.547294-104.581952-233.129246-233.122021-233.129246-128.547294 0-233.129246 104.581952-233.129245 233.129246v167.063798h-21.978466a43.350032 43.350032 0 0 0-43.350032 43.350031v437.965371a43.350032 43.350032 0 0 0 43.350032 43.350032h510.215423a43.350032 43.350032 0 0 0 43.350032-43.350032V494.659987a43.350032 43.350032 0 0 0-43.350032-43.350031z"></path> </svg>` ), /** 新标签页打开 */ openBlank: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg"> <path d="M192 288A96 96 0 0 1 288 192h128a32 32 0 0 0 0-64h-128A160 160 0 0 0 128 288v448A160 160 0 0 0 288 896h448a160 160 0 0 0 160-160v-128a32 32 0 0 0-64 0v128a96 96 0 0 1-96 96h-448A96 96 0 0 1 192 736v-448z" fill="#000000" fill-opacity=".85"></path> <path d="M608 128a32 32 0 0 0 0 64h178.752L521.344 457.344a32 32 0 1 0 45.312 45.312L832 237.248V416a32 32 0 0 0 64 0v-256a32 32 0 0 0-32-32h-256z" fill="#000000" fill-opacity=".85" p-id="2334"></path> </svg>` ), /** 关闭 */ close: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg"> <path d="M0 0h####v####H0z" fill="#FF0033" fill-opacity="0" p-id="3329"></path><path d="M240.448 168l2.346667 2.154667 289.92 289.941333 279.253333-279.253333a42.666667 42.666667 0 0 1 62.506667 58.026666l-2.133334 2.346667-279.296 279.210667 279.274667 279.253333a42.666667 42.666667 0 0 1-58.005333 62.528l-2.346667-2.176-279.253333-279.253333-289.92 289.962666a42.666667 42.666667 0 0 1-62.506667-58.005333l2.154667-2.346667 289.941333-289.962666-289.92-289.92a42.666667 42.666667 0 0 1 57.984-62.506667z" fill="#111111" p-id="3330"></path> </svg>` ), /** 图片预览 */ image: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg"> <path d="M938.666667 553.92V768c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v297.92z m-64-74.624V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v344.48A290.090667 290.090667 0 0 1 192 597.333333a286.88 286.88 0 0 1 183.296 65.845334C427.029333 528.384 556.906667 437.333333 704 437.333333c65.706667 0 126.997333 16.778667 170.666667 41.962667z m0 82.24c-5.333333-8.32-21.130667-21.653333-43.648-32.917333C796.768 511.488 753.045333 501.333333 704 501.333333c-121.770667 0-229.130667 76.266667-270.432 188.693334-2.730667 7.445333-7.402667 20.32-13.994667 38.581333-7.68 21.301333-34.453333 28.106667-51.370666 13.056-16.437333-14.634667-28.554667-25.066667-36.138667-31.146667A222.890667 222.890667 0 0 0 192 661.333333c-14.464 0-28.725333 1.365333-42.666667 4.053334V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V561.525333zM320 480a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m0-64a32 32 0 1 0 0-64 32 32 0 0 0 0 64z" fill="#000000"></path> </svg>` ), /** 坐标的网站图标 */ mt: ( /*html*/ ` <svg viewBox="0 0 #### ####" version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24"> <path d="M979.622067 257.689317c22.828607 10.592474 32.873194 37.804173 22.280721 60.63278l-166.009631 359.778848c-10.592474 22.828607-37.804173 32.873194-60.63278 22.280721l-292.3888-134.780097c-22.828607-10.592474-32.873194-37.804173-22.280721-60.63278l166.009631-359.778848c10.592474-22.828607 37.804173-32.873194 60.632781-22.28072l292.388799 134.780096z" fill="#FFBA02" p-id="1715"></path><path d="M658.743166 46.205101v467.529873c0 25.202782-20.637061 45.657214-45.657214 45.657214H145.556078c-25.202782 0-45.657214-20.637061-45.657214-45.657214v-467.529873c0-25.202782 20.637061-45.657214 45.657214-45.657214h467.529874c25.202782 0 45.657214 20.454432 45.657214 45.657214z" fill="#E2E0E2" p-id="1716"></path><path d="M204.910457 236.50437a177.149991 175.871589 0 1 0 354.299982 0 177.149991 175.871589 0 1 0-354.299982 0Z" fill="#3D82FF" p-id="1717"></path><path d="M245.636692 42.369895a9.861958 9.679329 0 1 0 19.723916 0 9.861958 9.679329 0 1 0-19.723916 0Z" fill="#3D82FF" p-id="1718"></path><path d="M501.864978 43.10041a10.409845 10.409845 0 1 0 20.81969 0 10.409845 10.409845 0 1 0-20.81969 0Z" fill="#3D82FF" p-id="1719"></path><path d="M454.774127 104.071054l48.495267-66.347237 16.807334 12.285443-48.495267 66.347237zM248.102182 48.730858l15.77548-11.220717 50.279551 70.691978-15.775481 11.21889zM204.910457 231.390762h354.299982v193.586588h-354.299982z" fill="#3D82FF" p-id="1720"></path><path d="M280.701432 171.853754a26.115927 25.202782 0 1 0 52.231854 0 26.115927 25.202782 0 1 0-52.231854 0Z" fill="#FFFFFF" p-id="1721"></path><path d="M434.109672 171.671125a25.385411 25.202782 0 1 0 50.770822 0 25.385411 25.202782 0 1 0-50.770822 0Z" fill="#FFFFFF" p-id="1722"></path><path d="M394.844468 1023.817371H50.589073c-25.202782 0-45.657214-20.637061-45.657214-45.657214v-686.684502c0-25.202782 20.637061-45.657214 45.657214-45.657214h344.255395c25.202782 0 45.657214 20.637061 45.657214 45.657214v686.684502c0 25.202782-20.454432 45.657214-45.657214 45.657214z" fill="#303030" p-id="1723"></path><path d="M973.230057 342.976993H50.589073c-25.202782 0-45.657214 20.637061-45.657214 45.657214v589.708579c0 25.202782 20.637061 45.657214 45.657214 45.657214h922.640984c25.202782 0 45.657214-20.637061 45.657215-45.657214V388.634207c0-25.202782-20.637061-45.657214-45.657215-45.657214z" fill="#303030" p-id="1724"></path><path d="M392.287664 488.89745L295.311741 394.843588c-18.080257-17.53237-18.445515-46.570358-1.095773-64.650615l68.303192-70.677368c17.53237-18.080257 46.570358-18.445515 64.650616-1.095773l97.158551 94.053862c18.080257 17.53237 18.445515 46.570358 1.095774 64.650615l-68.303193 70.677367c-17.714999 18.080257-46.752987 18.628143-64.833244 1.095774z" fill="#303030" p-id="1725"></path><path d="M266.273753 628.060638v-13.331906l-54.240771-77.434635v316.495808c0 7.305154-2.556804 13.514535-7.670412 18.628144-5.113608 5.113608-11.322989 7.670412-18.628143 7.670412-7.305154 0-13.514535-2.556804-18.628143-7.853041-5.113608-5.113608-7.670412-11.322989-7.670412-18.445515V465.155698h67.755305l64.467987 94.053861 66.476904-94.053861H424.978229v388.634207c0 7.305154-2.739433 13.514535-8.035669 18.628144-5.296237 5.113608-11.688247 7.670412-18.810773 7.670412-7.122525 0-13.149278-2.556804-18.445514-7.853041-5.113608-5.113608-7.853041-11.322989-7.853041-18.445515V538.572499l-53.144997 74.877831v14.610308c0 7.122525-2.556804 13.149278-7.853041 18.445515-5.113608 5.113608-11.322989 7.853041-18.445515 7.853041-7.305154 0-13.514535-2.556804-18.628143-7.853041-4.930979-5.296237-7.487783-11.322989-7.487783-18.445515z" fill="#FFFFFF" p-id="1726"></path><path d="M600.301932 536.563581V465.703585h264.811842v71.407883c0 7.305154-2.556804 13.514535-7.853041 18.628143-5.113608 5.113608-11.322989 7.670412-18.445514 7.670412-7.305154 0-13.514535-2.556804-18.810772-7.853041-5.296237-5.113608-8.03567-11.322989-8.03567-18.445514v-18.993401h-53.144997v335.48921c0 7.305154-2.556804 13.514535-7.853041 18.628143-5.113608 5.113608-11.322989 7.670412-18.445515 7.670412-7.487783 0-13.879793-2.556804-18.993401-7.670412-5.113608-5.113608-7.853041-11.322989-7.853041-18.628143V518.300696h-53.144997v18.445514c0 7.305154-2.556804 13.514535-7.670412 18.628143-5.113608 5.113608-11.322989 7.670412-18.628143 7.670412-7.305154 0-13.514535-2.556804-18.628144-7.670412-4.74835-5.296237-7.305154-11.505618-7.305154-18.810772z" fill="#FFFFFF"></path> </svg>` ) }; const MTSmallWindow = { $key: { smallWindow: "smallWindow" }, $el: { $refreshIcon: null, $webSiteIcon: null }, init() { let lockFn = new utils.LockFunction(() => { let forumlist = this.getForumList(); if (forumlist.length) { this.handleForumPost(forumlist); } }); utils.mutationObserver(document.documentElement, { callback: (mutations, observer) => { lockFn.run(); }, config: { subtree: true, childList: true } }); }, /** * 获取页面所有的帖子 */ getForumList() { return utils.getNodeListValue( ElementUtils.comiisForumList(), ElementUtils.comiisPostli(), ElementUtils.comiisMmlist() ); }, /** * 显示小窗 * @param title 标题 * @param url 链接 * @param imagesList 图片 */ showSmallWindow(title, url, imagesList = []) { let constructURL = new URL(url); let isHTTPS = constructURL.protocol.includes("https:"); let websiteTitle = ( /*html*/ ` <div class="small-window-drag"> <!-- 这里是拖拽区域 --> <div></div> </div> <div class="small-window-title-container"> <i class="small-window-website-icon" style="display: none;"> ${MTSmallWindowIcon.mt} </i> <div class="refresh-icon"> <div class="refresh-icon-out"></div> <div class="refresh-icon-in"></div> </div> <div class="small-window-title-text-container"> <p class="small-window-title-text">${title}</p> <div class="small-window-protocol-info"> <i class="small-window-protocol-icon"> ${isHTTPS ? MTSmallWindowIcon.https : MTSmallWindowIcon.http} </i> <p class="small-window-website-host">${constructURL.host}</p> </div> </div> <div class="small-window-control"> ${imagesList.length ? ( /*html*/ ` <i class="small-window-control-image-view"> ${MTSmallWindowIcon.image} </i> ` ) : ""} <i class="small-window-control-open-blank"> ${MTSmallWindowIcon.openBlank} </i> <i class="small-window-control-close"> ${MTSmallWindowIcon.close} </i> </div> </div>` ); let $drawer = __pops.drawer({ title: { enable: true, text: websiteTitle, html: true, style: "height: auto;line-height: normal;" }, content: { text: ( /*html*/ ` <iframe scrolling="auto" allowtransparency="true" frameborder="0" src="${url}" style="width:100%; height:100%;"> </iframe> ` ), html: true }, mask: { enable: true, clickEvent: { toClose: true }, clickCallBack(originalRun, config) { getureBack.quitGestureBackMode(); } }, btn: { ok: { enable: false }, cancel: { enable: false }, close: { enable: false } }, direction: "bottom", size: "92%", borderRadius: 18, style: smallWindowCSS }); let $webSiteIcon = $drawer.$shadowRoot.querySelector( ".small-window-website-icon" ); let $refreshIcon = $drawer.$shadowRoot.querySelector(".refresh-icon"); let $imageIcon = $drawer.$shadowRoot.querySelector( ".small-window-control-image-view" ); let $openBlankIcon = $drawer.$shadowRoot.querySelector( ".small-window-control-open-blank" ); let $closeIcon = $drawer.$shadowRoot.querySelector( ".small-window-control-close" ); let $titleText = $drawer.$shadowRoot.querySelector( ".small-window-title-text" ); this.$el.$refreshIcon = $refreshIcon; this.$el.$webSiteIcon = $webSiteIcon; let $iframe = $drawer.$shadowRoot.querySelector("iframe"); let $drag = $drawer.$shadowRoot.querySelector(".small-window-drag"); let AnyTouch = __pops.config.Utils.AnyTouch(); let dragNode = new AnyTouch($drag); let smallWidowNode = $drawer.popsElement; let smallWidowNormalHeight = domUtils.height(smallWidowNode); dragNode.on("pan", (event) => { if (event.phase == "move" && event.displacementY > 0) { smallWidowNode.style["transition"] = "none"; smallWidowNode.style["height"] = Math.abs(smallWidowNormalHeight - event.distanceY) + "px"; } if (event.isEnd) { smallWidowNode.style["transition"] = "0.2s ease-in"; if (parseInt(smallWidowNode.style["height"]) > window.innerHeight / 2) { smallWidowNode.style["height"] = smallWidowNormalHeight + "px"; } else { $drawer.close(); } } }); let getureBack = new GestureBack({ hash: this.$key.smallWindow, useUrl: true, win: _unsafeWindow, beforeHistoryBackCallBack: (isUrlChange) => { $drawer.close(); } }); getureBack.enterGestureBackMode(); domUtils.on($titleText, "click", (event) => { utils.preventEvent(event); utils.setClip(`『${title}』 - ${url}`); Qmsg.success("已复制链接"); }); domUtils.on($imageIcon, "click", (event) => { utils.preventEvent(event); log.info(`查看图片`, imagesList); var viewerULNodeHTML = ""; imagesList.forEach((item) => { viewerULNodeHTML += `<li><img data-src="${item}"></li>`; }); var viewerULNode = domUtils.parseHTML( `<ul>${viewerULNodeHTML}</ul>`, false, false ); let viewer = new Viewer(viewerULNode, { inline: false, url: "data-src", zIndex: (() => { let maxZIndex = utils.getMaxZIndex(); let popsMaxZIndex = __pops.config.InstanceUtils.getPopsMaxZIndex().zIndex; return utils.getMaxValue(maxZIndex, popsMaxZIndex) + 100; })(), hidden: () => { viewer.destroy(); } }); viewer.zoomTo(1); viewer.show(); }); domUtils.on($closeIcon, "click", (event) => { utils.preventEvent(event); getureBack.quitGestureBackMode(); }); domUtils.on($openBlankIcon, "click", (event) => { utils.preventEvent(event); window.open(url, "_blank"); }); domUtils.on($webSiteIcon, "click", (event) => { utils.preventEvent(event); $iframe.contentWindow.location.reload(); this.checkIframeReadyState($iframe); }); this.checkIframeReadyState($iframe); }, /** * 对帖子进行处理,实现点击某个区域打开小窗 * @param forumlist */ async handleForumPost(forumlist) { forumlist.forEach(($forum) => { if ($forum.getAttribute("data-injection-small-window")) { return; } let title = domUtils.text( $forum.querySelector(".mmlist_li_box h2 a") ); if (title == "" || title == null) { title = domUtils.text( $forum.querySelector(".mmlist_li_box a") ); } title = title.trim(); let url = $forum.querySelector(".mmlist_li_box a").href; var imagesList = []; $forum.setAttribute("data-injection-small-window", "true"); $forum.setAttribute("data-injection-small-window-url", url); $forum.setAttribute("data-injection-small-window-title", title); $forum.querySelectorAll(".comiis_pyqlist_img img").forEach(($img) => { imagesList.push($img.getAttribute("src")); }); $forum.querySelectorAll(".comiis_pyqlist_imgs img").forEach(($img) => { imagesList.push($img.getAttribute("src")); }); $forum.querySelectorAll(".mmlist_li_box a").forEach(($anchor) => { $anchor.removeAttribute("href"); $anchor.setAttribute("data-href", url); }); let $mmlist_li_box = $forum.querySelector(".mmlist_li_box"); domUtils.on($mmlist_li_box, "click", function(event) { var mouseClickPosX = Number(event.clientX); if (document.body.offsetWidth / 2 > mouseClickPosX) { window.location.href = url; } else { MTSmallWindow.showSmallWindow(title, url, imagesList); } }); }); }, /** * 检测 iframe是否加载完毕 * @param iframe */ checkIframeReadyState(iframe) { this.showRefreshIcon(); let intervalId = setInterval(() => { if (iframe.contentWindow) { clearInterval(intervalId); let iframeDOMUtils = domUtils.createDOMUtils({ document: iframe.contentWindow.document, // @ts-ignore window: iframe.contentWindow, globalThis: iframe.contentWindow, // @ts-ignore self: iframe.contentWindow, top }); iframeDOMUtils.ready(() => { log.success("小窗内容已加载完毕"); this.hideRefreshIcon(); }); } }, 400); }, hideRefreshIcon() { this.$el.$refreshIcon.style.display = "none"; this.$el.$webSiteIcon.style.display = ""; }, showRefreshIcon() { this.$el.$refreshIcon.style.display = ""; this.$el.$webSiteIcon.style.display = "none"; } }; const MTGuide = { init() { DOMUtils.ready(() => { PopsPanel.execMenuOnce("mt-guide-showLatestPost", () => { this.showLatestPost(); }); }); }, /** * 显示最新帖子 */ showLatestPost() { log.info(`显示最新帖子`); async function getLatestPostForum() { let response = await httpx.get("/forum.php?mod=guide&view=hot", { fetch: true, allowInterceptConfig: false }); if (!response.status) { Qmsg.error("获取轮播失败"); return; } if (response.data.responseText.indexOf( '<script src="/_guard/auto.js"><\/script>' ) !== -1) { Qmsg.error("获取轮播失败 未知的/_guard/auto.js文件"); return; } var doc = DOMUtils.parseHTML(response.data.responseText, true, true); var postForumList = doc.querySelectorAll( 'div.comiis_mh_kxtxt div[id*="comiis_mh_kxtxt"] ul' ); if (postForumList.length === 0) { Qmsg.error("获取轮播失败"); return; } else { var r###lt = []; postForumList[postForumList.length - 1].querySelectorAll("a").forEach((item) => { r###lt.push({ href: item.getAttribute("href"), title: item.getAttribute("title") }); }); } return r###lt; } getLatestPostForum().then((postInfoList) => { if (!postInfoList) { return; } addStyle( /*css*/ ` div.comiis_mh_kxtxt_owm{ margin-top: 10px; } div.comiis_mh_kxtxt_owm li{ height: 30px; width: 100%; display: flex; align-items: center; } div.comiis_mh_kxtxt_owm span{ background: #FF705E; color: #fff; float: left; height: 18px; line-height: 18px; padding: 0 3px; margin-top: 2px; margin-right: 10px; overflow: hidden; border-radius: 2px; margin-left: 10px; } div.comiis_mh_kxtxt_owm a{ display: block; font-size: 14px; font-weight: 400; height: 22px; line-height: 22px; overflow: hidden; min-width: 100px; max-width: 80%; text-overflow: ellipsis; white-space: nowrap; margin-right: 10px; } ` ); var latestPostForumHTML = ""; utils.sortListByProperty( postInfoList, (item) => { var forumPostNumMatch = item["href"].match(/thread-(.+?)-/i); let forumPostNum = parseInt( forumPostNumMatch[forumPostNumMatch.length - 1] ); return forumPostNum; }, true ); log.info("导读内容", postInfoList); postInfoList.forEach((item) => { latestPostForumHTML += /*html*/ ` <li> <span>新帖</span> <a href="${item.href}" title="${item.title}" target="_blank">${item.title}</a> </li>`; }); let $comiis_xznlist = document.querySelector( ".comiis_forumlist.comiis_xznlist" ); DOMUtils.before( $comiis_xznlist, `<div class="comiis_mh_kxtxt bg_f comiis_mh_kxtxt_owm"><ul>${latestPostForumHTML}</ul></div>` ); }); } }; class RuleEditView { constructor(option) { __publicField(this, "option"); this.option = option; } /** * 显示视图 */ async showView() { var _a2; let $dialog = __pops.confirm({ title: { text: this.option.title, position: "center" }, content: { text: ( /*html*/ ` <form class="rule-form-container" onsubmit="return false"> <ul class="rule-form-ulist"> </ul> <input type="submit" style="display: none;" /> </form> ` ), html: true }, btn: utils.assign( { ok: { callback: async () => { await submitSaveOption(); } } }, this.option.btn || {}, true ), mask: { enable: true }, style: ( /*css*/ ` ${__pops.config.cssText.panelCSS} .rule-form-container { } .rule-form-container li{ display: flex; align-items: center; justify-content: space-between; padding: 5px 20px; gap: 10px; } .pops-panel-item-left-main-text{ max-width: 150px; } .pops-panel-item-right-text{ padding-left: 30px; } .pops-panel-item-right-text, .pops-panel-item-right-main-text{ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } ${((_a2 = this.option) == null ? void 0 : _a2.style) ?? ""} ` ), width: typeof this.option.width === "function" ? this.option.width() : window.innerWidth > 500 ? "500px" : "88vw", height: typeof this.option.height === "function" ? this.option.height() : window.innerHeight > 500 ? "500px" : "80vh" }); let $form = $dialog.$shadowRoot.querySelector( ".rule-form-container" ); $dialog.$shadowRoot.querySelector( "input[type=submit]" ); let $ulist = $dialog.$shadowRoot.querySelector(".rule-form-ulist"); let view = await this.option.getView(await this.option.data()); $ulist.appendChild(view); const submitSaveOption = async () => { let r###lt = await this.option.onsubmit($form, await this.option.data()); if (!r###lt.success) { return; } $dialog.close(); await this.option.dialogCloseCallBack(true); }; } } class RuleFilterView { constructor(option) { __publicField(this, "option"); this.option = option; } showView() { let $alert = __pops.alert({ title: { text: this.option.title, position: "center" }, content: { text: ( /*html*/ ` <div class="filter-container"></div> ` ) }, btn: { ok: { text: "关闭", type: "default" } }, mask: { enable: true }, width: window.innerWidth > 500 ? "350px" : "80vw", height: window.innerHeight > 500 ? "300px" : "70vh", style: ( /*css*/ ` .filter-container{ height: 100%; display: flex; flex-direction: column; gap: 20px; } .filter-container button{ text-wrap: wrap; padding: 8px; height: auto; text-align: left; } ` ) }); let $filterContainer = $alert.$shadowRoot.querySelector(".filter-container"); let $fragment = document.createDocumentFragment(); this.option.filterOption.forEach((filterOption) => { let $button = document.createElement("button"); $button.innerText = filterOption.name; let execFilterAndCloseDialog = async () => { let allRuleInfo = await this.option.getAllRuleInfo(); allRuleInfo.forEach(async (ruleInfo) => { let filterR###lt = await filterOption.filterCallBack(ruleInfo.data); if (!filterR###lt) { domUtils.hide(ruleInfo.$el, false); } else { domUtils.show(ruleInfo.$el, false); } }); if (typeof this.option.execFilterCallBack === "function") { await this.option.execFilterCallBack(); } $alert.close(); }; domUtils.on($button, "click", async (event) => { utils.preventEvent(event); if (typeof filterOption.callback === "function") { let r###lt = await filterOption.callback( event, execFilterAndCloseDialog ); if (!r###lt) { return; } } await execFilterAndCloseDialog(); }); $fragment.appendChild($button); }); $filterContainer.appendChild($fragment); } } class RuleView { constructor(option) { __publicField(this, "option"); this.option = option; } /** * 显示视图 * @param filterCallBack 返回值为false隐藏,true则不隐藏(不处理) */ async showView(filterCallBack) { var _a2, _b, _c, _d, _e, _f, _g, _h, _i; let $popsConfirm = __pops.confirm({ title: { text: this.option.title, position: "center" }, content: { text: ( /*html*/ ` <div class="rule-view-container"> </div> ` ), html: true }, btn: { merge: true, reverse: false, position: "space-between", ok: { enable: ((_c = (_b = (_a2 = this.option) == null ? void 0 : _a2.bottomControls) == null ? void 0 : _b.add) == null ? void 0 : _c.enable) || true, type: "primary", text: "添加", callback: async (event) => { this.showEditView( false, await this.option.getAddData(), $popsConfirm.$shadowRoot ); } }, close: { enable: true, callback(event) { $popsConfirm.close(); } }, cancel: { enable: ((_f = (_e = (_d = this.option) == null ? void 0 : _d.bottomControls) == null ? void 0 : _e.filter) == null ? void 0 : _f.enable) || false, type: "default", text: "过滤", callback: (details, event) => { var _a3, _b2, _c2, _d2, _e2, _f2, _g2; if (typeof ((_c2 = (_b2 = (_a3 = this.option) == null ? void 0 : _a3.bottomControls) == null ? void 0 : _b2.filter) == null ? void 0 : _c2.callback) === "function") { this.option.bottomControls.filter.callback(); } let getAllRuleElement = () => { return Array.from( $popsConfirm.$shadowRoot.querySelectorAll( ".rule-view-container .rule-item" ) ); }; let $button = event.target.closest(".pops-confirm-btn").querySelector(".pops-confirm-btn-cancel span"); if (domUtils.text($button).includes("取消")) { getAllRuleElement().forEach(($el) => { domUtils.show($el, false); }); domUtils.text($button, "过滤"); } else { let ruleFilterView = new RuleFilterView({ title: ((_e2 = (_d2 = this.option.bottomControls) == null ? void 0 : _d2.filter) == null ? void 0 : _e2.title) ?? "过滤规则", filterOption: ((_g2 = (_f2 = this.option.bottomControls) == null ? void 0 : _f2.filter) == null ? void 0 : _g2.option) || [], execFilterCallBack() { domUtils.text($button, "取消过滤"); }, getAllRuleInfo: () => { return getAllRuleElement().map(($el) => { return { data: this.parseRuleItemElement($el).data, $el }; }); } }); ruleFilterView.showView(); } } }, other: { enable: ((_i = (_h = (_g = this.option) == null ? void 0 : _g.bottomControls) == null ? void 0 : _h.clear) == null ? void 0 : _i.enable) || true, type: "xiaomi-primary", text: `清空所有(${(await this.option.data()).length})`, callback: (event) => { let $askDialog = __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "确定清空所有的数据?", html: false }, btn: { ok: { enable: true, callback: async (popsEvent) => { var _a3, _b2, _c2; log.success("清空所有"); if (typeof ((_c2 = (_b2 = (_a3 = this.option) == null ? void 0 : _a3.bottomControls) == null ? void 0 : _b2.clear) == null ? void 0 : _c2.callback) === "function") { this.option.bottomControls.clear.callback(); } let data = await this.option.data(); if (data.length) { Qmsg.error("清理失败"); return; } else { Qmsg.success("清理成功"); } await this.updateDeleteAllBtnText($popsConfirm.$shadowRoot); this.clearContent($popsConfirm.$shadowRoot); $askDialog.close(); } }, cancel: { text: "取消", enable: true } }, mask: { enable: true }, width: "300px", height: "200px" }); } } }, mask: { enable: true }, width: window.innerWidth > 500 ? "500px" : "88vw", height: window.innerHeight > 500 ? "500px" : "80vh", style: ( /*css*/ ` ${__pops.config.cssText.panelCSS} .rule-item{ display: flex; align-items: center; line-height: normal; font-size: 16px; padding: 4px 8px; gap: 8px; } .rule-name{ flex: 1; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .rule-controls{ display: flex; align-items: center; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; gap: 8px; padding: 0px; } .rule-controls-enable{ } .rule-controls-edit{ } .rule-controls-delete{ } .rule-controls-edit, .rule-controls-delete{ width: 16px; height: 16px; cursor: pointer; } ` ) }); let allData = await this.option.data(); let changeButtonText = false; for (let index = 0; index < allData.length; index++) { let item = allData[index]; let $ruleItemList = await this.appendRuleItemElement( $popsConfirm.$shadowRoot, item ); let flag = typeof filterCallBack === "function" ? filterCallBack(item) : true; if (!flag) { changeButtonText = true; $ruleItemList.forEach(($el) => { domUtils.hide($el, false); }); } } if (changeButtonText) { let $button = $popsConfirm.$shadowRoot.querySelector( ".pops-confirm-btn-cancel span" ); domUtils.text($button, "取消过滤"); } } /** * 解析弹窗内的各个元素 */ parseViewElement($shadowRoot) { let $container = $shadowRoot.querySelector( ".rule-view-container" ); let $deleteBtn = $shadowRoot.querySelector( ".pops-confirm-btn button.pops-confirm-btn-other" ); return { /** 容器 */ $container, /** 左下角的清空按钮 */ $deleteBtn }; } /** * 解析每一项的元素 */ parseRuleItemElement($ruleElement) { let $enable = $ruleElement.querySelector( ".rule-controls-enable" ); let $enableSwitch = $enable.querySelector(".pops-panel-switch"); let $enableSwitchInput = $enable.querySelector( ".pops-panel-switch__input" ); let $enableSwitchCore = $enable.querySelector( ".pops-panel-switch__core" ); let $edit = $ruleElement.querySelector(".rule-controls-edit"); let $delete = $ruleElement.querySelector( ".rule-controls-delete" ); return { /** 启用开关 */ $enable, /** 启用开关的container */ $enableSwitch, /** 启用开关的input */ $enableSwitchInput, /** 启用开关的core */ $enableSwitchCore, /** 编辑按钮 */ $edit, /** 删除按钮 */ $delete, /** 存储在元素上的数据 */ data: Reflect.get($ruleElement, "data-rule") }; } /** * 创建一条规则元素 */ async createRuleItemElement(data, $shadowRoot) { let name = await this.option.getDataItemName(data); let $ruleItem = domUtils.createElement("div", { className: "rule-item", innerHTML: ( /*html*/ ` <div class="rule-name">${name}</div> <div class="rule-controls"> <div class="rule-controls-enable"> <div class="pops-panel-switch"> <input class="pops-panel-switch__input" type="checkbox"> <span class="pops-panel-switch__core"> <div class="pops-panel-switch__action"> </div> </span> </div> </div> <div class="rule-controls-edit"> ${__pops.config.iconSVG.edit} </div> <div class="rule-controls-delete"> ${__pops.config.iconSVG.delete} </div> </div> ` ) }); Reflect.set($ruleItem, "data-rule", data); let switchCheckedClassName = "pops-panel-switch-is-checked"; const { $enable, $enableSwitch, $enableSwitchCore, $enableSwitchInput, $delete, $edit } = this.parseRuleItemElement($ruleItem); if (this.option.itemControls.enable.enable) { domUtils.on($enableSwitchCore, "click", async (event) => { let isChecked = false; if ($enableSwitch.classList.contains(switchCheckedClassName)) { $enableSwitch.classList.remove(switchCheckedClassName); isChecked = false; } else { $enableSwitch.classList.add(switchCheckedClassName); isChecked = true; } $enableSwitchInput.checked = isChecked; await this.option.itemControls.enable.callback(data, isChecked); }); if (await this.option.itemControls.enable.getEnable(data)) { $enableSwitch.classList.add(switchCheckedClassName); } } else { $enable.remove(); } if (this.option.itemControls.edit.enable) { domUtils.on($edit, "click", (event) => { utils.preventEvent(event); this.showEditView(true, data, $shadowRoot, $ruleItem, (newData) => { data = null; data = newData; }); }); } else { $edit.remove(); } if (this.option.itemControls.delete.enable) { domUtils.on($delete, "click", (event) => { utils.preventEvent(event); let $askDialog = __pops.confirm({ title: { text: "提示", position: "center" }, content: { text: "确定删除该条数据?", html: false }, btn: { ok: { enable: true, callback: async (popsEvent) => { log.success("删除数据"); let flag = await this.option.itemControls.delete.deleteCallBack( data ); if (flag) { Qmsg.success("成功删除该数据"); $ruleItem.remove(); await this.updateDeleteAllBtnText($shadowRoot); $askDialog.close(); } else { Qmsg.error("删除该数据失败"); } } }, cancel: { text: "取消", enable: true } }, mask: { enable: true }, width: "300px", height: "200px" }); }); } else { $delete.remove(); } return $ruleItem; } /** * 添加一个规则元素 */ async appendRuleItemElement($shadowRoot, data) { let { $container } = this.parseViewElement($shadowRoot); let $ruleItem = []; let iteratorData = Array.isArray(data) ? data : [data]; for (let index = 0; index < iteratorData.length; index++) { let item = iteratorData[index]; let $item = await this.createRuleItemElement(item, $shadowRoot); $container.appendChild($item); $ruleItem.push($item); } await this.updateDeleteAllBtnText($shadowRoot); return $ruleItem; } /** * 更新弹窗内容的元素 */ async updateRuleContaienrElement($shadowRoot) { this.clearContent($shadowRoot); const { $container } = this.parseViewElement($shadowRoot); let data = await this.option.data(); await this.appendRuleItemElement($shadowRoot, data); await this.updateDeleteAllBtnText($shadowRoot); } /** * 更新规则元素 */ async updateRuleItemElement(data, $oldRuleItem, $shadowRoot) { let $newRuleItem = await this.createRuleItemElement(data, $shadowRoot); $oldRuleItem.after($newRuleItem); $oldRuleItem.remove(); } /** * 清空内容 */ clearContent($shadowRoot) { const { $container } = this.parseViewElement($shadowRoot); domUtils.html($container, ""); } /** * 设置删除按钮的文字 */ setDeleteBtnText($shadowRoot, text, isHTML = false) { const { $deleteBtn } = this.parseViewElement($shadowRoot); if (isHTML) { domUtils.html($deleteBtn, text); } else { domUtils.text($deleteBtn, text); } } /** * 更新【清空所有】的按钮的文字 * @param $shadowRoot */ async updateDeleteAllBtnText($shadowRoot) { let data = await this.option.data(); this.setDeleteBtnText($shadowRoot, `清空所有(${data.length})`); } /** * 显示编辑视图 * @param isEdit 是否是编辑状态 * @param editData 编辑的数据 */ showEditView(isEdit, editData, $parentShadowRoot, $editRuleItemElement, updateDataCallBack) { let dialogCloseCallBack = async (isSubmit) => { if (isSubmit) ; else { if (!isEdit) { await this.option.deleteData(editData); } if (typeof updateDataCallBack === "function") { let newData = await this.option.getData(editData); updateDataCallBack(newData); } } }; let editView = new RuleEditView({ title: isEdit ? "编辑" : "添加", data: () => { return editData; }, dialogCloseCallBack, getView: async (data) => { return await this.option.itemControls.edit.getView(data, isEdit); }, btn: { ok: { enable: true, text: isEdit ? "修改" : "添加" }, cancel: { callback: async (detail, event) => { detail.close(); await dialogCloseCallBack(false); } }, close: { callback: async (detail, event) => { detail.close(); await dialogCloseCallBack(false); } } }, onsubmit: async ($form, data) => { let r###lt = await this.option.itemControls.edit.onsubmit( $form, isEdit, data ); if (r###lt.success) { if (isEdit) { Qmsg.success("修改成功"); $parentShadowRoot && await this.updateRuleItemElement( r###lt.data, $editRuleItemElement, $parentShadowRoot ); } else { $parentShadowRoot && await this.appendRuleItemElement( $parentShadowRoot, r###lt.data ); } } else { if (isEdit) { Qmsg.error("修改失败"); } } return r###lt; }, style: this.option.itemControls.edit.style, width: this.option.itemControls.edit.width, height: this.option.itemControls.edit.height }); editView.showView(); } } const MTOwnBlock = { $key: { STORAGE_KEY: "mt-own-block-rule" }, $data: { isRegister: false }, init() { this.registerMenu(); let lockFn = new utils.LockFunction(() => { this.runRule(); }); utils.mutationObserver(document, { config: { subtree: true, childList: true }, callback: () => { lockFn.run(); } }); }, /** * 注册菜单 */ registerMenu() { if (this.$data.isRegister) { return; } this.$data.isRegister = true; ElementUtils.registerLeftMenu({ name: "我的屏蔽", icon: "", iconColor: "#000", callback: () => { this.showView(); } }); }, /** * 获取模板数据 */ getTemplateData() { return { uuid: utils.generateUUID(), enable: true, name: "", data: { userName: "", userUID: "", userLevel: "", postUrl: "", postTitle: "", postContent: "", postPlateName: "" } }; }, /** * 显示视图 */ showView() { let popsPanelContentUtils = __pops.config.panelHandleContentUtils(); function generateStorageApi(data) { return { get(key, defaultValue) { return data[key] ?? defaultValue; }, set(key, value) { data[key] = value; } }; } let ruleView = new RuleView({ title: "我的屏蔽", data: () => { return this.getData(); }, getAddData: () => { return this.getTemplateData(); }, getDataItemName: (data) => { return data["name"]; }, updateData: (data) => { return this.updateData(data); }, deleteData: (data) => { return this.deleteData(data); }, getData: (data) => { let allData = this.getData(); let findValue = allData.find((item) => item.uuid === data.uuid); return findValue ?? data; }, itemControls: { enable: { enable: true, getEnable(data) { return data.enable; }, callback: (data, enable) => { data.enable = enable; this.updateData(data); } }, edit: { enable: true, getView: (data, isEdit) => { let $fragment = document.createDocumentFragment(); if (!isEdit) { data = this.getTemplateData(); } let enable_template = UISwitch("启用", "enable", true); Reflect.set( enable_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $enable = popsPanelContentUtils.createSectionContainerItem_switch( enable_template ); let name_template = UIInput( "规则名称", "name", "", "", void 0, "必填" ); Reflect.set( name_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $name = popsPanelContentUtils.createSectionContainerItem_input( name_template ); let data_userName_template = UIInput( "用户名", "userName", "", "", void 0, "可正则" ); Reflect.set( data_userName_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_userName = popsPanelContentUtils.createSectionContainerItem_input( data_userName_template ); let data_userUID_template = UIInput( "用户UID", "userUID", "", "", void 0, "可正则" ); Reflect.set( data_userUID_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_userUID = popsPanelContentUtils.createSectionContainerItem_input( data_userUID_template ); let data_userLevel_template = UIInput( "用户等级", "userLevel", "", "", void 0, "可正则" ); Reflect.set( data_userLevel_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_userLevel = popsPanelContentUtils.createSectionContainerItem_input( data_userLevel_template ); let data_postUrl_template = UIInput( "帖子url", "postUrl", "", "", void 0, "可正则" ); Reflect.set( data_postUrl_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_postUrl = popsPanelContentUtils.createSectionContainerItem_input( data_postUrl_template ); let data_postTitle_template = UIInput( "帖子标题", "postTitle", "", "", void 0, "可正则" ); Reflect.set( data_postTitle_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_postTitle = popsPanelContentUtils.createSectionContainerItem_input( data_postTitle_template ); let data_postContent_template = UIInput( "帖子内容", "postContent", "", "", void 0, "可正则" ); Reflect.set( data_postContent_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_postContent = popsPanelContentUtils.createSectionContainerItem_input( data_postContent_template ); let data_postPlateName_template = UIInput( "帖子所在的板块名", "postPlateName", "", "", void 0, "可正则" ); Reflect.set( data_postPlateName_template.props, PROPS_STORAGE_API, generateStorageApi(data.data) ); let $data_postPlateName = popsPanelContentUtils.createSectionContainerItem_input( data_postPlateName_template ); $fragment.appendChild($enable); $fragment.appendChild($name); $fragment.appendChild($data_userName); $fragment.appendChild($data_userUID); $fragment.appendChild($data_userLevel); $fragment.appendChild($data_postUrl); $fragment.appendChild($data_postTitle); $fragment.appendChild($data_postContent); $fragment.appendChild($data_postPlateName); return $fragment; }, onsubmit: ($form, isEdit, editData) => { let $ulist_li = $form.querySelectorAll( ".rule-form-ulist > li" ); let data = this.getTemplateData(); if (isEdit) { data.uuid = editData.uuid; } $ulist_li.forEach(($li) => { let formConfig = Reflect.get($li, "__formConfig__"); let attrs = Reflect.get(formConfig, "attributes"); let storageApi = Reflect.get($li, PROPS_STORAGE_API); let key = Reflect.get(attrs, ATTRIBUTE_KEY); let defaultValue = Reflect.get(attrs, ATTRIBUTE_DEFAULT_VALUE); let value = storageApi.get(key, defaultValue); if (Reflect.has(data, key)) { Reflect.set(data, key, value); } else if (Reflect.has(data.data, key)) { Reflect.set(data.data, key, value); } else { log.error(`${key}不在数据中`); } }); if (data.name.trim() === "") { Qmsg.error("规则名称不能为空"); return { success: false, data }; } if (isEdit) { return { success: this.updateData(data), data }; } else { return { success: this.addData(data), data }; } } }, delete: { enable: true, deleteCallBack: (data) => { return this.deleteData(data); } } } }); ruleView.showView(); }, /** * 执行规则 */ runRule() { let shieldUserList = this.getData(); function checkIsFilter(postForumInfo) { for (const shieldItem of shieldUserList) { let shieldOption = shieldItem["data"]; let findValue = Object.keys(shieldOption).find((keyName) => { let value = shieldOption[keyName]; if (utils.isNotNull(value)) { let regExpValue = new RegExp(value, "i"); let postForumValue = Reflect.get(postForumInfo, keyName); if (typeof postForumValue === "string" && utils.isNotNull(postForumValue) && postForumValue.match(regExpValue)) { log.info(`屏蔽`, [shieldOption, postForumValue]); return true; } } return false; }); if (findValue) { return true; } } return false; } if (Router.isGuide() || Router.isPlate() || Router.isPost()) { this.getData(); document.querySelectorAll(".comiis_forumlist .forumlist_li").forEach((item) => { var _a2; let $topUser = item.querySelector("a.top_user"); let uidMatch = $topUser.href.match(MTRegExp.uid); let postForumInfo = { /* 用户名 */ userName: $topUser.innerText, /* 用户UID */ userUID: uidMatch[uidMatch.length - 1].trim(), /* 用户等级 */ userLevel: item.querySelector("span.top_lev").innerText.replace("Lv.", ""), /* 帖子Url */ postUrl: item.querySelector(".mmlist_li_box a").getAttribute("href") || item.querySelector(".mmlist_li_box a").getAttribute("data-href"), /* 帖子标题 */ postTitle: ((_a2 = item.querySelector(".mmlist_li_box h2 a")) == null ? void 0 : _a2.innerText) || "", /* 帖子内容(缩略) */ postContent: item.querySelector( ".mmlist_li_box .list_body" ).innerText, /* 帖子板块 */ postPlateName: (item.querySelector( ".forumlist_li_time a.f_d" ) || item.querySelector( ".comiis_xznalist_bk.cl" )).innerText.replace(//g, "").replace(/\s*/g, "").replace(/来自/g, "") }; if (utils.isNull(postForumInfo.postPlateName)) { postForumInfo.postPlateName = document.querySelector( "#comiis_wx_title_box" ).innerText; } if (checkIsFilter(postForumInfo)) { item.remove(); } }); document.querySelectorAll(".comiis_postlist .comiis_postli").forEach((item) => { let $topUser = item.querySelector("a.top_user"); let uidMatch = $topUser.href.match(MTRegExp.uid); let postForumInfo = { /* 用户名 */ userName: $topUser.innerText, /* 用户UID */ userUID: uidMatch[uidMatch.length - 1].trim(), /* 用户等级 */ userLevel: item.querySelector("a.top_lev").innerText.replace("Lv.", ""), /* 帖子Url */ postUrl: void 0, /* 帖子标题 */ postTitle: void 0, /* 帖子内容(缩略) */ postContent: item.querySelector( ".comiis_message_table" ).innerText, /* 帖子板块 */ postPlateName: void 0 }; if (checkIsFilter(postForumInfo)) { item.remove(); } }); } if (Router.isMessageList()) { this.getData(); $$(".comiis_pms_box .comiis_pmlist ul li").forEach( (item) => { let uidMatch = item.querySelector("a.b_b").href.match(MTRegExp.uid); let postForumInfo = { /* 用户名 */ userName: item.querySelector("h2").innerText.replace( item.querySelector("h2 span").innerText, "" ).replace(/\s*/, ""), /* 用户UID */ userUID: uidMatch[uidMatch.length - 1].trim(), /* 用户等级 */ userLevel: void 0, /* 帖子Url */ postUrl: item.querySelector("a.b_b").href, /* 帖子标题 */ postTitle: void 0, /* 帖子内容(缩略) */ postContent: item.querySelector("p.f_c").innerText.trim(), /* 帖子板块 */ postPlateName: void 0 }; if (checkIsFilter(postForumInfo)) { item.remove(); } } ); } }, /** * 获取数据 */ getData() { return _GM_getValue(this.$key.STORAGE_KEY, []); }, /** * 设置数据 * @param data */ setData(data) { _GM_setValue(this.$key.STORAGE_KEY, data); }, /** * 添加数据 * @param data */ addData(data) { let localData = this.getData(); let findIndex = localData.findIndex((item) => item.uuid == data.uuid); if (findIndex === -1) { localData.push(data); _GM_setValue(this.$key.STORAGE_KEY, localData); return true; } else { return false; } }, /** * 更新数据 * @param data */ updateData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let updateFlag = false; if (index !== -1) { updateFlag = true; localData[index] = data; } this.setData(localData); return updateFlag; }, /** * 删除数据 * @param data */ deleteData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let deleteFlag = false; if (index !== -1) { deleteFlag = true; localData.splice(index, 1); } this.setData(localData); return deleteFlag; }, /** * 清空数据 */ clearData() { _GM_deleteValue(this.$key.STORAGE_KEY); } }; const MTCommentFilter = { $el: { isFilterElementHTML: [] }, $key: { STORAGE_KEY: "mt-post-comment-filter-rule" }, init() { this.registerMenu(); if (Router.isPost()) { let allData = this.getData(); if (!allData.enable) { return; } let lockFn = new utils.LockFunction(() => { this.runFilter(allData); }); utils.mutationObserver(document, { config: { subtree: true, childList: true }, callback: () => { lockFn.run(); } }); } }, /** * 注册菜单 */ registerMenu() { ElementUtils.registerLeftMenu({ name: "评论过滤器", icon: "", iconColor: "#ff0019", callback: () => { this.showView(); } }); }, /** * 执行过滤 */ runFilter(filterData) { let isBlackListUser = function(postForumInfo) { for (const userName of filterData["userBlackList"]) { if (userName == postForumInfo.userName || userName == postForumInfo.userUID) { log.success("评论过滤器:黑名单用户", postForumInfo); return true; } } return false; }; let isWhiteListUser = function(postForumInfo) { for (const userName of filterData["userWhiteList"]) { if (userName === postForumInfo.userName || userName === postForumInfo.userUID) { log.success("评论过滤器:白名单用户", postForumInfo); return true; } } return false; }; $$(".comiis_postlist .comiis_postli").forEach((item) => { var _a2, _b, _c; if (item.querySelector("#comiis_allreplies")) { return; } let $topUser = item.querySelector("a.top_user"); let uidMatch = $topUser.href.match(MTRegExp.uid); let postForumInfo = { userName: ($topUser == null ? void 0 : $topUser.innerText) || "", userUID: uidMatch ? ((_a2 = uidMatch[(uidMatch == null ? void 0 : uidMatch.length) - 1]) == null ? void 0 : _a2.trim()) || "" : "", content: ((_c = (_b = item.querySelector(".comiis_message_table")) == null ? void 0 : _b.innerText) == null ? void 0 : _c.trim()) || "", isAuthor: Boolean(item.querySelector("span.top_lev")) }; if (isWhiteListUser(postForumInfo)) { return; } if (filterData["replyFlag"] && item.querySelector(".comiis_quote")) { let comiis_quote_Element = item.querySelector(".comiis_quote"); this.$el.isFilterElementHTML.push(comiis_quote_Element.outerHTML); comiis_quote_Element.remove(); } if (postForumInfo.isAuthor && !filterData["avatarFlag"]) { return; } if (isBlackListUser(postForumInfo)) { this.$el.isFilterElementHTML.push(item.outerHTML); item.remove(); return; } if (typeof filterData["minLength"] === "number" && filterData["minLength"] > postForumInfo.content.length) { return; } if (typeof filterData["keywordLength"] === "number" && filterData["keywordLength"] < postForumInfo.content.length) { return; } for (const keywordItem of filterData["keywords"]) { if (typeof keywordItem !== "string") { continue; } let keywordPattern = new RegExp(keywordItem); if (postForumInfo.content.match(keywordPattern)) { console.log("评论过滤器:", postForumInfo); this.$el.isFilterElementHTML.push(item.outerHTML); item.remove(); return; } } }); }, /** * 显示视图 */ showView() { const that = this; function generateStorageApi(data) { return { get(key, defaultValue) { let localData = that.getData(); let value = Reflect.get(localData, key, defaultValue); if (key === "keywords" || key === "userWhiteList" || key === "userBlackList") { value = value.join("\n"); } return value; }, set(key, value) { if (key === "keywords" || key === "userWhiteList" || key === "userBlackList") { value = value.split("\n").filter((item) => item.trim() != ""); } Reflect.set(data, key, value); that.setData(data); } }; } let popsPanelContentUtils = __pops.config.panelHandleContentUtils(); let view = new RuleEditView({ title: "评论过滤器", data: () => { return this.getData(); }, getView: (data) => { let $fragment = document.createDocumentFragment(); let enable_template = UISwitch("启用", "enable", true); Reflect.set( enable_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $enable = popsPanelContentUtils.createSectionContainerItem_switch( enable_template ); let replyFlag_template = UISwitch( "处理回复引用", "replyFlag", false, void 0, "移除引用" ); Reflect.set( replyFlag_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $replyFlag = popsPanelContentUtils.createSectionContainerItem_switch( replyFlag_template ); let avatarFlag_template = UISwitch("处理作者评论", "avatarFlag", false); Reflect.set( avatarFlag_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $avatarFlag = popsPanelContentUtils.createSectionContainerItem_switch( avatarFlag_template ); let viewthreadFlag_template = UISwitch( '处理从"搜索页面"或"我的帖子提醒页面"进入的网站', "viewthreadFlag", false ); Reflect.set( viewthreadFlag_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $viewthreadFlag = popsPanelContentUtils.createSectionContainerItem_switch( viewthreadFlag_template ); let minLength_template = UIInput( "匹配的评论内容长度最小值", "minLength", 5, "小于此长度的评论就算关键字匹配成功了也不会被排除", void 0, "", true ); Reflect.set( minLength_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $minLength = popsPanelContentUtils.createSectionContainerItem_input( minLength_template ); let keywordLength = UIInput( "匹配的评论内容长度最大值", "keywordLength", 8, "大于此长度的评论就算关键字匹配成功了也不会被排除", void 0, "", true ); Reflect.set( keywordLength.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $keywordLength = popsPanelContentUtils.createSectionContainerItem_input(keywordLength); let keywords_template = UITextArea( "评论关键字", "keywords", "", "多个关键字换行分割" ); Reflect.set( keywords_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $keywords = popsPanelContentUtils.createSectionContainerItem_textarea( keywords_template ); let userBlackList_template = UITextArea( "黑名单用户", "userBlackList", "", "多个用户换行分割" ); Reflect.set( userBlackList_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $userBlackList = popsPanelContentUtils.createSectionContainerItem_textarea( userBlackList_template ); let userWhiteList_template = UITextArea( "白名单用户", "userWhiteList", "", "多个用户换行分割" ); Reflect.set( userWhiteList_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $userWhiteList = popsPanelContentUtils.createSectionContainerItem_textarea( userWhiteList_template ); $fragment.append( $enable, $replyFlag, $avatarFlag, $viewthreadFlag, $minLength, $keywordLength, $keywords, $userBlackList, $userWhiteList ); return $fragment; }, btn: { merge: true, position: "space-between", ok: { enable: false }, cancel: { enable: true, text: "关闭" }, other: { enable: true, text: `查看已过滤(${this.$el.isFilterElementHTML.length})`, type: "primary", callback: (details, event) => { console.log(this.$el.isFilterElementHTML); __pops.alert({ title: { text: "评论过滤器-已过滤", position: "center" }, content: { text: ( /*html*/ ` ${Array.from( document.querySelectorAll( 'link[rel="stylesheet"]' ) ).map((item) => item.outerHTML).join("\n")} ${this.$el.isFilterElementHTML.join("\n")} ` ), html: true }, btn: { ok: { type: "default", text: "关闭" } }, mask: { enable: true }, width: window.innerWidth > 500 ? "500px" : "88vw", height: window.innerHeight > 500 ? "500px" : "80vh" }); } } }, dialogCloseCallBack(isSubmit) { }, onsubmit: ($form, data) => { return { success: true, data }; }, style: ( /*css*/ ` .pops-panel-item-left-desc-text{ line-height: normal; margin-top: 6px; font-size: 0.8em; color: rgb(108, 108, 108); } .pops-panel-item-left-main-text{ max-width: unset; } .pops-panel-textarea textarea{ height: 150px; } .comiis_postli_top h2, .comiis_postli_top .top_lev{ height: auto; } ` ) }); view.showView(); }, /** * 获取模板数据 */ getTemplateData() { return { enable: true, avatarFlag: false, replyFlag: false, viewthreadFlag: false, minLength: 5, keywordLength: 8, keywords: [], userBlackList: [], userWhiteList: [] }; }, /** * 获取数据 */ getData() { return _GM_getValue( this.$key.STORAGE_KEY, this.getTemplateData() ); }, /** * 设置数据 */ setData(data) { _GM_setValue(this.$key.STORAGE_KEY, data); } }; const MTProductListingReminder = { $key: { STORAGE_KEY: "mt-productListingReminder-rule" }, init() { this.registerMenu(); this.runRule(); }, /** * 注册菜单 */ registerMenu() { ElementUtils.registerLeftMenu({ name: "商品上架提醒", icon: "", iconColor: "#2376b7", callback: () => { this.showView(); } }); }, /** * 执行规则 */ async runRule() { async function getCurrentProduct() { let response = await httpx.get( "/keke_integralmall-keke_integralmall.html", { fetch: true, allowInterceptConfig: false } ); if (!response.status) { Qmsg.error("【积分商城】获取数据失败"); return; } let productInfoList = []; let doc = domUtils.parseHTML(response.data.responseText, true, true); doc.querySelectorAll(".task-list-wrapper li.col-xs-12").forEach(($taskList) => { var _a2, _b; productInfoList.push({ name: domUtils.text( $taskList.querySelector( ".mall-info a > *:first-child" ) ) || domUtils.text( $taskList.querySelector(".mall-info a") ), price: domUtils.text( $taskList.querySelector( ".mall-info span.discount-price i" ) ), endTime: domUtils.text( $taskList.querySelector( ".mall-info #time_hz span.time" ) ), remainingQuantity: parseInt( ((_b = (_a2 = $taskList.querySelector(".mall-info .mall-count .count-r")) == null ? void 0 : _a2.innerText) == null ? void 0 : _b.replace(/仅剩|件/gi, "")) || "0" ) }); }); return productInfoList; } if (Router.isPointsMall()) { return; } let allData = this.getData(); if (!allData.length) { return; } let productList = await getCurrentProduct(); if (!productList) { return; } for (const productItem of productList) { for (const reminderOption of allData) { if (reminderOption.enable && productItem["name"].match( new RegExp(reminderOption["productName"], "i") ) && !isNaN(productItem["remainingQuantity"]) && productItem["remainingQuantity"] > 0) { log.success(`成功匹配对应商品`, reminderOption, productItem); __pops.confirm({ title: { text: "积分商城提醒", position: "center" }, content: { text: ( /*html*/ `<br /> 您设置的商品已上架在积分商城中,当前售价 ${productItem["price"]}金币,仅剩${productItem["remainingQuantity"]}件,是否前往购买? <a style="color: red !important;">(如需关闭提醒,请删除该关键字)</a> <br />` ), html: true }, btn: { merge: true, position: "space-between", other: { enable: true, type: "danger", text: "删除提醒", callback: () => { let status = this.deleteData(reminderOption); if (status) { Qmsg.success("删除成功"); } else { Qmsg.error("删除失败"); } } }, ok: { text: "前往购买", callback: () => { window.location.href = `${window.location.origin}/keke_integralmall-keke_integralmall.html`; } } }, width: "300px", height: "300px" }); return; } } } }, /** * 获取模板数据 */ getTemplateData() { return { uuid: utils.generateUUID(), enable: true, name: "", productName: "" }; }, /** * 显示视图 */ showView() { let popsPanelContentUtils = __pops.config.panelHandleContentUtils(); function generateStorageApi(data) { return { get(key, defaultValue) { return data[key] ?? defaultValue; }, set(key, value) { data[key] = value; } }; } let ruleView = new RuleView({ title: "商品上架提醒", data: () => { return this.getData(); }, getAddData: () => { return this.getTemplateData(); }, getDataItemName: (data) => { return data["name"]; }, updateData: (data) => { return this.updateData(data); }, deleteData: (data) => { return this.deleteData(data); }, getData: (data) => { let allData = this.getData(); let findValue = allData.find((item) => item.uuid === data.uuid); return findValue ?? data; }, itemControls: { enable: { enable: true, getEnable(data) { return data.enable; }, callback: (data, enable) => { data.enable = enable; this.updateData(data); } }, edit: { enable: true, getView: (data, isEdit) => { let $fragment = document.createDocumentFragment(); if (!isEdit) { data = this.getTemplateData(); } let enable_template = UISwitch("启用", "enable", true); Reflect.set( enable_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $enable = popsPanelContentUtils.createSectionContainerItem_switch( enable_template ); let name_template = UIInput( "规则名称", "name", "", "", void 0, "必填" ); Reflect.set( name_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $name = popsPanelContentUtils.createSectionContainerItem_input( name_template ); let productName_template = UIInput( "商品名", "productName", "", "", void 0, "可正则,需手动转义" ); Reflect.set( productName_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $productName = popsPanelContentUtils.createSectionContainerItem_input( productName_template ); $fragment.append($enable, $name, $productName); return $fragment; }, onsubmit: ($form, isEdit, editData) => { let $ulist_li = $form.querySelectorAll( ".rule-form-ulist > li" ); let data = this.getTemplateData(); if (isEdit) { data.uuid = editData.uuid; } $ulist_li.forEach(($li) => { let formConfig = Reflect.get($li, "__formConfig__"); let attrs = Reflect.get(formConfig, "attributes"); let storageApi = Reflect.get($li, PROPS_STORAGE_API); let key = Reflect.get(attrs, ATTRIBUTE_KEY); let defaultValue = Reflect.get(attrs, ATTRIBUTE_DEFAULT_VALUE); let value = storageApi.get(key, defaultValue); if (Reflect.has(data, key)) { Reflect.set(data, key, value); } else { log.error(`${key}不在数据中`); } }); if (data.name.trim() === "") { Qmsg.error("规则名称不能为空"); return { success: false, data }; } if (isEdit) { return { success: this.updateData(data), data }; } else { return { success: this.addData(data), data }; } } }, delete: { enable: true, deleteCallBack: (data) => { return this.deleteData(data); } } } }); ruleView.showView(); }, /** * 获取数据 */ getData() { return _GM_getValue(this.$key.STORAGE_KEY, []); }, /** * 设置数据 * @param data */ setData(data) { _GM_setValue(this.$key.STORAGE_KEY, data); }, /** * 添加数据 * @param data */ addData(data) { let localData = this.getData(); let findIndex = localData.findIndex((item) => item.uuid == data.uuid); if (findIndex === -1) { localData.push(data); _GM_setValue(this.$key.STORAGE_KEY, localData); return true; } else { return false; } }, /** * 更新数据 * @param data */ updateData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let updateFlag = false; if (index !== -1) { updateFlag = true; localData[index] = data; } this.setData(localData); return updateFlag; }, /** * 删除数据 * @param data */ deleteData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let deleteFlag = false; if (index !== -1) { deleteFlag = true; localData.splice(index, 1); } this.setData(localData); return deleteFlag; }, /** * 清空数据 */ clearData() { _GM_deleteValue(this.$key.STORAGE_KEY); } }; const MTCustomizeUserLabels = { $key: { STORAGE_KEY: "mt-customizeUserLabels-rule" }, init() { this.registerMenu(); if (Router.isPage() || Router.isGuide() || Router.isPlate() || Router.isPost() || Router.isSearch() || Router.isSpace()) { let allData = this.getData(); if (!allData.length) { return; } let lockFn = new utils.LockFunction(() => { this.runRule(allData); }); utils.mutationObserver(document, { config: { subtree: true, childList: true }, callback: () => { lockFn.run(); } }); } }, /** * 注册菜单 */ registerMenu() { ElementUtils.registerLeftMenu({ name: "自定义用户标签", icon: "", iconColor: "#c70ea6", callback: () => { this.showView(); } }); }, /** * 显示视图 */ showView() { let popsPanelContentUtils = __pops.config.panelHandleContentUtils(); function generateStorageApi(data) { return { get(key, defaultValue) { return data[key] ?? defaultValue; }, set(key, value) { data[key] = value; } }; } let ruleView = new RuleView({ title: "自定义用户标签", data: () => { return this.getData(); }, getAddData: () => { return this.getTemplateData(); }, getDataItemName: (data) => { return data["name"]; }, updateData: (data) => { return this.updateData(data); }, deleteData: (data) => { return this.deleteData(data); }, getData: (data) => { let allData = this.getData(); let findValue = allData.find((item) => item.uuid === data.uuid); return findValue ?? data; }, itemControls: { enable: { enable: true, getEnable(data) { return data.enable; }, callback: (data, enable) => { data.enable = enable; this.updateData(data); } }, edit: { enable: true, getView: (data, isEdit) => { var _a2; let $fragment = document.createDocumentFragment(); if (!isEdit) { data = this.getTemplateData(); } let enable_template = UISwitch("启用", "enable", true); Reflect.set( enable_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $enable = popsPanelContentUtils.createSectionContainerItem_switch( enable_template ); let name_template = UIInput( "规则名称", "name", "", "", void 0, "必填" ); Reflect.set( name_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $name = popsPanelContentUtils.createSectionContainerItem_input( name_template ); let userUID_template = UIInput( "用户UID", "userUID", "", "", void 0, "必填,可正则,注意转义" ); Reflect.set( userUID_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $userUID = popsPanelContentUtils.createSectionContainerItem_input( userUID_template ); let labelName_template = UIInput( "标签名", "labelName", "", "", void 0, "必填" ); Reflect.set( labelName_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $labelName = popsPanelContentUtils.createSectionContainerItem_input( labelName_template ); let labelColor_template = UIInput( "标签颜色", "labelColor", "", "" ); Reflect.set( labelColor_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $labelColor = popsPanelContentUtils.createSectionContainerItem_input( labelColor_template ); let $labelColor_input = $labelColor.querySelector("input"); (_a2 = $labelColor.querySelector(".pops-panel-input__suffix")) == null ? void 0 : _a2.remove(); $labelColor_input.setAttribute("type", "color"); domUtils.css($labelColor_input, { margin: "unset", padding: "unset", width: "80px" }); let labelStyle_template = UIInput( "标签CSS", "labelStyle", "", "" ); Reflect.set( labelStyle_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $labelStyle = popsPanelContentUtils.createSectionContainerItem_input( labelStyle_template ); let labelClickEvent_template = UITextArea( "标签点击事件", "labelClickEvent", "", "" ); Reflect.set( labelClickEvent_template.props, PROPS_STORAGE_API, generateStorageApi(data) ); let $labelClickEvent = popsPanelContentUtils.createSectionContainerItem_textarea( labelClickEvent_template ); $fragment.append( $enable, $name, $userUID, $labelName, $labelColor, $labelStyle, $labelClickEvent ); return $fragment; }, onsubmit: ($form, isEdit, editData) => { let $ulist_li = $form.querySelectorAll( ".rule-form-ulist > li" ); let data = this.getTemplateData(); if (isEdit) { data.uuid = editData.uuid; } $ulist_li.forEach(($li) => { let formConfig = Reflect.get($li, "__formConfig__"); let attrs = Reflect.get(formConfig, "attributes"); let storageApi = Reflect.get($li, PROPS_STORAGE_API); let key = Reflect.get(attrs, ATTRIBUTE_KEY); let defaultValue = Reflect.get(attrs, ATTRIBUTE_DEFAULT_VALUE); let value = storageApi.get(key, defaultValue); if (Reflect.has(data, key)) { Reflect.set(data, key, value); } else { log.error(`${key}不在数据中`); } }); if (data.name.trim() === "") { Qmsg.error("规则名称不能为空"); return { success: false, data }; } if (data.userUID.trim() === "") { Qmsg.error("用户UID不能为空"); return { success: false, data }; } if (data.labelName.trim() === "") { Qmsg.error("标签名不能为空"); return { success: false, data }; } if (isEdit) { return { success: this.updateData(data), data }; } else { return { success: this.addData(data), data }; } }, style: ( /*css*/ ` .pops-panel-textarea textarea{ height: 150px; } ` ) }, delete: { enable: true, deleteCallBack: (data) => { return this.deleteData(data); } } } }); ruleView.showView(); }, /** * 执行规则 */ runRule(ruleDataList) { let forumList = utils.getNodeListValue( ElementUtils.comiisForumList(), ElementUtils.comiisPostli(), ElementUtils.comiisMmlist() ); if (!forumList.length) { return; } forumList.forEach(($post) => { if ($post.hasAttribute("data-custom-label")) { return; } $post.setAttribute("data-custom-label", "true"); let mt_uid_array = Array.from($post.querySelectorAll("a")).map((item) => { let url = item.href; let uid = url.match(MTRegExp.uid); if (uid) { return uid[uid.length - 1]; } }).filter((item) => item != null); if (mt_uid_array.length) { let mt_uid = mt_uid_array[0]; let ownLabelList = ruleDataList.filter( (item) => item.enable && mt_uid.match(new RegExp(item.userUID)) ); if (!ownLabelList.length) { return; } let $label = document.createElement("a"); let $topLev = $post.querySelector(".top_lev"); ownLabelList.forEach((labelOption) => { $label.className = $topLev.className; $label.classList.add("gm-custom-label"); $label.style.cssText = ` background: ${labelOption.labelColor} !important;${labelOption.labelStyle || ""}`; $label.innerHTML = labelOption.labelName; domUtils.on($label, "click", async (event) => { utils.preventEvent(event); if (utils.isNotNull(labelOption.labelClickEvent)) { _unsafeWindow.eval(labelOption.labelClickEvent); } }); $topLev.parentElement.append($label); }); } }); }, /** * 获取模板数据 */ getTemplateData() { return { uuid: utils.generateUUID(), enable: true, name: "", userUID: "", labelName: "", labelColor: "", labelStyle: "", labelClickEvent: "" }; }, /** * 获取数据 */ getData() { return _GM_getValue(this.$key.STORAGE_KEY, []); }, /** * 设置数据 * @param data */ setData(data) { _GM_setValue(this.$key.STORAGE_KEY, data); }, /** * 添加数据 * @param data */ addData(data) { let localData = this.getData(); let findIndex = localData.findIndex((item) => item.uuid == data.uuid); if (findIndex === -1) { localData.push(data); _GM_setValue(this.$key.STORAGE_KEY, localData); return true; } else { return false; } }, /** * 更新数据 * @param data */ updateData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let updateFlag = false; if (index !== -1) { updateFlag = true; localData[index] = data; } this.setData(localData); return updateFlag; }, /** * 删除数据 * @param data */ deleteData(data) { let localData = this.getData(); let index = localData.findIndex((item) => item.uuid == data.uuid); let deleteFlag = false; if (index !== -1) { deleteFlag = true; localData.splice(index, 1); } this.setData(localData); return deleteFlag; }, /** * 清空数据 */ clearData() { _GM_deleteValue(this.$key.STORAGE_KEY); } }; const MTForumPostPublish = { init() { domUtils.ready(() => { PopsPanel.execMenuOnce("mt-forum-post-publish-editorOptimization", () => { MTEditorOptimization.init(); }); }); } }; const MT = { $flag: { showUserUID_initCSS: false }, init() { if (Router.isPage() || Router.isGuide() || Router.isPlate() || Router.isPost() || Router.isSearch() || Router.isSpace()) { PopsPanel.execMenuOnce("mt-show-user-uid", () => { this.showUserUID(); }); } if (Router.isSearch() || Router.isGuide() || Router.isSpace() || Router.isPlate()) { PopsPanel.execMenuOnce("mt-small-window", () => { MTSmallWindow.init(); }); } if (Router.isPost()) { log.info(`Router: 帖子`); MTForumPost.init(); } else if (Router.isSearch()) { log.info(`Router: 搜索`); MTSearch.init(); } else if (Router.isKMiSign()) { log.info(`Router: 签到`); MTSign.init(); } else if (Router.isSpace() || Router.isSpaceWithAt()) { log.info(`Router: 空间`); MTSpace.init(); } else if (Router.isGuide()) { log.info(`Router: 导读`); MTGuide.init(); } else if (Router.isPostPublish()) { log.info("Router: 发帖页面"); MTForumPostPublish.init(); } else { log.error(`Router: 未适配的链接 ==> ` + window.location.href); } domUtils.ready(() => { PopsPanel.execMenuOnce("mt-black-home", () => { MTBlackHome.init(); }); PopsPanel.execMenuOnce("mt-online-user", () => { MTOnlineUser.init(); }); PopsPanel.execMenuOnce("mt-post-paidThemePost", () => { MTPaidThemePost.init(); }); PopsPanel.execMenuOnce("mt-ownBlock", () => { MTOwnBlock.init(); }); PopsPanel.execMenuOnce("mt-post-comment-filter", () => { MTCommentFilter.init(); }); PopsPanel.execMenuOnce("mt-productListingReminder", () => { MTProductListingReminder.init(); }); PopsPanel.execMenuOnce("mt-customizeUserLabels", () => { MTCustomizeUserLabels.init(); }); PopsPanel.execMenuOnce("mt-link-text-to-hyperlink", () => { MTIdentifyLinks(); }); PopsPanel.execMenu("mt-auto-sign", () => { MTAutoSignIn.init(); }); PopsPanel.execMenu("mt-extend-cookie-expire", () => { this.extendCookieExpire(); }); }); }, /** * 显示用户UID */ showUserUID() { log.info(`显示用户UID`); if (!this.$flag.showUserUID_initCSS) { this.$flag.showUserUID_initCSS = true; addStyle( /*css*/ ` .postli_top_tximg + h2{ height: auto; } .comiis_postli_top.bg_f.b_t h2{ height: auto; } ` ); } let lockFn = new utils.LockFunction(() => { let forumList = utils.getNodeListValue( ElementUtils.comiisForumList(), ElementUtils.comiisPostli(), ElementUtils.comiisMmlist() ); if (forumList.length) { forumList.forEach(($post) => { let mtUIDOM = $post.querySelector(".gm-custom-label-uid"); if (mtUIDOM) { return; } let mt_uid_array = Array.from($post.querySelectorAll("a")).map((item) => { let url = item.href; let uid = url.match(MTRegExp.uid); if (uid) { return uid[uid.length - 1]; } }).filter((item) => item != null); if (mt_uid_array.length) { let mt_uid = mt_uid_array[0]; let uid_control = document.createElement("a"); let $topLev = $post.querySelector(".top_lev"); uid_control.className = $topLev.className; uid_control.classList.add("gm-custom-label-uid"); uid_control.style.cssText = `background: #FF7600 !important;`; uid_control.innerHTML = "UID:" + mt_uid; domUtils.on(uid_control, "click", async (event) => { utils.preventEvent(event); let status = await utils.setClip(mt_uid); if (status) { Qmsg.success(`${mt_uid}已复制`); } else { Qmsg.error(`${mt_uid}复制失败`); } }); $topLev.parentElement.append(uid_control); } }); } }); utils.mutationObserver(document, { config: { subtree: true, childList: true }, callback() { lockFn.run(); } }); }, /** * 延长cookie有效期 */ async extendCookieExpire() { log.info(`延长cookie有效期`); let cookieList = await _GM.cookie.list({}); let needExtendCookieNameList = [ "_auth", "_saltkey", "_client_created", "_client_token" ]; cookieList.forEach(async (cookieItem) => { if (cookieItem.session) { return; } let expireTime = cookieItem.expirationDate; let nowTime = Date.now() / 1e3; if (expireTime < nowTime) { return; } let _30days = 60 * 60 * 24 * 30; if (expireTime - nowTime > _30days) { return; } let flag = needExtendCookieNameList.find( (it) => cookieItem.name.endsWith(it) ); if (!flag) { return; } _GM.cookie.set({ name: cookieItem.name, value: cookieItem.value, expirationDate: cookieItem.expirationDate + _30days }).then(() => { log.info(`延长Cookie +30天成功:${cookieItem.name}`); }).catch(() => { log.error(`延长Cookie +30天失败:${cookieItem.name}`); }); }); } }; PopsPanel.init(); MT.init(); } }); require_entrance_001(); })(Qmsg, DOMUtils, Utils, pops, Viewer, hljs);