User:逆襲的天邪鬼/AutoUndo.js: Difference between revisions

From TestWiki
Content added Content deleted
(via Wikiplus)
(via Wikiplus)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
$(function () {
$(function () {
var DELAY = 5;
var DELAY = 10;
var SUMMARY = '自動回退[[Special:Contributions/$1|$1]]的所有編輯';
var SUMMARY = '自動回退[[Special:Contributions/$1|$1]]的所有編輯';


var uid = null;
var uid = null;


var summary;
var now = null;
var now = null;
var timerId = null;
var timerId = null;
Line 10: Line 11:


var print = function (html) {
var print = function (html) {
$('#content').append($('<p>').html(text));
$('#content').append($('<p>').html(html));
};
};


Line 31: Line 32:


var pageLink = function (page, title) {
var pageLink = function (page, title) {
return '<a href="' + wgScript + '?title=' + page + '">' + (title || page) + '</a>';
return '<a target="_blank" href="' + wgScript + '?title=' + page + '">' + (title || page) + '</a>';
};
};


var undo = function (edits) {
var undo = function (edits) {
var callback = function (edit) {
return function (data) {
if (data.edit && data.edit.result === 'Success') {
print('<span style="color:green">' + '已撤銷頁面 ' + pageLink(edit.title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edit.revid, edit.revid) + '</span>');
} else {
print('<span style="color:red">' + '無法撤銷頁面 ' + pageLink(edit.title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edit.revid, edit.revid) + '</span>');
}
};
};

for (var i=0; i<edits.length; i++) {
for (var i=0; i<edits.length; i++) {
var cb = callback(edits[i]);
$.ajax({
$.ajax({
url: mw.util.wikiScript('api'),
url: mw.util.wikiScript('api'),
Line 43: Line 55:
title: edits[i].title,
title: edits[i].title,
undo: edits[i].revid, // 換成 undoafter 更狠
undo: edits[i].revid, // 換成 undoafter 更狠
minor: true,
bot: true,
summary: summary,
token: mw.user.tokens.get('editToken')
token: mw.user.tokens.get('editToken')
},
},
dataType: 'json',
dataType: 'json',
type: 'POST',
type: 'POST',
}).then(function (data) {
}).then(cb);
if (data.edit && data.edit.result === 'Success') {
print('<span style="color:green">' + '已撤銷頁面 ' + pageLink(edits[i].title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edits[i].revid, edits[i].revid) + '</span>');
} else {
print('<span style="color:red">' + '無法撤銷頁面 ' + pageLink(edits[i].title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edits[i].revid, edits[i].revid) + '</span>');
}
});
}
}
};
};
Line 79: Line 88:
var start = function () {
var start = function () {
$('#content').html('正在監視 ' + uid + ' 的編輯……時間間隔 ' + DELAY + ' 秒。');
$('#content').html('正在監視 ' + uid + ' 的編輯……時間間隔 ' + DELAY + ' 秒。');

summary = SUMMARY.replace(/\$1/g, uid);


timerId = setInterval(monitor, DELAY * 1000);
timerId = setInterval(monitor, DELAY * 1000);

Latest revision as of 13:38, 14 May 2017

$(function () {
    var DELAY = 10;
    var SUMMARY = '自動回退[[Special:Contributions/$1|$1]]的所有編輯';

    var uid = null;

    var summary;
    var now = null;
    var timerId = null;
    var wgScript = mw.config.get('wgScript');

    var print = function (html) {
        $('#content').append($('<p>').html(html));
    };

    var getNewEdits = function (username, time) {
        return $.ajax({
            url: mw.util.wikiScript('api'),
            data: {
                format: 'json',
                action: 'query',
                list: 'usercontribs',
                uclimit: 'max',
                ucstart: new Date(time).toISOString(),
                ucuser: username,
                ucdir: 'newer'
            },
            dataType: 'json',
            type: 'POST',
        });
    };

    var pageLink = function (page, title) {
        return '<a target="_blank" href="' + wgScript + '?title=' + page + '">' + (title || page) + '</a>';
    };

    var undo = function (edits) {
        var callback = function (edit) {
            return function (data) {
                if (data.edit && data.edit.result === 'Success') {
                    print('<span style="color:green">' + '已撤銷頁面 ' + pageLink(edit.title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edit.revid, edit.revid) + '</span>');
                } else {
                    print('<span style="color:red">' + '無法撤銷頁面 ' + pageLink(edit.title) + ' 的修訂版本 ' + pageLink('Special:Diff/' + edit.revid, edit.revid) + '</span>');
                }
            };
        };

        for (var i=0; i<edits.length; i++) {
            var cb = callback(edits[i]);
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    format: 'json',
                    action: 'edit',
                    title: edits[i].title,
                    undo: edits[i].revid,      // 換成 undoafter 更狠
                    minor: true,
                    bot: true,
                    summary: summary,
                    token: mw.user.tokens.get('editToken')
                },
                dataType: 'json',
                type: 'POST',
            }).then(cb);
        }
    };

    var monitor = function () {
        getNewEdits(uid, now).then(function (data) {
            now = new Date().getTime();

            var edits = [];
            if (data.query && data.query.usercontribs) {
                for (var i = 0; i<data.query.usercontribs.length; i++) {
                    var rev = data.query.usercontribs[i];
                    print('新編輯:修訂版本 ' + rev.revid + ' 位置 ' + pageLink(rev.title));
                    edits.push({
                        title: rev.title,
                        revid: rev.revid
                    });
                }
            }

            undo(edits);
        });
    };

    var start = function () {
        $('#content').html('正在監視 ' + uid + ' 的編輯……時間間隔 ' + DELAY + ' 秒。');

        summary = SUMMARY.replace(/\$1/g, uid);

        timerId = setInterval(monitor, DELAY * 1000);
        now = new Date().getTime();
    };

    var stop = function () {
        clearInterval(timerId);
        timerId = null;
        print('已停止。');
    };

    $(mw.util.addPortletLink('p-cactions', '#', '自動跟蹤與回退編輯')).click(function (e) {
        if (timerId !== null) {
            alert('請開新視窗。');
            return;
        }

        uid = prompt('請輸入用戶名。確定之後將會跟蹤此用戶的編輯,並將其全部回退。(之前的編輯請手動回退)');

        if (uid !== null) {
            start();
        }
    });
});