User:暁月凛奈/close-vip.js

维基百科,自由的百科全书

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

// <nowiki>
/* globals CloseVip:true */
(function() {

    if (typeof CloseVip == 'undefined') {
        CloseVip = {};
    }

    if (typeof CloseVip.summary == 'undefined') {
        CloseVip.summary = '使用[[User:暁月凛奈/close-vip.js|close-vip]]关闭报告';
    }

    if (mw.config.get('wgPageName') !== 'Wikipedia:当前的破坏'
        || mw.config.get('wgAction') !== 'view'
        || mw.config.get('wgRevisionId') !== mw.config.get('wgCurRevisionId')) {
        return;
    }

    mw.util.addCSS(`
    a.close-vip-link {
        color: red;
        font-weight: bold;
    }
    a.close-vip-link-closed {
        color: gray;
    }
    `)

    var titles = $('#bodyContent').find('h3');
    var api = new mw.Api();
    var content, curtimestamp, basetimestamp;

    var getPageContent = new Promise(function(resolve, reject) {
        api.get({
            action: 'query',
            prop: 'revisions',
            rvprop: ['content', 'timestamp'],
            rvslots: '*',
            titles: 'Wikipedia:当前的破坏',
            formatversion: '2',
            curtimestamp: true,
        }).then(function(data) {
            var page, revision;
            if (!data.query || !data.query.pages) {
                mw.notify('未能抓取页面内容(unknown)');
                reject('unknown');
            }
            page = data.query.pages[0];
            if (!page || page.invalid) {
                mw.notify('未能抓取页面内容(invalidtitle)');
                reject('invalidtitle');
            }
            if (page.missing) {
                mw.notify('未能抓取页面内容(nocreate-missing)');
                reject('nocreate-missing');
            }
            revision = page.revisions[0];
            var content = revision.slots.main.content;
            var basetimestamp = revision.timestamp;
            var curtimestamp = data.curtimestamp;
            resolve({
                content: content,
                basetimestamp: basetimestamp,
                curtimestamp: curtimestamp,
            });
        })
    }
    );

    function showCloseButton() {
        titles.each(function(key, current) {
            var title = $(current).find('.mw-headline').first().text();

            var sectionid = mw.util.getParamValue('section', $(current).find('.mw-editsection a')[0].href);

            var closeLink = document.createElement('a');
            closeLink.href = '#';
            closeLink.className = 'close-vip-link';
            closeLink.innerText = wgULS('关闭', '關閉');
            $(closeLink).on('click', function() {
                processClose(key, sectionid, title);
                return false;
            });

            var node = current.getElementsByClassName('mw-editsection')[0];
            var delDivider = document.createElement('span');
            delDivider.appendChild(document.createTextNode(' | '));
            node.insertBefore(delDivider, node.childNodes[1]);
            node.insertBefore(closeLink, node.childNodes[1]);
        });
    }

    function processClose(key, sectionid, title) {
         mw.loader.using(['jquery.ui'], function() {
             var html = '<div>';
             html += '执行{{Blocked}}<br>';
             html += '<select id="blocked" onchange="$(this.parentElement).find(\'#comment\')[0].value += this.value; this.value = \'\'; ">';
             html += '<option value="">选择</option>';
             html += '<option value="{{Blocked|1天}}">1天</option>';
			 html += '<option value="{{Blocked||31小时}}">31小时</option>';
             html += '<option value="{{Blocked|1周}}">1周</option>';
             html += '<option value="{{Blocked|1个月}}">1个月</option>';
             html += '<option value="{{Blocked|1年}}">1年</option>';
             html += '<option value="{{Blocked|2年}}">2年</option>';
             html += '<option value="{{Blocked|indef}}">不限期封禁</option>';
			 html += '</select><br>';
			 html += '标记{{Blocked}}<br>';
             html += '<select id="markblocked" onchange="$(this.parentElement).find(\'#comment\')[0].value += this.value; this.value = \'\'; ">';
			 html += '<option value="">选择</option>';
             html += '<option value="{{Blocked|ad=Example|1天}}">已由管理员Example执行封禁1天</option>';
			 html += '<option value="{{Blocked|ad=Example|31小时}}">已由管理员Example执行封禁31小时</option>';
			 html += '<option value="{{Blocked|ad=Example|1周}}">已由管理员Example执行封禁1周</option>';
			 html += '<option value="{{Blocked|ad=Example|1个月}}">已由管理员Example执行封禁1个月</option>';
			 html += '<option value="{{Blocked|ad=Example|1年}}">已由管理员Example执行封禁1年</option>';
			 html += '<option value="{{Blocked|ad=Example|2年}}">已由管理员Example执行封禁2年</option>';
			 html += '<option value="{{Blocked|ad=Example|indef}}">已由管理员Example执行不限期封禁</option>';
             html += '</select><br>';
			 html += '{{GlobalBlocked}}<br>';
			 html += '<select id="GlobalBlocked" onchange="$(this.parentElement).find(\'#comment\')[0].value += this.value; this.value = \'\'; ">';
             html += '<option value="">选择</option>';
             html += '<option value="{{GlobalBlocked|3天}}">3天</option>';
             html += '<option value="{{GlobalBlocked|1周}}">1周</option>';
             html += '<option value="{{GlobalBlocked|Example|3天}}">已由监管员Example全域封禁3天</option>';
             html += '<option value="{{GlobalBlocked|Example|1周}}">已由监管员Example全域封禁1周</option>';
             html += '</select><br>';
			 html += '{{GlobalLocked}}<br>';
             html += '<select id="GlobalLocked" onchange="$(this.parentElement).find(\'#comment\')[0].value += this.value; this.value = \'\'; ">';
             html += '<option value="">选择</option>';
             html += '<option value="{{GlobalLocked|Example}}">已由监管员Example全域锁定</option>';
             html += '</select><br>';
             html += '{{VIP}}<br>';
             html += '<select id="vip" onchange="$(this.parentElement).find(\'#comment\')[0].value += this.value; this.value = \'\'; ">';
             html += '<option value="">选择</option>';
             html += '<option value="{{VIP|chk}}">检查中</option>';
             html += '<option value="{{VIP|m}}">将关注此用户</option>';
             html += '<option value="{{VIP|w}}">用户已被警告</option>';
             html += '<option value="{{VIP|i}}">近期编辑不足以用于判断是否封禁用户</option>';
             html += '<option value="{{VIP|f}}">最后警告后无编辑。如用户继续进行破坏,请回报</option>';
             html += '<option value="{{VIP|nesw}}">警告后无编辑。如用户在获充分警告后继续进行破坏,请回报</option>';
             html += '<option value="{{VIP|4im}}">最近警告不当,4im层级仅适用于严重破坏</option>';
             html += '<option value="{{VIP|ns}}">未获充分警告。如用户已获充分警告并继续进行破坏,请回报</option>';
             html += '<option value="{{VIP|dc}}">拒绝</option>';
             html += '<option value="{{VIP|nv}}">编辑并非破坏。请确保其最近编辑构成破坏后再重新提报</option>';
             html += '<option value="{{VIP|b}}">拒绝,实际情况可能并非如此(机器人)</option>';
             html += '<option value="{{VIP|fp}}">错误提报,编辑并非破坏(机器人)</option>';
             html += '<option value="{{VIP|c}}">编辑争议。请考虑解决争议,或提报至EWIP</option>';
             html += '<option value="{{VIP|np}}">封禁乃用以预防破坏而非惩罚</option>';
             html += '<option value="{{VIP|p}}">已保护页面</option>';
             html += '<option value="{{VIP|d}}">已删除页面</option>';
             html += '<option value="{{VIP|n}}">注意</option>';
             html += '<option value="{{VIP|s}}">疑似共享IP,由多人共用</option>';
             html += '<option value="{{VIP|in}}">注意:IP位址不适合实施永久封禁,请参阅封禁方针</option>';
             html += '<option value="{{VIP|ew}}">此页仅处理破坏,请转此处提报编辑战</option>';
             html += '<option value="{{VIP|a}}">此页仅处理破坏,请转此处提报争议</option>';
             html += '<option value="{{VIP|u}}">此页仅处理破坏,请转此处提报不当用户名</option>';
             html += '<option value="{{VIP|r}}">此页仅处理破坏,请转此处提报保护页面</option>';
             html += '<option value="{{VIP|sp}}">此页仅处理破坏,请转此处提报用户核查</option>';
             html += '<option value="{{VIP|e|X}}">陈旧报告,用户已停止编辑/用户近期已没有编辑X</option>';
             html += '<option value="{{VIP|sn|X}}">报告即时但现已陈旧,用户最后破坏距今已有X。如用户再次进行破坏,请回报</option>';
             html += '<option value="{{VIP|ow|Y}}">陈旧警告,最近警告于Y以前发出</option>';
             html += '<option value="{{VIP|q}}">问题</option>';
             html += '</select><br>';
             html += '留言<br>';
             html += '<input type="text" id="comment" size="40">';
             html += '</div>';
            $(html).dialog({
                title: '关闭报告 - ' + title,
                minWidth: 515,
                minHeight: 150,
                buttons: [{
                    text: '确定',
                    click: function() {
                        if ($(this).find('#comment').val().trim() !== '') {
                            processEdit(key, sectionid, title, $(this).find('#comment').val());
                        } else {
                            mw.notify('动作已取消');
                        }
                        $(this).dialog('close');
                    },
                }, {
                    text: '取消',
                    click: function() {
                        $(this).dialog('close');
                    },
                }],
            });
        });
    }

    function processEdit(key, sectionid, title, comment) {
        api.edit('Wikipedia:当前的破坏', function() {
            var newtext = content[key + 1].trim();
            comment = comment.trim();
            if (comment !== '') {
                if (comment.search(/[.?!;。?!;]$/) === -1) {
                    comment += '。';
                }
                if (newtext.match(/^\*\s*处理:[ \t]*(<!-- 非管理員僅可標記已執行的封禁,針對提報的意見請放在下一行 -->)?[ \t]*$/m)) {
                    newtext = newtext.replace(/^(\*\s*处理:)[ \t]*(<!-- 非管理員僅可標記已執行的封禁,針對提報的意見請放在下一行 -->)?[ \t]*$/m, '$1' + comment + '~~~~');

                } else {
                    newtext += '\n* 处理:' + comment + '~~~~';
                }
            }
            $(titles[key]).find('.close-vip-link').addClass('close-vip-link-closed');
            return {
                text: newtext,
                section: sectionid,
                basetimestamp: basetimestamp,
                starttimestamp: curtimestamp,
                summary: CloseVip.summary,
                minor: true,
            };
        }).then(function() {
            mw.notify('已关闭 ' + title);
         }, function(e) {
             if (e == 'editconflict') {
                 mw.notify('关闭 ' + title + ' 时发生编辑冲突,请重新载入页面', { type: 'error' });
             } else {
                 mw.notify('关闭 ' + title + ' 时发生未知错误:' + e, { type: 'error' });
             }
         });
     }

    getPageContent.then(function(result) {
        content = result.content;
        curtimestamp = result.curtimestamp;
        basetimestamp = result.basetimestamp;

        const SPLIT_TOKEN = 'CLOSE_SPLIT_TOKEN';
        content = content.replace(/^(===[^=])/gm, SPLIT_TOKEN + '$1').split(SPLIT_TOKEN);

        var lenintext = content.length - 1;
        var leninhtml = titles.length;
        if (leninhtml !== lenintext) {
            mw.notify('抓取章节错误,在HTML找到 ' + leninhtml + ' 个三级章节,在源代码找到 ' + lenintext + ' 个三级章节');
        } else {
            showCloseButton();
        }
    });

}
)();
// </nowiki>