User:WhitePhosphorus/js/all-in-one.js

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// 回退,封禁,删除,RD,不理会。

$(function () {
mw.loader.using(['mediawiki.util', 'mediawiki.api'], function() {

let config = {};

const work = function() {
    let api = new mw.Api();
    
    if (config.block) {
        let data = {
            action: 'block',
            user: config.username,
            expiry: config.blockDur,
            reason: config.blockReason,
            reblock: 1
        };
        if (config.blockAnon) data.anononly = 1;
        if (config.blockAuto) data.autoblock = 1;
        if (config.blockCreate) data.nocreate = 1;
        if (!config.blockTalk) data.allowusertalk = 1;
        if (config.blockMail) data.noemail = 1;
        if (config.blockHide) data.hidename = 1;
        api.postWithEditToken(data).done(() => mw.notify('The villain is blocked.')).fail(function(e) {
            mw.notify('Failed to block the villain: ' + e);
            console.log(e);
        });
    }
    
    let untildate = new Date();
    if (config.endtime === '1h') {
        untildate.setHours(untildate.getHours() - 1);
    } else if (config.endtime === 'inf') {
        untildate = null;
    } else {
        // TODO: 2019年9月1日 (日) 21:47
        untildate = new Date(config.endtime);
        if (isNaN(untildate.getTime()))
            config.isIP ? untildate.setHours(untildate.getHours() - 1) : (untildate = null);
    }
    data = {
        action: 'query',
        list: 'usercontribs',
        ucuser: config.username,
        uclimit: 'max'
        // TODO: continue
    };
    if (untildate) data.ucend = untildate.toISOString();
    
    api.get(data).done(function(data) {
        let contribs = data.query;
        if (!contribs) {
            mw.notify('Failed to fetch the contribs!');
            return;
        }
        contribs = contribs.usercontribs;
        if (!contribs || !contribs.length) {
            mw.notify('No contribs found.');
            return;
        }
    
        let ids = {};
        let creation = [];
        for (let edit of contribs) {
            if (edit.new === '') {
                creation.push(edit.title);
            } else {
                if (ids[edit.title] === undefined) ids[edit.title] = [];
                ids[edit.title].push(edit.revid);
            }
        }
        for (let [title, idlist] of Object.entries(ids)) {
            data = config.rollbackBot ? {markbot: 1} : {};
            data.summary = config.rollbackShow ? '' : 'revert edits by <username hidden>';
            api.rollback(title, config.username, data).done(function() {
                mw.notify(`Page ${title} Reverted.`);
            }).fail(function(e) {
                mw.notify(`Failed to revert on the page ${title}: ${e}`);
                console.log('revert', title, e);
            }).always(function() {
                if (config.rd) {
                    api.postWithEditToken({
                        action: 'revisiondelete',
                        type: 'revision',
                        ids: idlist,
                        hide: config.rdHides,
                        reason: config.rdReason,
                        suppress: config.os ? "yes" : "nochange"
                    }).done(() => mw.notify(`${idlist.length} revisions on page ${title} hidden.`)).fail(function(e) {
                        mw.notify(`Failed to hide revisions on ${title}: ${e}`);
                        console.log('revisiondelete', title, idlist, e);
                    });
                }
            });
        }
        if (config.massdel) {
            for (let title of creation) {
                api.postWithEditToken({
                    action: 'delete',
                    title: title,
                    reason: config.massdelReason
                }).done(() => mw.notify(`Deleted page ${title}.`)).fail(function(e) {
                    mw.notify(`Failed to delete ${title}: ${e}`);
                    console.log('delete', title, e);
                });
            }
        }
    });
};

$(mw.util.addPortletLink('p-cactions', '#', '一条龙服务')).click(function (e) {
    $('#content').html(`<form id="p4js-allinone-settings"><p>警告:不支持 IP 段。</p>
        <label>用户名:<input type="text" style="width:100%" id="p4js-allinone-username"></label><br>
        <label>编辑追溯期:<select id="p4js-allinone-endtime" onchange="this.value === 'other' ? $('#p4js-allinone-endtime-text').show() : $('#p4js-allinone-endtime-text').hide();">
        <option value="1h">1小时</option>
        <option value="inf">全部编辑</option>
        <option value="other">手动输入时间戳(包含该时间戳)</option>
        </select></label><input type="text" id="p4js-allinone-endtime-text" style="display:none;width:100%"><br>
        <label>套餐(注册用户均为不限期):<select id="p4js-allinone-package">
        <option value="hkp">HKP(傀儡,一周,禁讨论页,RD)</option>
        <option value="hd">韩导(傀儡,一周,禁讨论页,RD)</option>
        <option value="harbin">哈尔滨(傀儡,一周,不 RD)</option>
        <option value="rabbit">🐰(代理,两年,不 RD)</option>
        <option value="vand">一般 VOA(anonblock,一周,不 RD)</option>
        </select></label><br>
        <fieldset>
        <legend>回退</legend>
        <label><input type="checkbox" checked id="p4js-allinone-rollback-bot">标记回退为机器人编辑</label>
        <label><input type="checkbox" checked id="p4js-allinone-rollback-show">在回退摘要中显示用户名</label>
        </fieldset>
        <fieldset>
        <legend><label><input type="checkbox" checked id="p4js-allinone-block">封禁</label></legend>
        <label>时长:<select id="p4js-allinone-blockdur" onchange="this.value === 'other' ? $('#p4js-allinone-blockdur-text').show() : $('#p4js-allinone-blockdur-text').hide();">
        <option value="1 day">1日</option>
        <option value="31 hours">31小时</option>
        <option value="3 days">3日</option>
        <option value="5 days">5日</option>
        <option value="1 week">1周</option>
        <option value="2 weeks">2周</option>
        <option value="1 month">1个月</option>
        <option value="3 months">3个月</option>
        <option value="1 year">1年</option>
        <option value="2 years">2年</option>
        <option value="never">不限期</option>
        <option value="other">其他</option>
        </select></label><input type="text" id="p4js-allinone-blockdur-text" style="display:none">
        <label>理由:<select id="p4js-allinone-blockreason" onchange="$('#p4js-allinone-blockreason-text')[0].value = $('#p4js-allinone-blockreason-text')[0].value || this.value;">
        <option value="確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]">確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]</option>
        <option value="[[Project:VOA|纯破坏用户]]">[[Project:VOA|纯破坏用户]]</option>
        <option value="[[Project:VAN|破壞]]">[[Project:VAN|破壞]]</option>
        <option value="[[Project:SOAP|散發廣告或宣傳]]">[[Project:SOAP|散發廣告或宣傳]]</option>
        <option value="仅[[Project:SOAP|散发广告/宣传]]的用户">仅[[Project:SOAP|散发广告/宣传]]的用户</option>
        <option value="{{blocked proxy}}<!--[[Template:blocked proxy|blocked proxy]]-->">{{blocked proxy}}</option>
        <option value="{{Anonblock}}<!--[[Template:Anonblock|Anonblock]]-->">{{Anonblock}}</option>
        <option value="">其他</option>
        </select></label><br>
        <input type="text" style="width:100%" id="p4js-allinone-blockreason-text">
        <label><input type="checkbox" checked id="p4js-allinone-block-anononly">仅限匿名用户</label>
        <label><input type="checkbox" checked id="p4js-allinone-block-auto">启用自动封禁</label>
        <label><input type="checkbox" checked id="p4js-allinone-block-create">账户创建停用</label>
        <label><input type="checkbox" checked id="p4js-allinone-block-talk">阻止编辑讨论页</label>
        <label><input type="checkbox" id="p4js-allinone-block-mail">阻止发送电邮</label>
        <label><input type="checkbox" id="p4js-allinone-block-hide">在封禁日志中隐藏用户名(监督员限定)</label>
        </fieldset>
        <fieldset>
        <legend><label><input type="checkbox" checked id="p4js-allinone-massdel">批量删除页面</label></legend>
        <select id="p4js-allinone-delreason" onchange="$('#p4js-allinone-delreason-text')[0].value += this.value; this.value = '';">
        <option value="">選擇</option>
        <option value="[[Project:CSD#G3|G3]]: 纯粹[[Project:VAN|破坏]]">[[Project:CSD#G3|G3]]: 纯粹[[Project:VAN|破坏]]</option>
        <option value="[[Project:CSD#G11|G11]]: 明顯的[[Project:SOAP|廣告宣傳]]頁面,或只有相关人物或團體的聯繫方法的页面">[[Project:CSD#G11|G11]]: 明顯的[[Project:SOAP|廣告宣傳]]頁面,或只有相关人物或團體的聯繫方法的页面</option>
        </select><br>
        <input type="text" style="width:100%" id="p4js-allinone-delreason-text"><br>
        </fieldset>
        <fieldset>
        <legend><label><input type="checkbox" checked id="p4js-allinone-rd">删除修订版本</label></legend>
        <label><input type="checkbox" checked id="p4js-allinone-hide-content">隐藏版本文字</label>
        <label><input type="checkbox" checked id="p4js-allinone-hide-summary">隐藏编辑摘要</label>
        <label><input type="checkbox" id="p4js-allinone-hide-username">隐藏用户名</label><br>
        <select id="p4js-allinone-rdreason" onchange="$('#p4js-allinone-rdreason-text')[0].value += this.value; this.value = '';">
        <option value="">選擇</option>
        <option value="[[Project:RD1|RD1]]:明显侵犯版权">RD1:明显侵犯版权</option>
        <option value="[[Project:RD2|RD2]]:针对个人、团体或组织的严重侮辱、贬低或攻击性材料">RD2:针对个人、团体或组织的严重侮辱、贬低或攻击性材料</option>
        <option value="[[Project:RD3|RD3]]:纯粹的扰乱性内容">RD3:纯粹的扰乱性内容</option>
        <option value="[[Project:RD4|RD4]]:非公开的私人信息">RD4:非公开的私人信息</option>
        <option value="[[Project:RD5|RD5]]:删除守则下的有效删除,使用RevisionDelete执行">RD5:删除守则下的有效删除,使用RevisionDelete执行</option>
        <option value="[[Project:RD6|RD6]]:版本删除校正">RD6:版本删除校正</option>
        <option value="[[Project:OS|OS1]]:移除未公开私人资料">OS1:移除未公开私人资料</option>
        <option value="[[Project:OS|OS2]]:移除疑诽谤内容:维基媒体基金会要求">OS2:移除疑诽谤内容:维基媒体基金会要求</option>
        <option value="[[Project:OS|OS2]]:移除疑诽谤内容:事实清楚而且没有保留需要">OS2:移除疑诽谤内容:事实清楚而且没有保留需要</option>
        <option value="[[Project:OS|OS3]]:移除侵犯版权内容:维基媒体基金会要求">OS3:移除侵犯版权内容:维基媒体基金会要求</option>
        <option value="[[Project:OS|OS4]]:攻击性用户名">OS4:攻击性用户名</option>
        </select><br>
        <input type="text" style="width:100%" id="p4js-allinone-rdreason-text"><br>
        <label><input type="checkbox" id="p4js-allinone-os">监督(监督员限定)</label>
        </fieldset>
        <input type="submit" id="p4js-allinone-start" value="开始 [Enter]"></form>`);

    $('#p4js-allinone-package').on('change', function(e) {
        let isIP = mw.util.isIPAddress($('#p4js-allinone-username')[0].value);
        
    	if (this.value === 'hd') {
            $('#p4js-allinone-blockdur').val('1 week');
            $('#p4js-allinone-rd')[0].checked = true;
            $('#p4js-allinone-block-anononly')[0].checked = true;
            $('#p4js-allinone-block-talk')[0].checked = true;
            $('#p4js-allinone-block-mail')[0].checked = true;
            $('#p4js-allinone-blockreason').val('確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]');
    	} else if (this.value === 'hkp') {
            $('#p4js-allinone-blockdur').val('1 week');
            $('#p4js-allinone-rd')[0].checked = true;
            $('#p4js-allinone-block-anononly')[0].checked = true;
            $('#p4js-allinone-block-talk')[0].checked = true;
            $('#p4js-allinone-blockreason').val('確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]');
        } else if (this.value === 'harbin') {
            $('#p4js-allinone-blockdur').val('1 week');
            $('#p4js-allinone-rd')[0].checked = false;
            $('#p4js-allinone-block-anononly')[0].checked = true;
            $('#p4js-allinone-block-talk')[0].checked = false;
            $('#p4js-allinone-blockreason').val('確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]');
        } else if (this.value === 'rabbit') {
            $('#p4js-allinone-blockdur').val('2 years');
            $('#p4js-allinone-rd')[0].checked = false;
            $('#p4js-allinone-block-anononly')[0].checked = false;
            $('#p4js-allinone-block-talk')[0].checked = false;
            $('#p4js-allinone-blockreason').val(isIP ? '{{blocked proxy}}<!--[[Template:blocked proxy|blocked proxy]]-->' : '確認為[[Project:SOCK|傀儡]]或[[Project:MEAT|真人傀儡]]');
        } else if (this.value === 'vand') {
            $('#p4js-allinone-blockdur').val('1 week');
            $('#p4js-allinone-rd')[0].checked = false;
            $('#p4js-allinone-block-anononly')[0].checked = true;
            $('#p4js-allinone-block-talk')[0].checked = false;
            $('#p4js-allinone-blockreason').val(isIP ? '{{Anonblock}}<!--[[Template:Anonblock|Anonblock]]-->' : '[[Project:VOA|纯破坏用户]]');
        }
        if (!isIP) $('#p4js-allinone-blockdur').val('never');
    });
    $('#p4js-allinone-username').on('keyup', function(e) {
        if (mw.util.isIPAddress(this.value)) {
            $('#p4js-allinone-endtime').val('1h');
            $('#p4js-allinone-blockdur').val('1 week');
            $('#p4js-allinone-block-anononly').parent().show();
            $('#p4js-allinone-block-auto').parent().hide();
            $('#p4js-allinone-block-mail').parent().hide();
        } else {
            $('#p4js-allinone-endtime').val('inf');
            $('#p4js-allinone-blockdur').val('never');
            $('#p4js-allinone-block-anononly').parent().hide();
            $('#p4js-allinone-block-auto').parent().show();
            $('#p4js-allinone-block-mail').parent().show();
        }
    });
    $('#p4js-allinone-rdreason-text').val('[[Project:RD3|RD3]]:纯粹的扰乱性内容');
    $('#p4js-allinone-delreason-text').val('[[Project:CSD#G3|G3]]: 纯粹[[Project:VAN|破坏]]');
    if (mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') {
        // fill the current username
        $('#p4js-allinone-username')[0].value = mw.config.get('wgPageName').slice(mw.config.get('wgPageName').indexOf('/')+1);
    }
    $('#p4js-allinone-username').focus();
    $('#p4js-allinone-username').keyup();

    $('#p4js-allinone-start').click(function(e) {
        e.preventDefault();
        config.username = $('#p4js-allinone-username')[0].value;
        if (!config.username) return;
        config.isIP = mw.util.isIPAddress(config.username);
        if ($('#p4js-allinone-endtime')[0].value === 'other') {
            config.endtime = $('#p4js-allinone-endtime-text')[0].value || (config.isIP ? '1h' : 'inf');
        } else {
            config.endtime = $('#p4js-allinone-endtime')[0].value;
        }

        //config.rollback = $('#p4js-allinone-rollback')[0].checked;
        config.rollbackBot = $('#p4js-allinone-rollback-bot')[0].checked;
        config.rollbackShow = $('#p4js-allinone-rollback-show')[0].checked;

        config.block = $('#p4js-allinone-block')[0].checked;
        config.blockDur = $('#p4js-allinone-blockdur-text')[0].value || $('#p4js-allinone-blockdur')[0].value;
        config.blockReason = $('#p4js-allinone-blockreason-text')[0].value;
        if (!config.blockReason.includes($('#p4js-allinone-blockreason')[0].value)) {
            config.blockReason = $('#p4js-allinone-blockreason')[0].value + (config.blockReason && ':' + config.blockReason);
        }
        config.blockAnon = config.isIP && $('#p4js-allinone-block-anononly')[0].checked;
        config.blockAuto = !config.isIP && $('#p4js-allinone-block-auto')[0].checked;
        config.blockCreate = $('#p4js-allinone-block-create')[0].checked;
        config.blockTalk = $('#p4js-allinone-block-talk')[0].checked;
        config.blockMail = !config.isIP && $('#p4js-allinone-block-mail')[0].checked;
        config.blockHide = $('#p4js-allinone-block-hide')[0].checked;

        config.massdel = $('#p4js-allinone-massdel')[0].checked;
        config.massdelReason = $('#p4js-allinone-delreason-text')[0].value;

        config.rd = $('#p4js-allinone-rd')[0].checked;
        config.rdHides = '';
        if ($('#p4js-allinone-hide-content')[0].checked) config.rdHides += 'content|';
        if ($('#p4js-allinone-hide-summary')[0].checked) config.rdHides += 'comment|';
        if ($('#p4js-allinone-hide-username')[0].checked) config.rdHides += 'user|';
        config.rdReason = $('#p4js-allinone-rdreason-text')[0].value;
        config.os = $('#p4js-allinone-os')[0].checked;

        work();
    });
});

});
});