หมายเหตุ: หลังเผยแพร่ คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง

  • ไฟร์ฟอกซ์ / ซาฟารี: กด Shift ค้างขณะคลิก Reload หรือกด Ctrl-F5 หรือ Ctrl-R (⌘-R บนแมค)
  • กูเกิล โครม: กด Ctrl-Shift-R (⌘-Shift-R บนแมค)
  • อินเทอร์เน็ตเอกซ์พลอเรอร์ และ Edge: กด Ctrl ค้างขณะคลิก Refresh หรือกด Ctrl-F5
  • โอเปร่า: กด Ctrl-F5
// ========================================================
// สคริปต์จัดให้: revert module
//
// Copyright (C) 2006-2021, Jutiphan Mongkolsuthree
// 2021, Bebiezaza
// Certain functions are copyrighted by their
// respective copyright holders
//
// Created: 25/02/2007
// Rewritten: 28/10/2021
// Replaced: original twinklefluff
//
// Additional Credits Information:
// ==============================================================
// Original code taken from Wikipedia:WikiProject User scripts/Scripts/Twinkle
// [[User:AzaToth/twinklefluff.js]]
// ========================================================
/* <pre><nowiki> */

var revertWhitelist = ['BotKung', 'TBot', 'JBot', 'NongBot', 'Chobot', 'Escarbot', 'Idioma-bot', 'Nullzerobot', 'Robbot', 'RoboDick', 'SieBot', 'Thijs!bot', 'TuvicBot', 'VolkovBot', 'YurikBot', 'Zwobot', 'InternetArchiveBot'];

function getRevertInfo(revID) {
    var info;
    $.ajax({
        url: mw.util.wikiScript('api'),
        dataType: 'json',
        async: false,
        data: {
            format: 'json',
            action: 'query',
            prop: 'revisions',
            indexpageids: true,
            revids: revID,
            rvprop: 'ids|user|content',
            rvslots: 'main'
        },
        success: function(data) {
            var id = data.query.pageids[0];
            if (id == -1) {
                info = "";
            } else {
                info = {
                    title: data.query.pages[id].title,
                    revid: data.query.pages[id].revisions[0].revid,
                    user: data.query.pages[id].revisions[0].user,
                    content: data.query.pages[id].revisions[0].slots.main['*']
                };
            }
        }
    });
    return info;
}

function getRollbackInfo(pageName) {
    var info = [];
    $.ajax({
        url: mw.util.wikiScript('api'),
        dataType: 'json',
        async: false,
        data: {
            format: 'json',
            action: 'query',
            prop: 'revisions',
            indexpageids: true,
            titles: pageName,
            rvprop: 'ids|user',
            rvlimit: 50
        },
        success: function(data) {
            var id = data.query.pageids[0];
            if (id == -1) {
                info = "";
            } else {
                for (var i in data.query.pages[id].revisions) {
                    var parser = {
                        revid: data.query.pages[id].revisions[i].revid,
                        user: data.query.pages[id].revisions[i].user
                    }
                    info.push(parser);
                }
            }
        }
    });
    return info;
}

function revertToRevision(diffVersion) {
    if (diffVersion = "old") var link = document.querySelector("#mw-diff-otitle1 a").href;
    else if (diffVersion = "new") var link = document.querySelector("#mw-diff-ntitle1 a").href;
    else return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาดที่ไม่คาดคิด ยกเลิกการย้อน<br>กรุณาตรวจสอบและลองใหม่อีกครั้ง</span>'));

    var reason = prompt("กรุณาระบุสาเหตุที่ต้องการย้อนการแก้ไข (เว้นว่างหากไม่ระบุ):                      ", ""); // padded out to widen prompt in Firefox
    if (reason === null) return mw.notify($('<span class="revert_status_warn">ยกเลิกการย้อนแล้ว<br>ยกเลิกโดยผู้ใช้</span>'));

    mw.notify($('<span class="revert_status_status">กำลังดึงข้อมูลรุ่นก่อนหน้านี้</span>'));
    var revID = link.slice(link.lastIndexOf("oldid") + 6);
    var revertInfo = getRevertInfo(revID);

    if (mw.config.get('wgPageName') !== revertInfo.title.replace(/ /ig, "_")) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมาไม่เป็นของหน้าที่กำลังย้อน ยกเลิกการย้อน</span>'));
    else if (revID != revertInfo.revid) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมา ไม่ตรงกับรุ่นที่ต้องการ ยกเลิกการย้อน</span>'));
    
    var userInfo = "[[Special:Contributions/" + revertInfo.user + "|" + revertInfo.user + "]] ([[User talk:" + revertInfo.user + "|พูดคุย]])";
    var summary = "ย้อนกลับไปรุ่นที่ " + revID + " โดย " + userInfo + " " + iScriptConfig.Tagline;
    if (reason) summary += ": " + reason;

    // push source
    mw.notify($('<span class="revert_status_status">ดึงข้อมูลรุ่นก่อนหน้านี้สำเร็จ<br>กำลังบันทึกไปที่หน้า "' + revertInfo.title + '" กรุณารอสักครู่...</span>'));
    iScriptAPI.editPage(revertInfo.title, revertInfo.content, summary, false, false);
}

function rollback(type) {
    var pageName = mw.config.get('wgPageName');
    var revID = mw.config.get('wgCurRevisionId');

    mw.notify($('<span class="revert_status_status">กำลังดึงข้อมูลรุ่นก่อนหน้านี้</span>'));
    var rollbackInfo = getRollbackInfo(pageName);

    if (revID != rollbackInfo[0].revid) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมา ไม่ตรงกับรุ่นที่ต้องการ ยกเลิกการย้อน</span>'));

    if (revertWhitelist.indexOf(rollbackInfo[0].user) !== -1) {
        if (type == "agf") return mw.notify($('<span class="revert_status_warn">คุณได้เลือกย้อนเจตนาดีของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติและมีเจตนาดีโดยเสมอ หากพบว่าการแก้ไขบอตไม่ถูกต้อง และต้องการย้อนกลับ ให้เลือกการย้อนปกติแทน</span>'));
        else if (type == "norm") {
            var rollbackBot = confirm('การแก้ไขล่าสุดเป็นของ ' + rollbackInfo[0].user + ' ซึ่งเป็นบอตที่ได้รับการอนุมัติ คุณต้องการย้อนการแก้ไขของผู้ใช้ก่อนหน้านี้ (OK) หรือการแก้ไขของบอต (Cancel)');
            if (rollbackBot) {
                rollbackInfo.shift();
                mw.notify($('<span class="revert_status_confirm">ตามที่คุณยืนยัน เราจะทำการย้อนการแก้ไขไปรุ่นก่อนการแก้ไขของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span></span>'));
            } else mw.notify($('<span class="revert_status_warn">คุณได้ยืนยันย้อนการแก้ไขของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติ แต่คุณยืนยันจึงดำเนินการต่อ</span>'));
        } else if (type == "vand") {
            mw.notify($('<span class="revert_status_confirm">คุณได้เลือกให้ย้อนการก่อกวนของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติ โดยเราเชื่อว่าคุณต้องการย้อนกลับการแก้ไขของผู้ใช้ก่อนหน้านี้แทน</span>'));
            rollbackInfo.shift();
        }
    }

    var offender = rollbackInfo[0].user;
    var revertToInfo;
    var revisionCount = -1;
    for (var i in rollbackInfo) {
        revisionCount++;
        if (rollbackInfo[i].user != offender) {
            revertToInfo = {
                revid: rollbackInfo[i].revid,
                user: rollbackInfo[i].user
            };
            break;
        }
    }

    if (!revertToInfo) return mw.notify($('<span class="revert_status_warn">ขออภัย ไม่พบเจอรุ่นที่จะย้อนกลับ หยุดดำเนินการ อาจเป็นเพราะว่า ' + rollbackInfo[0].user + ' เป็นผู้แก้ไขหน้านี้แต่เพียงผู้เดียว หรือได้แก้ไขติดต่อกันมากกว่า 50 ครั้ง</span>'));

    // from here, we use modified revert code
    var revertInfo = getRevertInfo(revertToInfo.revid);

    if (mw.config.get('wgPageName') !== revertInfo.title.replace(/ /ig, "_")) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมาไม่เป็นของหน้าที่กำลังย้อน ยกเลิกการย้อน</span>'));
    
    var offenderInfo = "[[Special:Contributions/" + offender + "|" + offender + "]] ([[User talk:" + offender + "|พูดคุย]])";
    var summary;
    if (type == "agf") {
        summary = "ย้อนการแก้ไข[[WP:AGF|เจตนาดี]]ของ " + offenderInfo + " " + iScriptConfig.Tagline;
    } else if (type == "norm") {
        summary = "ย้อน " + revisionCount + " การแก้ไขของ " + offenderInfo + " ไปยังการแก้ไขของ " + revertToInfo.user + " " + iScriptConfig.Tagline;
    } else if (type == "vand") {
        summary = "ย้อน[[WP:VAND|การก่อกวน]] " + revisionCount + " ครั้งของ " + offenderInfo + " ไปยังรุ่นโดย " + revertToInfo.user + " " + iScriptConfig.Tagline;
    }
    
    if (type == "agf" || type == "norm") {
        var reason = prompt("กรุณาระบุสาเหตุที่ต้องการย้อนการแก้ไข (เว้นว่างหากไม่ระบุ):                      ", ""); // padded out to widen prompt in Firefox
        if (reason === null) return mw.notify($('<span class="revert_status_warn">ยกเลิกการย้อนแล้ว<br>ยกเลิกโดยผู้ใช้</span>'));
    }
    if (reason) summary += ": " + reason;

    // push source
    mw.notify($('<span class="revert_status_status">ดึงข้อมูลรุ่นก่อนหน้านี้สำเร็จ<br>กำลังบันทึกไปที่หน้า "' + revertInfo.title + '" กรุณารอสักครู่...</span>'));
    iScriptAPI.editPage(revertInfo.title, revertInfo.content, summary, false, false);
}

function makeTwinkleLink(color, text) {
    var before = createElement('span', "[", {
        'style': "color: black;"
    });
    var main = createElement('span', text, {
        'style': "color: " + color + ";"
    });
    var after = createElement('span', "]", {
        'style': "color: black;"
    });
    var link = createElement('a', [before, main, after], {
        'href': "#",
        'style': "font-weight: bold;"
    });
    return link;
}

function twinkleStarter() {
    if (!document.getElementById('mw-diff-otitle1') || !document.getElementById('mw-diff-ntitle1')) return;
    var diffOld = document.getElementById('mw-diff-otitle1').parentNode;
    var diffNew = document.getElementById('mw-diff-ntitle1').parentNode;

    var revertToOld = createElement('div', makeTwinkleLink("SaddleBrown", "ย้อนกลับมาเป็นรุ่นนี้"), { 'id': "iS-tw-revert-orevision" });

    diffOld.insertBefore(revertToOld, diffOld.firstChild);
    
    if (document.getElementById('differences-nextlink')) {
        var revertToNew = createElement('div', makeTwinkleLink("SaddleBrown", "ย้อนกลับมาเป็นรุ่นนี้"), { 'id': "iS-tw-revert-nrevision" });
        diffNew.insertBefore(revertToNew, diffNew.firstChild);
    } else {
        var rollbackAGF = createElement('span', makeTwinkleLink("DarkOliveGreen", "ย้อนเจตนาดี"), { 'id': "iS-tw-rollback-agf" });
        var rollbackNorm = createElement('span', makeTwinkleLink("SteelBlue", "ย้อน"), { 'id': "iS-tw-rollback-normal" });
        var rollbackVand = createElement('span', makeTwinkleLink("Red", "ย้อนก่อกวน"), { 'id': "iS-tw-rollback-vand" });

        var rollbackButton = createElement('div', [rollbackAGF, " || ", rollbackNorm, " || ", rollbackVand], { 'id': "iS-tw-revert" });
        diffNew.insertBefore(rollbackButton, diffNew.firstChild);
    }

    $(revertToOld).click(function() { 
        revertToRevision("old");
    });
    $(revertToNew).click(function() { 
        revertToRevision("new");
    });
    $(rollbackAGF).click(function() { 
        rollback("agf");
    });
    $(rollbackNorm).click(function() { 
        rollback("norm");
    });
    $(rollbackVand).click(function() { 
        rollback("vand");
    });
}

$(document).ready(function() {
    if (mw.config.get('wgIsProbablyEditable')) {
        twinkleStarter();
    }
});