├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── report-abuse.md ├── AsyncDraft ├── AsyncDraft.js └── README.md ├── FancyBoxSupport(图片灯箱优化) ├── Main.js └── README.md ├── PushNewPost ├── PushNewPost.user.js └── README.md ├── README.md └── RainbowText ├── README.md └── Rainbow.user.js /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/report-abuse.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Report abuse 3 | about: Report abuse module in this repo 4 | title: "[Report]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | # Module name: 11 | Module name you want to report. 12 | 13 | # Describle the abuse behavior of module: 14 | What the module has done,or what you found in its code... 15 | -------------------------------------------------------------------------------- /AsyncDraft/AsyncDraft.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Async draft save 3 | // @namespace https://i.zapic.cc/ 4 | // @version 0.1 5 | // @description Async save your draft 6 | // @author Zapic 7 | // @match https://www.mcbbs.net/forum.php?mod=post* 8 | // @run-at document-body 9 | // ==/UserScript== 10 | 11 | // 此代码仅用于学习,不能用于其他用途。 12 | 13 | (async()=>{ 14 | await unsafeWindow.MExt; 15 | let MExt = unsafeWindow.MExt; 16 | let Module = { 17 | "core": ()=>{ 18 | let AsyncData = undefined; 19 | let SendReq = ()=>{ 20 | AsyncWorker.postMessage({ 21 | "action":"html2bbcode", 22 | "allow": 23 | { 24 | "allowbbcode":allowbbcode, 25 | "allowhtml":allowhtml, 26 | "allowimgcode":allowimgcode, 27 | "allowsmilies":allowsmilies 28 | }, 29 | "check":{ 30 | "bbcodeoff":fetchCheckbox("bbcodeoff"), 31 | "allowimgurl":fetchCheckbox("allowimgurl"), 32 | "htmlon":fetchCheckbox("htmlon"), 33 | "parseurloff":fetchCheckbox("parseurloff"), 34 | "smileyoff":fetchCheckbox("smileyoff") 35 | }, 36 | "data":editdoc.body.innerHTML 37 | }); 38 | return new Promise((res, rej) => { 39 | AsyncWorker.onmessage = ({ data }) => res(data); 40 | AsyncWorker.onerror = ({ data }) => rej(data); 41 | }); 42 | }; 43 | 44 | let AsyncWorker = null; 45 | MExt.jQuery(()=>{ 46 | AsyncWorker = new unsafeWindow.Worker(`data:text/javascript;base64,c2VsZi5vbm1lc3NhZ2UgPSAoZSkgPT4gew0KICAgIGlmIChlLmRhdGEuYWN0aW9uID09ICJodG1sMmJiY29kZSIpIHsNCiAgICAgICAgYWxsb3diYmNvZGUgPSBlLmRhdGEuYWxsb3cuYWxsb3diYmNvZGU7DQogICAgICAgIGFsbG93aHRtbCA9IGUuZGF0YS5hbGxvdy5hbGxvd2h0bWw7DQogICAgICAgIGFsbG93aW1nY29kZSA9IGUuZGF0YS5hbGxvdy5hbGxvd2ltZ2NvZGU7DQogICAgICAgIGFsbG93c21pbGllcyA9IGUuZGF0YS5hbGxvdy5hbGxvd3NtaWxpZXM7DQogICAgICAgIHNldHRpbmcgPSBlLmRhdGEuY2hlY2s7DQogICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyJjb2RlIjoyMDAsImRhdGEiOmh0bWwyYmJjb2RlKGUuZGF0YS5kYXRhKX0pOw0KICAgIH0NCn0NCnZhciByZSA9IFtdOw0KdmFyIERJU0NVWkNPREUgPSBbXTsNCnZhciBFWFRSQUZVTkMgPSBbXTsNCmxldCBhbGxvd2JiY29kZSA9IGZhbHNlOw0KbGV0IGFsbG93aHRtbCA9IGZhbHNlOw0KbGV0IGFsbG93aW1nY29kZSA9IGZhbHNlOw0KbGV0IGFsbG93c21pbGllcyA9IGZhbHNlOw0KbGV0IHNldHRpbmcgPSBudWxsOw0KbGV0IHJlYWR5ID0gZmFsc2U7DQp0cnkgew0KICAgIGltcG9ydFNjcmlwdHMoImh0dHBzOi8vd3d3Lm1jYmJzLm5ldC9kYXRhL2NhY2hlL2JiY29kZS5qcz91Z20iKTsNCn0gY2F0Y2ggKGUpIHsNCiAgICBjb25zb2xlLmxvZyhlKTsNCiAgICBzZWxmLnBvc3RNZXNzYWdlKHsiY29kZSI6IC0xfSk7DQp9DQoNCmZ1bmN0aW9uIHRyaW0oc3RyKSB7DQogICAgcmV0dXJuIChzdHIgKyAnJykucmVwbGFjZSgvKFxzKykkL2csICcnKS5yZXBsYWNlKC9eXHMrL2csICcnKTsNCn0NCg0KZnVuY3Rpb24gcHJlZ19yZXBsYWNlKHNlYXJjaCwgcmVwbGFjZSwgc3RyLCByZWdzd2l0Y2gpIHsNCiAgICB2YXIgcmVnc3dpdGNoID0gIXJlZ3N3aXRjaCA/ICdpZycgOiByZWdzd2l0Y2g7DQogICAgdmFyIGxlbiA9IHNlYXJjaC5sZW5ndGg7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KICAgICAgICByZSA9IG5ldyBSZWdFeHAoc2VhcmNoW2ldLCByZWdzd2l0Y2gpOw0KICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShyZSwgdHlwZW9mIHJlcGxhY2UgPT0gJ3N0cmluZycgPyByZXBsYWNlIDogKHJlcGxhY2VbaV0gPyByZXBsYWNlW2ldIDogcmVwbGFjZVswXSkpOw0KICAgIH0NCiAgICByZXR1cm4gc3RyOw0KfQ0KZmV0Y2hDaGVja2JveCA9IChjYm4pID0+IHsNCiAgICByZXR1cm4gc2V0dGluZ1tjYm5dID09IHRydWUgPyAxIDogMDsNCn0NCg0KZnVuY3Rpb24gcGFyc2V1cmwoc3RyLCBtb2RlLCBwYXJzZWNvZGUpIHsNCiAgICBpZiAoaXNVbmRlZmluZWQocGFyc2Vjb2RlKSkNCiAgICAgICAgcGFyc2Vjb2RlID0gdHJ1ZTsNCiAgICBpZiAocGFyc2Vjb2RlKQ0KICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFtjb2RlXF0oW1xzXFNdKz8pXFtcL2NvZGVcXS9pZywgZnVuY3Rpb24oJDEsICQyKSB7DQogICAgICAgICAgICByZXR1cm4gY29kZXRhZygkMiwgLTEpOw0KICAgICAgICB9KTsNCiAgICBzdHIgPSBzdHIucmVwbGFjZSgvKFtePj1cXSInXC9dfF4pKCgoKGh0dHBzP3xmdHApOlwvXC8pfHd3d1wuKShbXHdcLV0rXC4pKltcd1wtXHU0ZTAwLVx1OWZhNV0rXC4oW1wuYS16QS1aMC05XSt8XHU0RTJEXHU1NkZEfFx1N0Y1MVx1N0VEQ3xcdTUxNkNcdTUzRjgpKChcP3xcL3w6KStbXHdcLlwvPVw/JVwtJn5gQCc6KyFdKikrXC4oc3dmfGZsdikpL2lnLCAnJDFbZmxhc2hdJDJbL2ZsYXNoXScpOw0KICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oW14+PVxdIidcL118XikoKCgoaHR0cHM/fGZ0cCk6XC9cLyl8d3d3XC4pKFtcd1wtXStcLikqW1x3XC1cdTRlMDAtXHU5ZmE1XStcLihbXC5hLXpBLVowLTldK3xcdTRFMkRcdTU2RkR8XHU3RjUxXHU3RURDfFx1NTE2Q1x1NTNGOCkoKFw/fFwvfDopK1tcd1wuXC89XD8lXC0mfmBAJzorIV0qKStcLihtcDN8d21hKSkvaWcsICckMVthdWRpb10kMlsvYXVkaW9dJyk7DQogICAgc3RyID0gc3RyLnJlcGxhY2UoLyhbXj49XF0iJ1wvQF18XikoKCgoaHR0cHM/fGZ0cHxnb3BoZXJ8bmV3c3x0ZWxuZXR8cnRzcHxtbXN8Y2FsbHRvfGJjdHB8ZWQya3x0aHVuZGVyfHFxZGx8c3luYWNhc3QpOlwvXC8pKShbXHdcLV0rXC4pKls6XC5AXC1cd1x1NGUwMC1cdTlmYTVdK1wuKFtcLmEtekEtWjAtOV0rfFx1NEUyRFx1NTZGRHxcdTdGNTFcdTdFREN8XHU1MTZDXHU1M0Y4KSgoXD98XC98OikrW1x3XC5cLz1cPyVcLSY7fmBAJzorISNdKikqKS9pZywgbW9kZSA9PSAnaHRtbCcgPyAnJDE8YSBocmVmPSIkMiIgdGFyZ2V0PSJfYmxhbmsiPiQyPC9hPicgOiAnJDFbdXJsXSQyWy91cmxdJyk7DQogICAgc3RyID0gc3RyLnJlcGxhY2UoLyhbXlx3Pj1cXSInXC9AXXxeKSgod3d3XC4pKFtcd1wtXStcLikqWzpcLkBcLVx3XHU0ZTAwLVx1OWZhNV0rXC4oW1wuYS16QS1aMC05XSt8XHU0RTJEXHU1NkZEfFx1N0Y1MVx1N0VEQ3xcdTUxNkNcdTUzRjgpKChcP3xcL3w6KStbXHdcLlwvPVw/JVwtJjt+YEAnOishI10qKSopL2lnLCBtb2RlID09ICdodG1sJyA/ICckMTxhIGhyZWY9IiQyIiB0YXJnZXQ9Il9ibGFuayI+JDI8L2E+JyA6ICckMVt1cmxdJDJbL3VybF0nKTsNCiAgICBzdHIgPSBzdHIucmVwbGFjZSgvKFteXHctPj1cXToiJ1wuXC9dfF4pKChbXC1cLlx3XStAW1wuXC1cd10rKFwuXHcrKSspKS9pZywgbW9kZSA9PSAnaHRtbCcgPyAnJDE8YSBocmVmPSJtYWlsdG86JDIiPiQyPC9hPicgOiAnJDFbZW1haWxdJDJbL2VtYWlsXScpOw0KICAgIGlmIChwYXJzZWNvZGUpIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gRElTQ1VaQ09ERVsnbnVtJ107IGkrKykgew0KICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoIltcdERJU0NVWl9DT0RFXyIgKyBpICsgIlx0XSIsIERJU0NVWkNPREVbJ2h0bWwnXVtpXSk7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHN0cjsNCn0NCg0KZnVuY3Rpb24gaXNVbmRlZmluZWQodmFyaWFibGUpIHsNCiAgICByZXR1cm4gdHlwZW9mIHZhcmlhYmxlID09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlOw0KfQ0KZnVuY3Rpb24gY29kZXRhZyh0ZXh0LCBicikgew0KICAgIHZhciBiciA9ICFiciA/IDEgOiBicjsNCiAgICBESVNDVVpDT0RFWydudW0nXSsrOw0KICAgIGlmIChiciA+IDAgJiYgdHlwZW9mIHd5c2l3eWcgIT0gJ3VuZGVmaW5lZCcgJiYgd3lzaXd5ZykNCiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPGJyW15cPl0qPi9pZywgJ1xuJyk7DQogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXCQvaWcsICckJCcpOw0KICAgIERJU0NVWkNPREVbJ2h0bWwnXVtESVNDVVpDT0RFWydudW0nXV0gPSAnW2NvZGVdJyArIHRleHQgKyAnWy9jb2RlXSc7DQogICAgcmV0dXJuICdbXHRESVNDVVpfQ09ERV8nICsgRElTQ1VaQ09ERVsnbnVtJ10gKyAnXHRdJzsNCn0=`); 47 | }); 48 | (async ()=>{ 49 | let getById = (id)=>{return document.getElementById(id)}; 50 | await unsafeWindow.saveData; 51 | unsafeWindow.saveData = async (ignoreempty) =>{ 52 | ignoreempty = unsafeWindow.isUndefined(ignoreempty) ? 0 : ignoreempty; 53 | let target = getById('postform'); 54 | if (!target) return; 55 | if(typeof wysiwyg != 'undefined' && wysiwyg == 1){ 56 | setTimeout(setEditorTip,1,"正在保存数据..."); 57 | } 58 | let bbcode = (typeof wysiwyg != 'undefined' && wysiwyg == 1) ? (await SendReq()).data : getById('postform').message.value; 59 | if (typeof isfirstpost != 'undefined') { 60 | if (typeof wysiwyg != 'undefined' && wysiwyg == 1) { 61 | var messageisnull = trim(bbcode) === ''; 62 | } else { 63 | var messageisnull = bbcode === ''; 64 | } 65 | if (isfirstpost && (messageisnull && $('postform').subject.value === '')) { 66 | return; 67 | } 68 | if (!isfirstpost && messageisnull) { 69 | return; 70 | } 71 | } 72 | var data = subject = message = ''; 73 | for (var i = 0; i < target.elements.length; i++) { 74 | var el = target.elements[i]; 75 | if (el.name != '' && (el.tagName == 'SELECT' || el.tagName == 'TEXTAREA' || el.tagName == 'INPUT' && (el.type == 'text' || el.type == 'checkbox' || el.type == 'radio' || el.type == 'hidden' || el.type == 'select')) && el.name.substr(0, 6) != 'attach') { 76 | var elvalue = el.value; 77 | if (el.name == 'subject') { 78 | subject = trim(elvalue); 79 | } else if (el.name == 'message') { 80 | if (typeof wysiwyg != 'undefined' && wysiwyg == 1) { 81 | elvalue = bbcode; 82 | } 83 | message = trim(elvalue); 84 | } 85 | if ((el.type == 'checkbox' || el.type == 'radio') && !el.checked) { 86 | continue; 87 | } else if (el.tagName == 'SELECT') { 88 | elvalue = el.value; 89 | } else if (el.type == 'hidden') { 90 | if (el.id) { 91 | eval('var check = typeof ' + el.id + '_upload == \'function\''); 92 | if (check) { 93 | elvalue = elvalue; 94 | if ($(el.id + '_url')) { 95 | elvalue += String.fromCharCode(1) + $(el.id + '_url').value; 96 | } 97 | } else { 98 | continue; 99 | } 100 | } else { 101 | continue; 102 | } 103 | } 104 | if (trim(elvalue)) { 105 | data += el.name + String.fromCharCode(9) + el.tagName + String.fromCharCode(9) + el.type + String.fromCharCode(9) + elvalue + String.fromCharCode(9, 9); 106 | } 107 | } 108 | } 109 | if (!subject && !message && !ignoreempty) { 110 | return; 111 | } 112 | saveUserdata('forum_' + discuz_uid, data); 113 | setEditorTip("数据已保存"); 114 | } 115 | })(); 116 | } 117 | } 118 | MExt.exportModule(Module); 119 | })(); 120 | -------------------------------------------------------------------------------- /AsyncDraft/README.md: -------------------------------------------------------------------------------- 1 | ## AsyncDraft 2 | ### By Zapic 3 | 4 | 使用Worker进行html2bbcode转换,优化保存代码,大幅降低保存草稿所需时间,同时保存草稿不会阻塞页面,即使是超长帖子,也可放心开启自动保存草稿. 5 | -------------------------------------------------------------------------------- /FancyBoxSupport(图片灯箱优化)/Main.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name MCBBS Fancybox 3 | // @namespace https://i.zapic.cc/ 4 | // @version 0.1-beta 5 | // @description Use Fancybox to takeover image zoom in MCBBS 6 | // @author Zapic 7 | // @match https://www.mcbbs.net/* 8 | // @require https://cdnjs.loli.net/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js 9 | // @run-at document-body 10 | // @grant unsafeWindow 11 | // ==/UserScript== 12 | 13 | (async()=> { 14 | await unsafeWindow.MExt; 15 | let MExt = unsafeWindow.MExt; 16 | let $ = MExt.jQuery; 17 | MExt.exportModule({ 18 | core: () => { 19 | $('head').append(''); 20 | let HookImages = () => { 21 | $(".t_f:not([fancybox-apply])").attr("facybox-apply",'').each((i,post)=>{ 22 | let ImageCollect = $(post).find("img.zoom[file]"); 23 | ImageCollect.removeAttr("onclick zoomfile").each((i,Image)=>{ 24 | let frame = document.createElement('a'); 25 | let RefImage = Image.cloneNode(); 26 | RefImage.onload = ()=>{ 27 | RefImage.style.width = RefImage.style.height = ''; 28 | RefImage.previousSibling == null ? null : RefImage.previousSibling.remove(); 29 | RefImage.parentNode.previousElementSibling == null ? null : (RefImage.parentNode.previousElementSibling.localName == "div" ? RefImage.parentNode.previousElementSibling.remove() : null); 30 | if (!RefImage.getAttribute('_load')) { 31 | RefImage.setAttribute('_load', 1); 32 | if (RefImage.getAttribute('lazyloadthumb')) { 33 | thumbImg(RefImage); 34 | } 35 | } 36 | }; 37 | setTimeout(()=>{RefImage.removeAttribute("_load");},100); 38 | frame.href = Image.getAttribute("file"); 39 | frame.setAttribute("data-fancybox",post.id); 40 | frame.appendChild(RefImage); 41 | Image.after(frame); 42 | Image.remove(); 43 | }); 44 | }); 45 | }; 46 | $(HookImages); 47 | unsafeWindow.zoom = (img) =>{ 48 | $.fancybox.open({ 49 | src : img.getAttribute("file"), 50 | type : 'image' 51 | }); 52 | }; 53 | }, 54 | "config": [{ 55 | "id": "fancyBox", 56 | "default": true, 57 | "name": "Fancybox图片灯箱", 58 | "desc": "使用Fancybox替换原来的图片放大功能.", 59 | "type": "check" 60 | }], 61 | runcase: ()=>{return MExt.ValueStorage.get("fancyBox");} 62 | }); 63 | })(); 64 | -------------------------------------------------------------------------------- /FancyBoxSupport(图片灯箱优化)/README.md: -------------------------------------------------------------------------------- 1 | # MCBBS FancyBox 2 | ## 为图片提供更好的缩放体验 3 | 4 | **! 安装本模块后,建议禁用本体自带的优化图片缩放,以优化性能.** 5 | 6 | [安装地址(https://greasyfork.org/zh-CN/scripts/408692-mcbbs-fancybox)](https://greasyfork.org/zh-CN/scripts/408692-mcbbs-fancybox) 7 | 8 | ![scale](https://attachment.mcbbs.net/forum/202008/12/225705iarp7psam2arnpz5.gif) 9 | -------------------------------------------------------------------------------- /PushNewPost/PushNewPost.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name 获取版块最新帖子 3 | // @version 0.2 4 | // @include https://www.mcbbs.net/* 5 | // @author xmdhs 6 | // @description 获取版块最新帖子。 7 | // @namespace https://greasyfork.org/users/166541 8 | // @run-at document-body 9 | // ==/UserScript== 10 | 11 | (async () => { 12 | await unsafeWindow.MExt; 13 | let MExt = unsafeWindow.MExt; 14 | let $ = MExt.jQuery; 15 | Notification.requestPermission() 16 | const stime = 5000 17 | const getnewpost = { 18 | "runcase": () => { return MExt.ValueStorage.get("getnewpost").length > 0 }, 19 | "core": () => { 20 | var fidstemp = MExt.ValueStorage.get("getnewpost") 21 | var fids = fidstemp.split(",") 22 | var id = Math.round(new Date().getTime() / 1000) 23 | var tempid = localStorage.getItem("getnewpost") 24 | if (tempid == null) { 25 | localStorage.setItem("getnewpost", id) 26 | tempid = id 27 | for (let index = 0; index < fids.length; index++) { 28 | getposts(fids[index]) 29 | } 30 | } else { 31 | var getifcan = setInterval(function () { 32 | var atime = localStorage.getItem("getnewpost") 33 | var btime = Math.round(new Date().getTime() / 1000) 34 | if (btime - atime > 20) { 35 | localStorage.setItem("getnewpost", btime) 36 | for (let index = 0; index < fids.length; index++) { 37 | getposts(fids[index]) 38 | clearInterval(getifcan) 39 | } 40 | } 41 | }, stime * 2) 42 | } 43 | function getposts(fid) { 44 | setInterval(function () { 45 | localStorage.setItem("getnewpost", Math.round(new Date().getTime() / 1000)) 46 | $.getJSON("https://www.mcbbs.net/api/mobile/index.php?version=4&module=forumdisplay&fid=" + fid + "&filter=author&orderby=dateline", 47 | function (ajson) { 48 | if (localStorage.getItem("getnewpost-" + fid) == null || Math.round(new Date().getTime() / 1000) - JSON.parse(localStorage.getItem("getnewpost-" + fid)).time > 7200000 || JSON.parse(localStorage.getItem("getnewpost-" + fid)).time == undefined) { 49 | var tids = { tids: [], time: 0 } 50 | for (let index = 0; index < ajson.Variables.forum_threadlist.length; index++) { 51 | tids.tids.push(ajson.Variables.forum_threadlist[index].tid) 52 | tids.time = Math.round(new Date().getTime() / 1000) 53 | } 54 | localStorage.setItem("getnewpost-" + fid, JSON.stringify(tids)) 55 | } else { 56 | var temptids = localStorage.getItem("getnewpost-" + fid) 57 | var tids = JSON.parse(temptids) 58 | for (let index = 0; index < ajson.Variables.forum_threadlist.length; index++) { 59 | if (tids.tids.indexOf(ajson.Variables.forum_threadlist[index].tid) == -1) { 60 | push(ajson.Variables.forum_threadlist[index].tid, ajson.Variables.forum_threadlist[index].subject) 61 | tids.tids.push(ajson.Variables.forum_threadlist[index].tid) 62 | if (tids.tids.length > 100) { 63 | tids.tids.splice(0, 30) 64 | } 65 | tids.time = Math.round(new Date().getTime() / 1000) 66 | localStorage.setItem("getnewpost-" + fid, JSON.stringify(tids)) 67 | } 68 | } 69 | } 70 | } 71 | ) 72 | }, stime) 73 | } 74 | 75 | function push(tid, subject) { 76 | var n = new Notification('发现新帖', { 77 | body: subject, 78 | data: { 79 | url: "https://www.mcbbs.net/thread-" + tid + "-1-1.html#pgt" 80 | } 81 | }) 82 | n.onclick = function () { 83 | window.open(n.data.url, '_blank'); 84 | n.close(); 85 | } 86 | } 87 | }, 88 | "config": [{ 89 | "id": "getnewpost", 90 | "default": "52", 91 | "type": "text", 92 | "name": "推送版块最新帖子", 93 | "desc": "填入版块 fid,使用半角逗号隔开" 94 | }] 95 | } 96 | MExt.exportModule(getnewpost); 97 | })(); 98 | 99 | -------------------------------------------------------------------------------- /PushNewPost/README.md: -------------------------------------------------------------------------------- 1 | # PushNewPost 2 | 能推送指定版块的新帖 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Modules-Repo 2 | Modules from community 3 | 4 | # 向仓库提交你的模块 5 | 1. Fork本仓库 6 | 2. 创建你的文件夹 7 | 3. 在文件夹内放入README.md和模块本体 8 | 4. 发送Pull Request 9 | 5. 等待审核 10 | 11 | # 举报滥用行为 12 | 请在Issues区内提交举报 13 | -------------------------------------------------------------------------------- /RainbowText/README.md: -------------------------------------------------------------------------------- 1 | # 彩虹文字 2 | 提供彩虹文字工具. 3 | 4 | 选中文字并点击工具栏里的彩虹即可使文字彩虹化. 5 | [点击安装](https://github.com/Proj-MExt/Modules-Repo/raw/master/RainbowText/Rainbow.user.js) 6 | -------------------------------------------------------------------------------- /RainbowText/Rainbow.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name MCBBS Rainbow text 3 | // @namespace https://i.zapic.cc/ 4 | // @version 0.1-beta 5 | // @description Quick rainbow text 6 | // @author Zapic 7 | // @match https://www.mcbbs.net/* 8 | // @run-at document-body 9 | // @grant unsafeWindow 10 | // ==/UserScript== 11 | 12 | (async()=> { 13 | await unsafeWindow.MExt; 14 | let MExt = unsafeWindow.MExt; 15 | let $ = MExt.jQuery; 16 | let dlg = MExt.debugLog; 17 | let staticRes = { 18 | "rainbowBtnImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAACetJREFUeJzNWF2MXWUVXd/5u+f+9s7PnQ7TaQsUSluwLTbwpGkhRHkcXxQ10UGDLyZ0XtT4ppFoDFFrwoPRyGj0RaMmY6KBGEmL/EiKUkCgZWBqO23HmaEzc+/c3/Pzfa79ndtSILRVkHgmd+bee8759vrWXnvtfcbD/9nhfZDBdJJMKMfZY9IUOo6AJIGBWvMrlR9+IICM1hO6293TOfEy2ideqZ5+8IGp3ulTUIsL0J02km4bOb8IY4ziceh/AoiLTyRvLO+pP3G4evwr90+lzz3D4C0EBvAdF3lHwVcuXKMAx0Hop3Jb9cL97xsgHUUT60ef3n+GIBp/fQpu1GYwDyXHwM/l4KiA6YmgHRCMIFdwdEqQ6VvWec+AdBxPrP75kf0n771nqjd7HKHrYMRzERQCgnCgNKDkOvT4JoUD6oYg5SclOIfXvy+ANPXRfv65/Sfv+9xU8/jzqDJ4tZiHbxx4WgCQDRUh9Q20n8AvR3DLBFTpwSmkcEMN5chr+L0Diutrk+e++8B0Y+a3KKgE4/kQLmlQRnP3EXo+g+Z78Dem8MZ68Aa6UAQGJewwRUKb8GaEndZ7A7T+4rHJuS/cM40zJ1HLFZFzA66vkbgx0qADv9ZCaStB1JgiMgM3sUDkEOlAqf57akiEbdR/B0hK+PzMr/ef/PIXpypxE9VSCD8VJfSQ5Lowo3VUbtDwBtsURpSBUBkR8ks4MSrTi+JdWn5cpoyacv9TQBTu5L8e+t50/RcPoxb4KIQFy3rkRVCVNeR3dhCMEZQnRidAjD1/gQDNV8KobujDlPJAMYQqunB8nywWJcSeqwZER51c+P63p9dmfoWhMERJeeI1iHLryG1poriLGgibZCWxZBihgl4Ts7YNhaUGS8DoIMLaAK8LicrpM0eWWG3KsfxMNI7+bapy275DlwVEi5888+C3phu/+w0GCmSGhibVExfWUbplHcGmLhA00VeH/aO5fhoS9NYacmM1oJy3wICs1JUVdJY40ZNYQLaRtHpZhqSsl37yECuJzBTyCG0VJdBM0YZb63A3dshEfHHxlDtOQhdq8wiC668B8kEmYKfvM7xXqayytE2lRx9KeacHuUJYvyyg+qN/OLD20x/ZNOW5qIBJK3WUb2vDGRLRxtmuubgYnB4sI9i1FWqolFHVL20JoylmjYAvF21a9UpXoxMrrCcKLhHcvsEy8O6A2q+9Ojl336cPDnk+SrwjRQyzYRXlfR2o4VVoilfIMdRKRK04N44h2LaJ6XPfrCqykTge7/Sx0ooxtw6caxqsdAxi5ZOt1IaPyOTtl8R+ByDd7Uy8/qXPThe6HVtNRtKUX0d5b4PMdC0YZoe6YJUFJHz3DXDGB/m99KZsjYSM9piSU3XgleUOFrs+P7OiyJShqLkFruGwp/E6N2fvcd4N0OIvf3YgPf4ShgsEw8ix10RpNzUz0uZisfQEm4Y478Hbsw3uNQO2YUru7PUMPE8renYxwXLbQ6JY5ghxQcqZDzqICdpPfGiTQdFJ+k5A7X/OTc59/p6Dw0HAEy610YV/XQu+VJMbZcxImgIutvt6uKNVmyLHZKbXJW3HlmI8f95BW5UyI+wDMFxRmwCRKaJjQrTiErq9MuK4YmOrt4vaGD1x+msHp3NRi6miXxjqhiIu7aDP+C25wG6vxzuCnVvhjA0idbNRQjNgQ4d4Yr6LuVYePSdn05MVe45GUcJqNIb5+rU4tb4Na1ENcVKxqRtwWAR3Ahes4yKgzj9ePND8y+MYCeiiJkXid1G6idznW8ioUTY13ngNzpZh2xctM1z0DePjsbkIi1GIyAkhNWW7l96Ape51eOGN3QSygxMrtaZCGUC4Zt5iMGnuAiNvAhJ2zn596mCoE+RkkOLY4LA3eZIqVoNcmjJ6XM0jv2Nz5rYiQy7SMHkcOZXiXEKdOJmnaLLSTq7BS0v78Mr521DHCL/L05IcbsLJWgs3KOx6fSBvqbJofn5v4/BjGAwDu1xMdirbuA8/sbnNqkohuGkLTN7vO3+Krsrh6TMRFjo5OjR1YgWqsBLfiCfnD2ChuYNaGrIeZGuLfSVMTAaZFDq9GKVUPjOuvoSh83/8fTWgMYWOsobn19rwWOJZo8yyq0aqdOeBbMoz0iwDvLxs8GqTXuL4toRjU8BybxseP30XFnu7WHHUB9Mp3arAKip0eiifXUHx3CoK9Tb8uIcwLwPaPpkmMkAyC89+5hMHy5x/xUeM30Fxs1RVnA1cNLguYee2j9ssCZiU3y1HHp5dThAxxdKfEu2jHo/jyPwdWIhuoZnm7bzjM1Cx20NtdgkDc0sotTvIcZYWQbJeEagLM3Wfoc7sib3x6ZMIOPVBmmex1+9TkWVHhKzIjFOtZO1Aeha18uJCjBb1I+1JqqxrhvH0wkcp4t30ngInSDYKpqO62sTo3+cwsthCyOcxSZuSlmKLxEPfF0THGaD6U49Xc6TGd8TuYwQjqZ30Lh3k/E21vpUaG3ypG2B2nQOW8qweElPC7OqHMd/4EPdcsUFFvEMrbYw/NYuhBr0s1dadJWyqI0Rph8ATqieShY9cTFnv6DMHQ/Yrmx6vh6Am7PR9VUAFtMihSlb6NryH184ntkdlO3PR6Y7hhaVb0TM1e5OkdagRYfTo6xiqNy0zCb9MDOdtTpvj23PYd+e2mZ17R48NbsyvyUPiyqOPVPspexmDvsxUZMiLOZAnFpDElzFBE4wbvDlk9gjg1FpEBjnnMC2pLmOusRONZAu1JSBTlCNq5tjrqK00KFKyxSGpZ5ocDhPce//emY/cfePhsJA7dGm5D3787jULyLQ6CDl88SkJboH0hWlGjZEZh2+Hq7ZdaKt4j6XMQV+HdtaR4SI1FZxYu8mKWC4PWYYDZ1sYWqhDHkrFOFuaUhju4Ks/uOvn228em8RlDs9anChTHuLK2paR6EfGcvkbDBUtE3KkbAcL6/K8JQ3TsfPNUmsjGr2NBORbo3SSBOWTy/QZnT0gMk3aXcfUdw7MXAlMBkgmOnFyCyi2wU2/mpTPc+zqSt5bDsFyd20qJTidBWc711KWg3YIE9ctN9qoLDVY7lnlxEkbd3xqM3bt3XT4SmAyQP2ObKh4VUj6gjYZyJxv24T9v4D91iUbxqZBLECz7Jd7w3aUsM/qdO/iUp1pizKGZYbmQ+PHPnnzjOO6h64ExgJynf5sSxZyuczWbUFJ2lz34oOdZsCEDMSp0z8p5e6h2R3m9XRj7kNYCRtdePQfh61AUzuj1/vYOF69KnYyhpB+Uyoh4cSXPe7iYoWl7G1uP6UpTTOK2R50f3C3JHIzSaHPGMmkiwYtnc3QUqFpgs3bR9Y837sqdiyga5889o2Ln/709tNSic9cYYkfv+XTibedffi5q4WSHf8GylWZUzwMKbYAAAAASUVORK5CYII=" 19 | }; 20 | let quickRainbow = { 21 | "runcase": () => { return MExt.ValueStorage.get("quickRainbow") }, 22 | "config": [{ 23 | "id": "quickRainbow", 24 | "default": true, 25 | "name": "编辑器支持彩虹文字", 26 | "type": "check", 27 | "desc": "快速向贴内插入彩虹文字." 28 | }], 29 | "style": `#fastpostrainbow, #postrainbow,#e_rbn_s1 { 30 | background-image: url(` + staticRes.rainbowBtnImage + `); 31 | background-size: 28px; 32 | background-position: center top; 33 | } 34 | #fastpostrainbow.in_editorbtn , #postrainbow { 35 | background-size: 16px; 36 | background-position: center; 37 | }`, 38 | "core": () => { 39 | let rainbowFast = () => { 40 | let target = document.getElementById("fastpostmessage"); 41 | if (target.selectionStart != target.selectionEnd) { 42 | let str = target.value.substr(target.selectionStart, target.selectionEnd); 43 | seditor_insertunit('fastpost', gencode(str, 0), ''); 44 | } 45 | }; 46 | let rainbowFloat = () => { 47 | let target = document.getElementById("postmessage"); 48 | if (target.selectionStart != target.selectionEnd) { 49 | let str = target.value.substr(target.selectionStart, target.selectionEnd); 50 | seditor_insertunit('post', gencode(str, 0), ''); 51 | } 52 | }; 53 | let rainbow = () => { 54 | if (getSel() == "") { 55 | return; 56 | } 57 | addSnapshot(getEditorContents()); 58 | insertText(gencode(getSel(), wysiwyg)); 59 | }; 60 | let hookReplyBtn = () => { 61 | if ($("#postrainbow").length > 0) { return false; } 62 | let btn = document.createElement("a"); 63 | btn.id = "postrainbow"; 64 | btn.href = "javascript:;"; 65 | btn.title = "彩虹文字"; 66 | btn.addEventListener("click", rainbowFloat); 67 | btn.innerText = "彩虹文字"; 68 | $("#postat.fat").after(btn); 69 | dlg("Reply bottons appends."); 70 | } 71 | $("#append_parent").on('DOMNodeInserted', hookReplyBtn); 72 | $(() => { 73 | let btn = document.createElement("a"); 74 | btn.id = "fastpostrainbow"; 75 | btn.href = "javascript:;"; 76 | btn.title = "彩虹文字"; 77 | btn.className = "in_editorbtn"; 78 | btn.addEventListener("click", rainbowFast); 79 | btn.innerText = "彩虹文字"; 80 | $("#fastpostat").after(btn); 81 | let btn2 = document.createElement("a"); 82 | btn2.id = "e_rbn_s1"; 83 | btn2.href = "javascript:;"; 84 | btn2.title = "彩虹文字"; 85 | btn2.addEventListener("click", rainbow); 86 | btn2.innerText = "彩虹文字"; 87 | $("#e_adv_s1").append(btn2); 88 | }); 89 | let nextColor = (clr, step) => { 90 | if (clr.r == 255 && clr.b != 255) { 91 | clr.g -= step; 92 | } else if (clr.g == 255 && clr.r != 255) { 93 | clr.b -= step; 94 | } else if (clr.b == 255 && clr.g != 255) { 95 | clr.r -= step; 96 | } 97 | while (clr.r > 255 || clr.r < 0 || clr.g > 255 || clr.g < 0 || clr.b > 255 || clr.b < 0) { 98 | if (clr.r > 255) { 99 | clr.g += 255 - clr.r; 100 | clr.r = 255; 101 | continue; 102 | } 103 | if (clr.g < 0) { 104 | clr.b -= clr.g; 105 | clr.g = 0; 106 | continue; 107 | } 108 | if (clr.b > 255) { 109 | clr.r += 255 - clr.b; 110 | clr.b = 255; 111 | continue; 112 | } 113 | if (clr.r < 0) { 114 | clr.g -= clr.r; 115 | clr.r = 0; 116 | continue; 117 | } 118 | if (clr.g > 255) { 119 | clr.b += 255 - clr.g; 120 | clr.g = 255; 121 | continue; 122 | } 123 | if (clr.b < 0) { 124 | clr.r -= clr.b; 125 | clr.b = 0; 126 | continue; 127 | } 128 | } 129 | return clr; 130 | } 131 | let dCode = (str) => { 132 | while (str.length < 2) { 133 | str = "0" + str; 134 | } 135 | return str; 136 | } 137 | let HexC = (color) => { 138 | return "#" + dCode(parseInt(color.r).toString(16)) + dCode(parseInt(color.g).toString(16)) + dCode(parseInt(color.b).toString(16)); 139 | } 140 | let gencode = (str, type) => { 141 | let color = { 142 | "r": 255, 143 | "g": 0, 144 | "b": 0 145 | } 146 | let len = str.length; 147 | let step = 1530 / len < 1 ? 1 : 1530 / len; 148 | let rstr = ''; 149 | for (let i = 0; i < len; i++) { 150 | if (type == 0) { 151 | rstr += "[color=" + HexC(color) + "]" + str.charAt(i) + "[/color]"; 152 | } else { 153 | rstr += "" + str.charAt(i) + ""; 154 | } 155 | color = nextColor(color, step); 156 | } 157 | return rstr; 158 | }; 159 | } 160 | } 161 | MExt.exportModule(quickRainbow); 162 | })(); 163 | --------------------------------------------------------------------------------