├── .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 | 
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,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"
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 |
--------------------------------------------------------------------------------