Utilisateur:ProméthéeBot/PageAuHasardBOT.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
//{{Boîte déroulante début|titre=[[Utilisateur:ProméthéeBot/PageAuHasardBOT.js]]}}<source lang=javascript>
//<pre><nowiki>
// ############################################################################################################

// Bot de mise à jour des modèles {{Page au hasard}}

// Page de démarrage : [[Utilisateur:ProméthéeBot/Liste PageAuHasard]]

// Voir aussi le gadget : [[MediaWiki:Gadget-PageAuHasard.js]]

// Licence : Domaine public (auteur d'origine : [[Utilisateur:Dr Bot]])

// ############################################################################################################
// ///////////////////////////////////////////////////// VARIABLES /////////////////////////

var PageAuHasardBOT_Adresse = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=";
 
var PageAuHasardBOT_ModeleDefaut = '<noinclude>\n'
                              + '{{Page au hasard\n'
                              + '|page=$1\n'
                              + '|catégorie=$2\n'
                              + '|miseAjour=$3\n'
                              + '|nbArticles=$4\n'
                              + '}}</noinclude>';
 
var PageAuHasardBOT_DebutModele = '<!-- Ce tableau est créé automatiquement par un robot. Page au hasard DEBUT  -->';
 
var PageAuHasardBOT_FinModele = '<!-- Ce tableau est créé automatiquement par un robot. Page au hasard FIN  -->';
 
var PageAuHasardBOT_ResumeModif = 'Bot : [[Utilisateur:ProméthéeBot/PageAuHasardBOT.js|Mise à jour]] du modèle [[Modèle:Page au hasard|{{Page au hasard}}]]';


/* Publication automatique par défaut */
var PageAuHasardBOT_UpdateAll = true;

/* Page de commencement */
var PageAuHasardBOT_UpdateFrom = 1;

/* Renouvellement automatique par défaut */
var PageAuHasardBOT_AutomaticMode = true;


/* Liste des pages à mettre à jour */
var PageAuHasardBOT_ListToUpdate = [];
var PageAuHasardBOT_ListToUpdateCount = -1;

// ///////////////////////////////////////////////////// FONCTION DE REQUÊTE ///////////////
 
var PageAuHasardBOT_ajax = {
  http: function(bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    var xmlhttp;
    try {
      xmlhttp = new XMLHttpRequest(); 
    } catch(e) { 
      try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) { 
        try {
          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
          xmlhttp = false;
        }
      }
    }
 
    if (xmlhttp) {
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4)
          PageAuHasardBOT_ajax.httpComplete(xmlhttp,bundle);
      };
      xmlhttp.open(bundle.method ? bundle.method : "GET",bundle.url,bundle.async === false ? false : true);
      if (bundle.headers) {
        for (var field in bundle.headers)
          try {
            xmlhttp.setRequestHeader(field,bundle.headers[field]);
          } catch(err) {
            //Argos42 : pour rendre LiveRC fonctionnel sur chrome
          }
      }
      xmlhttp.send(bundle.data ? bundle.data : null); 
    }
    return xmlhttp;
  }, 
  httpComplete: function(xmlhttp,bundle) {
    if (xmlhttp.status == 200 || xmlhttp.status == 302) {
      if (bundle.onSuccess)
        bundle.onSuccess(xmlhttp,bundle);
    } else if (bundle.onFailure) {
      bundle.onFailure(xmlhttp,bundle);
 
    } else {
      // A activer en debug mode ?
         //  alert(xmlhttp.status+xmlhttp.responseText);
    }
  }
};

// ///////////////////////////////////////////////////// LANCEMENT /////////////////////////

if ((mw.config.get('wgAction') === 'view' || mw.config.get('wgAction') === 'purge') &&(mw.config.get('wgPageName').indexOf("/Liste_PageAuHasard")!=-1)) {
     jQuery( function( $ ) {
     	PageAuHasardBOT_addLinks();
     } );
}

// ///////////////////////////////////////////////////// CRÉATION DES LIENS /////////////////////////

function PageAuHasardBOT_addLinks(){
     var buttonDiv = document.getElementById("ListToUpdate_Run");
     if(buttonDiv){
          var link = '<a href="javascript:PageAuHasardBOT_RunAll();" title="Lancer la mise à jour de toutes les pages de la liste">' + buttonDiv.innerHTML + '</a>';
          buttonDiv.innerHTML = link;
     }
     var listDiv = document.getElementById("ListToUpdate");
     if(listDiv && listDiv.innerHTML.indexOf("<img")==-1){
          var Count = -1;
          var Liens = listDiv.getElementsByTagName('a');
          for(var a=0;a<Liens.length;a++){
               if(Liens[a].href.indexOf("javascript:")==-1){
                    Count++;
                    Liens[a].id = "LinkToUpdate_"+Count;
                    var UpdateLink = document.createElement('a');
                    UpdateLink.href = "javascript:PageAuHasardBOT_RunOne("+Count+");";
                    UpdateLink.title = "Lancer la mise à jour";
                    UpdateLink.innerHTML = '<img height="15" width="15" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Crystal_Clear_action_exit.svg/50px-Crystal_Clear_action_exit.svg.png" alt="Lancer la mise à jour de cette page">';
                    Liens[a].parentNode.insertBefore(UpdateLink, Liens[a]);
                    a++;
                    Liens[a].parentNode.insertBefore(document.createTextNode(' - '), Liens[a]);
               }
          }
     }
     var NewPagesDiv = document.getElementById("ListToUpdate_CheckNewPages");
     if(NewPagesDiv){
          var NewPageLink = '<a href="javascript:PageAuHasardBOT_CheckNewPages();" title="Rechercher de nouvelles pages à mettre à jour">' + NewPagesDiv.innerHTML + '</a>';
          NewPagesDiv.innerHTML = NewPageLink;
     }
     /*if(mw.config.get('wgUserGroups').indexOf('bot')!=-1){
          PageAuHasardBOT_RunAll();
          setTimeout("window.location.reload();", 1000*3600);
     }*/
}

// ///////////////////////////////////////////////////// PRÉPARATION MISE À JOUR 1 PAGE /////////////////////////

function PageAuHasardBOT_RunOne(Count){
     var Link = document.getElementById("LinkToUpdate_"+Count);
     if(Link){
          PageAuHasardBOT_UpdateAll = false;
          PageAuHasardBOT_ListToUpdateCount++;
          PageAuHasardBOT_ListToUpdate[PageAuHasardBOT_ListToUpdateCount] = Link.innerHTML;
          PageAuHasardBOT_Update(0);
     }
}

// ///////////////////////////////////////////////////// PRÉPARATION MISE À JOUR TOUTES LES PAGES /////////////////////////

function PageAuHasardBOT_RunAll(){
     var listDiv = document.getElementById("ListToUpdate");
     if(listDiv){
          if(mw.config.get('wgUserGroups').indexOf('bot')==-1){
               PageAuHasardBOT_UpdateAll = confirm('Publication automatique ?');
               PageAuHasardBOT_UpdateFrom = prompt('Commencer à quelle page ?','1');
               if((!PageAuHasardBOT_UpdateFrom)||(PageAuHasardBOT_UpdateFrom==='')) PageAuHasardBOT_UpdateFrom = 1;
               PageAuHasardBOT_UpdateFrom = parseInt(PageAuHasardBOT_UpdateFrom);
               if(PageAuHasardBOT_UpdateFrom<1) PageAuHasardBOT_UpdateFrom = 1;
               PageAuHasardBOT_AutomaticMode = confirm('Renouvellement automatique ?');
          }
          var Liens = listDiv.getElementsByTagName('a');
          for(var a=0;a<Liens.length;a++){
               if(Liens[a].href.indexOf("javascript:")==-1){
                    PageAuHasardBOT_ListToUpdateCount++;
                    PageAuHasardBOT_ListToUpdate[PageAuHasardBOT_ListToUpdateCount] = Liens[a].innerHTML;
               }
          }
          PageAuHasardBOT_Update((PageAuHasardBOT_UpdateFrom-1));
     }
}

// ///////////////////////////////////////////////////// REQUÊTE PAGE À METTRE À JOUR /////////////////////////

function PageAuHasardBOT_Update(position){
     if(!position) position=0;
     var Page = PageAuHasardBOT_ListToUpdate[position];
     if(!Page){
          if(PageAuHasardBOT_AutomaticMode&&PageAuHasardBOT_UpdateAll){
               position=0;
               PageAuHasardBOT_Update(position);
               return;
          }else{
               alert('Travail terminé !');
               window.location.reload();
          }
     }
     PageAuHasardBOT_ajax.http({ url: PageAuHasardBOT_Adresse + encodeURIComponent(Page) + '&action=render',
                onSuccess: PageAuHasardBOT_UpdateDone,
                position:position 
                });
}

function PageAuHasardBOT_UpdateDone(Req, data){
     var position = data.position;
     var Page = PageAuHasardBOT_ListToUpdate[position];
     while(document.body.firstChild){document.body.removeChild(document.body.firstChild);}  
     document.body.innerHTML = '<center><h1 id="firstHeading" class="firstHeading" >'
                             + (position+1) + '/' + PageAuHasardBOT_ListToUpdate.length +' : '+ Page
                             + '</h1></center>'
                             + Req.responseText;
     window.scrollTo(0,0);
     var Cadres = document.getElementsByTagName('span');
     for(var s=0;s<Cadres.length;s++){
          if( $(Cadres[s]).hasClass('RandomLink') ){          
               var ParamCategorie = Cadres[s].firstChild.innerHTML;
               var ParamPage = Cadres[s].firstChild.title;
          }
     }
     if(!ParamCategorie || !ParamPage){
          if(!ParamCategorie) alert('Manque paramètre « ParamCategorie »'); 
          if(!ParamPage) alert('Manque paramètre « ParamPage »'); 
          return;
     }
     PageAuHasardBOT_CheckCategory({paramposition    : position, 
                                    paramPage        : ParamPage, 
                                    paramCategorie   : ParamCategorie, 
                                    paramNewCategory : new Array()
                                   });
}

// ///////////////////////////////////////////////////// REQUÊTE PAGES DE LA CATÉGORIE /////////////////////////

function PageAuHasardBOT_CheckCategory(Args){
      var APILimit = ( ((mw.config.get('wgUserGroups').indexOf("sysop")!=-1)||(mw.config.get('wgUserGroups').indexOf("bot")!=-1)) ? 4999 : 499 );
      var URL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&list=categorymembers&rawcontinue=1&cmlimit='+APILimit+'&cmtitle=' + encodeURIComponent(Args.paramCategorie) + (Args.paramContinue ? Args.paramContinue : '');
      //alert(URL);
      PageAuHasardBOT_ajax.http({ url: URL,
                onSuccess: PageAuHasardBOT_CheckCategoryDone,
                args:Args
                });
}

function PageAuHasardBOT_CheckCategoryDone(Req, data){
      var Args = data.args;
      var ObjetXML = Req.responseXML; 
      var Pages = ObjetXML.getElementsByTagName('cm');
      for(a=0;a<Pages.length;a++){
            var TitrePage = Pages[a].getAttribute('title');
            var NS = Pages[a].getAttribute('ns');
            if(NS=="0"){
                  Args.paramNewCategory.push(TitrePage);
            }
      }
      var AutreRequeteNecessaire = ObjetXML.getElementsByTagName('query-continue')[0];
      if(AutreRequeteNecessaire){
            Args.paramContinue = '&cmcontinue=' + encodeURIComponent(AutreRequeteNecessaire.getElementsByTagName('categorymembers')[0].getAttribute('cmcontinue'));
            PageAuHasardBOT_CheckCategory(Args);
      }else{
            PageAuHasardBOT_ajax.http({ url      : PageAuHasardBOT_Adresse + encodeURIComponent(Args.paramPage) + '&action=edit',
                                        onSuccess: PageAuHasardBOT_Edit,
                                        args:Args
            });
      }
}

// ///////////////////////////////////////////////////// ÉDITION /////////////////////////

function PageAuHasardBOT_Edit(Req, data){
      var Args = data.args;
      var position = Args.paramposition;
      var ParamPage = Args.paramPage;
      var ParamCategorie = Args.paramCategorie;
      var NewCategory = Args.paramNewCategory;
      while(document.body.firstChild){document.body.removeChild(document.body.firstChild);}  
      document.body.innerHTML = Req.responseText;
      var wpSave = document.getElementById("wpSave");
      if(!wpSave){
            PageAuHasardBOT_Update((position+1));
            return;
      }
      var ContenuPage = document.getElementById("wpTextbox1").value;
      var AncienResumeModif = document.editform.wpSummary.value;

      var Aujourdhui = new Date();
      var Minutes   = Aujourdhui.getMinutes()
      if(Minutes<10){ var ZeroMinutes = "0" ; }else{ var ZeroMinutes = "";}
      var Heures   = Aujourdhui.getHours()
      if(Heures<10){ var ZeroHeures = "0" ; }else{ var ZeroHeures = "";}
      var Jour   = Aujourdhui.getDate();
      if(Jour<10){ var ZeroJour = "0" ; }else{ var ZeroJour = "";}
      var Mois = Aujourdhui.getMonth() + 1;
      if(Mois<10){ var ZeroMois = "0" ; }else{ var ZeroMois = "";}
      var Annee  = Aujourdhui.getYear();
      if (Annee < 2000){
            Annee = Annee + 1900;
      }
      var NoNeedUpdate = true;
      var PageAuHasardBOT_miseAjour = 'le '+ZeroJour+Jour+'/'+ZeroMois+Mois+'/'+Annee+' à '+ZeroHeures+Heures+':'+ZeroMinutes+Minutes;
      var PageAuHasardBOT_TotalArticles = NewCategory.length;
      var NouveauModele = PageAuHasardBOT_ModeleDefaut;
      NouveauModele = NouveauModele.split('$1').join(ParamPage);
      NouveauModele = NouveauModele.split('$2').join(ParamCategorie);
      NouveauModele = NouveauModele.split('$3').join(PageAuHasardBOT_miseAjour);
      NouveauModele = NouveauModele.split('$4').join(PageAuHasardBOT_TotalArticles);
      NouveauModele += PageAuHasardBOT_DebutModele + '<includeonly>{{#invoke:random|item';
      for(a=0;a<NewCategory.length;a++){
            var Match = NewCategory[a].replace(/=/g, '{{=}}')
            if(ContenuPage.indexOf(Match)==-1) NoNeedUpdate = false;
            NouveauModele += '|'+Match;
      }
      NouveauModele += '|link=yes}}</includeonly>' + PageAuHasardBOT_FinModele;

      var SommaireFinal = AncienResumeModif + PageAuHasardBOT_ResumeModif;
      document.getElementById("wpTextbox1").value = NouveauModele;
      document.editform.wpSummary.value = SommaireFinal ;
      document.editform.wpMinoredit.checked = "checked";
      document.editform.wpWatchthis.checked = "checked";
      if(NoNeedUpdate){
            PageAuHasardBOT_Update((position+1));
            return;
      }
      if(!PageAuHasardBOT_UpdateAll){
            var SurEtCertain = confirm('Sauvegarder la modification ?');
            if(!SurEtCertain) return;
      }
      var EditForm = document.editform
      var EditParam = new Array();
      EditParam["token"] = encodeURIComponent(EditForm.wpEditToken.value);
      EditParam["title"] = encodeURIComponent(ParamPage);
      EditParam["watchlist"] = "nochange";
      EditParam["minor"] = "1";
      if(mw.config.get('wgUserGroups').indexOf("bot")!=-1) EditParam["bot"] = "";
      EditParam["summary"] = encodeURIComponent(SommaireFinal);
      EditParam["text"] = encodeURIComponent(NouveauModele);
 
      var Params = new Array();
      for(var Param in EditParam){
            if(EditParam[Param] || EditParam[Param]=="") Params.push(Param+"="+EditParam[Param]);
      }
      Params = Params.join("&");
      //alert(Params);
      var headers = new Array();
      headers['Content-Type'] = 'application/x-www-form-urlencoded';
      PageAuHasardBOT_ajax.http({ url       : mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=edit',
                                  method    : "POST", 
                                  headers   : headers, 
                                  data      : Params,
                                  onSuccess : PageAuHasardBOT_EditDone,
                                  position  : position
      });
}

function PageAuHasardBOT_EditDone(Req, data){
     PageAuHasardBOT_Update((data.position+1));
}

function PageAuHasardBOT_CheckNewPages(){
     var listDiv = document.getElementById("ListToUpdate");
     if(listDiv){
          var OldPages = new Array();
          var Liens = listDiv.getElementsByTagName('a');
          for(var a=0;a<Liens.length;a++){
               if(Liens[a].href.indexOf("javascript:")==-1){
                    OldPages.push(Liens[a].innerHTML);
               }
          }
          PageAuHasardBOT_GetTransclusions(OldPages);
     }
}

function PageAuHasardBOT_GetTransclusions(OldPages, ActualPages, GetContinue){
     if(!ActualPages) ActualPages = new Array();
     if(!GetContinue) GetContinue = "";
     var APILimit = ( ((mw.config.get('wgUserGroups').indexOf("sysop")!=-1)||(mw.config.get('wgUserGroups').indexOf("bot")!=-1)) ? 4999 : 499 );
     var AdresseRequete = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&list=embeddedin&rawcontinue=1&eilimit='+APILimit+'&einamespace=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|100|101|102|103|104|105&eititle=Modèle:Page au hasard' + GetContinue;
     var NouvelleRequete = new XMLHttpRequest()
     NouvelleRequete.open("GET", AdresseRequete, true);
     NouvelleRequete.onreadystatechange = function() {
          if(NouvelleRequete.readyState != 4) return; 
          var ObjetXML = NouvelleRequete.responseXML;
          var Pages = ObjetXML.getElementsByTagName('ei');
          for(var a=0;a<Pages.length;a++){
               ActualPages.push(Pages[a].getAttribute('title'));
          }
          var QueryContinue = ObjetXML.getElementsByTagName('query-continue')[0];
          if(QueryContinue){
               var EContinue = '&eicontinue=' + QueryContinue.getElementsByTagName('embeddedin')[0].getAttribute('eicontinue');
               PageAuHasardBOT_GetTransclusions(OldPages, ActualPages, EContinue);
          }else{
               var NewPages = new Array();
               for(var b=0;b<ActualPages.length;b++){
                    var Match = false;
                    for(var c=0;c<OldPages.length;c++){
                         if(OldPages[c] == ActualPages[b]) Match = true;
                    }
                    if(!Match) NewPages.push(ActualPages[b]);
               }
               if(NewPages.length == 0){
                    alert('Pas de nouvelles pages à mettre à jour');
                    return;
               }
               var Div = document.getElementById("ListToUpdate_CheckNewPages");
               if(Div){
                    var List = document.createElement('ol');
                    for(var i=0;i<NewPages.length;i++){
                         var Li = document.createElement('li');
                         var A = document.createElement('a');
                         A.href = mw.config.get('wgServer') + mw.config.get('wgArticlePath').split('$1').join(NewPages[i]);
                         A.title = NewPages[i]
                         A.appendChild(document.createTextNode(NewPages[i]));
                         Li.appendChild(document.createTextNode("[["));
                         Li.appendChild(A);
                         Li.appendChild(document.createTextNode("]]"));
                         List.appendChild(Li);
                    }
                    Div.appendChild(List);
               }else{               
                    alert('Nouvelles pages :\n\n' + NewPages.join('\n') );
               }
          }
     }
     NouvelleRequete.send(null);
}
// ///////////////////////////////////////////////////// NETTOYAGE RÉSULTATS REQUÊTE /////////////////////////

function PageAuHasardBOT_Clean(text){
      while(text.indexOf('&amp;')!=-1){
            text = text.split('&amp;').join("&");
            if(text.indexOf('&amp;')==-1) break;
      }
      while(text.indexOf('&#039;')!=-1){
            text = text.split('&#039;').join("'");
            if(text.indexOf('&#039;')==-1) break;
      }
      while(text.indexOf('&quot;')!=-1){
            text = text.split('&quot;').join('"');
            if(text.indexOf('&quot;')==-1) break;
      }
      while(text.indexOf('&nbsp;')!=-1){
            text = text.split('&nbsp;').join(' ');
            if(text.indexOf('&nbsp;')==-1) break;
      }  
      return text;
}

// ############################################################################################################
//</nowiki></pre></source>{{Boîte déroulante fin}}