User:Nx/Scripts/Resurrect.js

From RationalWiki
Jump to navigation Jump to search

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/*
  A script that allows instant restoration of pages, bypassing Special:Undelete, but does not allow individually selecting revisions to be restored.
*/

importScript('User:Nx/Scripts/Shared.js');

var resurrecting = false;

function getEditToken() 
{
  var api = sajax_init_object();
  var starttime;
  var edittime;
  var token;
  if (!api) {
    return false;
  }
  api.open("GET",wgServer+wgScriptPath+"/api.php" + 
            "?format=json&action=query&prop=info|revisions&indexpageids=1&intoken=edit&titles=" +
            urlencode(wgPageName), false);
  api.send(null);
  
  if (api.status == 200)
  {
    var d = new Date();
    starttime = d.getUTCFullYear() +
                     pad0(d.getUTCMonth()+1) +
                     pad0(d.getUTCDate()) +
                     pad0(d.getUTCHours()) +
                     pad0(d.getUTCMinutes()) +
                     pad0(d.getUTCSeconds());
    var response = eval('(' + api.responseText + ')');
    var pagei;
    if (response['query']['pageids'][0] == "-1")
    {
      //HACK: page does not exist, get edit token from Talk:Main Page.
      api.open("GET",wgServer+wgScriptPath+"/api.php" + 
                    "?format=json&action=query&prop=info|revisions&indexpageids=1&intoken=edit&titles=Talk:Main_Page",
                    false);
      api.send(null);
      response = eval('(' + api.responseText + ')');
      edittime = starttime;
    } else {
      pagei = response['query']['pages'][response['query']['pageids'][0]];
      edittime = remc(pagei['revisions'][0]['timestamp']);
    }
    pagei = response['query']['pages'][response['query']['pageids'][0]];
    token = urlencode(pagei['edittoken']);
    return {"token":token,"starttime":starttime,"edittime":edittime};
  } else {
    return false;
  }
}

function resurrect()
{
  if (resurrecting) return;
  resurrecting = true;
  var editinfo;
  if ((editinfo = getEditToken()))
  {
    document.getElementById("bodyContent").innerHTML = "<h3>Resurrecting, please wait...</h3>";
    params = "title=Special:Undelete&restore=1&wpComment=[[Help:Scripts#Resurrect|Resurrecting]]&action=submit&target=" + urlencode(wgPageName) + "&wpEditToken=" + editinfo["token"];
    var req = sajax_init_object();
    req.open("POST",wgServer+wgScriptPath+"/index.php",true);
    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    req.setRequestHeader('Connection', 'keep-alive');
    req.setRequestHeader('Content-length', params.length);
    var self = this;
    req.onreadystatechange = function() { 
      if (req.readyState == 4)
      {
        if (req.status == 200)
        {
          var hackdiv = document.createElement("div");
          hackdiv.innerHTML = req.responseText;
          var divs = hackdiv.getElementsByTagName("div");
          for (var i=0;i<divs.length;++i)
          {
            if (divs[i].id == "content")
            {
              document.getElementById("content").innerHTML = divs[i].innerHTML;
              break;
            }
          }
          resurrecting = false;
        } else {
          document.getElementById("bodyContent").innerHTML = "<h3>Error " + req.status + " occurred while restoring the page.</h3>";
        }
      }
    }
    req.send(params);  
  }
}

function resurrect_setup()
{
  var ca_undelete = document.getElementById("ca-undelete");
  if (ca_undelete)
  {
    var ca_resurrect = document.createElement("li");
    ca_resurrect.id = "ca-resurrect";
    ca_resurrect.innerHTML = "<a" + ' href="javascript:resurrect()" title="Restore the page">Resurrect</a>';
    ca_undelete.parentNode.insertBefore(ca_resurrect,ca_undelete);
  }
}

addOnloadHook(resurrect_setup);