MediaWiki:Gadget-C helper message.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.
//<nowiki>

/* jshint esversion: 8 */
/* globals mw, $, C */

C.message = {
  dialog: null,
  config: {
    'modal-title': 'C helper - Informer un utilisateur',
    'submit': 'Valider la requête',
    'c-message-checkbox-class': 'c-message-checkbox',
    'notify-success': 'Les messages ont bien été ajoutés.',
    'notify-not-a-page': 'Impossible d\'ajouter un message à un utilisateur depuis cette page.',
    'page-input-help': 'De nombreux modèles font référence à la page où le problème a eu lieu ; C-helper n\'a pas réussi à la déterminer automatiquement, veuillez donc la préciser manuellement si nécessaire.',
    'subst-checkbox-help': 'Cette case doit rester cochée dans la plupart des cas.',
    'add-summary': '$1',
    'template-link-summary': '$1',
  },
categories: [
    {display:"Souhaiter la bienvenue", node:null}, //0
    {display:"Maladresses", node:null},    //1
    {display:"Vandalisme", node:null},    //2
    {display:"Suggestion", node:null},    //3
    {display:"Liens externes", node:null},    //4
    {display:"Copyvio", node:null},    //5
    {display:"Avertissement supression", node:null},    //6
    {display:"Aide", node:null},    //7
  ],
  /*
    {category:, display:'', template:'', help:'', reason:'', page:'', diff:''},
    Magic words :
        * $(page)
        * $(diff)
        * $(user)
        * $(day) $(month) $(year)
        * $(reason)
        * $(extra)
  */
  templates: [
    {category:0, display:'Bienvenue nouveau', template:'Bienvenue nouveau|$(user)|message=$(extra)', extra:'Ajouter un message personnel (facultatif) :', help:''},
    {category:0, display:'Bienvenue IP', template:'Bienvenue IP', help:''},
    {category:0, display:'Bienvenue IP méritante', template:'Bienvenue IP méritante|$(user)|message=$(extra)', extra:'Ajouter un message personnel (facultatif) :', help:''},
    {category:1, display:'Test 0', template:'Test 0|$(page)|$(diff)|autre=$(extra)|user=$(user)', extra:'Type de maladresse (facultatif) :', help:''},
    {category:1, display:'Test ?', template:'Test ?|$(page)|$(diff)', help:''},
    {category:1, display:'Ajout POV', template:'Ajout POV|$(page)|user=$(user)', help:''},
    {category:1, display:'Non-encyclo', template:'Non-encyclo|user=$(user)', help:''},
    {category:1, display:'Retrait injustifié', template:'Retrait injustifié|$(page)|user=$(user)', help:''},
    {category:1, display:'Ortho', template:'Ortho|$(page)|user=$(user)', help:''},
    {category:1, display:'Signature', template:'Signature', help:''},
    {category:1, display:'Traduction automatique', template:'Traduction automatique|$(page)|user=$(user)', help:''},
    {category:1, display:'No ref wiki', template:'No ref wiki|$(page)|user=$(user)', help:''},
    {category:1, display:'PU brouillon', template:'PU brouillon', help:''},
    {category:1, display:'Compte publicitaire', template:'Compte publicitaire', help:''},
    {category:1, display:'Conflit d\'intérêts', template:'Conflit d\'intérêts|$(page)', help:''},
    {category:1, display:'Bienvenue autobiographie', template:'Bienvenue autobiographie|$(page)|$(extra)', extra:'Message à la fin du modèle', help:''},
    {category:1, display:'Suppr Bandeaux', template:'Suppr Bandeaux|$(page)', help:''},
    {category:2, display:'Test 1', template:'Test 1|$(page)', help:''},
    {category:2, display:'Test 2', template:'Test 2', help:''},
    {category:2, display:'Test 3', template:'Test 3', help:''},
    {category:2, display:'Test 4', template:'Test 4', help:''},
    {category:2, display:'Faux décès', template:'Faux décès|$(page)', help:''},
    {category:2, display:'Faux décès 2', template:'Faux décès 2|$(page)', help:''},
    {category:2, display:'Pas un forum', template:'Pas un forum|$(page)', help:''},
	{category:2, display:'Pas un forum 2', template:'Pas un forum 2|$(page)', help:''},
    {category:2, display:'U-R3R', template:'U-R3R|$(page)', help:''},
    {category:2, display:'U-R3R-2', template:'U-R3R-2|$(page)', help:''},
    {category:2, display:'Vandalisme cracra', template:'Vandalisme cracra', help:''},
    {category:3, display:'Faut sourcer', template:'Faut sourcer|$(page)|user=$(user)', help:''},
    {category:3, display:'Faut sourcer 2', template:'Faut sourcer 2|$(page)', help:''},
    {category:3, display:'Motivation modif', template:'Motivation modif|$(page)|user=$(user)', help:''},
    {category:3, display:'Contributions promotionnelles', template:'Contributions promotionnelles|$(page)', help:''},
    {category:3, display:'Contributions rémunérées rappel', template:'Contributions rémunérées rappel|$(page)', help:''},
    {category:3, display:'Nom d\'utilisateur connu', template:'Nom d\'utilisateur connu', help:''},
    {category:3, display:'Bienvenue nom d\'utilisateur', template:'Bienvenue nom d\'utilisateur', help:''},
    {category:4, display:'Bienvenue spammeur', template:'Bienvenue spammeur|$(page)|user=$(user)', help:''},
    {category:4, display:'Bienvenue spammeur 2', template:'Bienvenue spammeur 2|$(page)', help:''},
    {category:4, display:'Bienvenue spammeur 3', template:'Bienvenue spammeur 3|$(page)', help:''},
    {category:4, display:'Unique avertissement spammeur', template:'Bienvenue spammeur 4|$(page)|user=$(user)', help:''},
    {category:4, display:'LE HC', template:'LE HC|$(page)|user=$(user)', help:''},
    {category:4, display:'LE dans texte', template:'LE dans texte|$(page)|user=$(user)', help:''},
    {category:5, display:'Avertissement Copyvio', template:'Avertissement Copyvio|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
    {category:5, display:'Avertissement Copyvio Synopsis', template:'Avertissement Copyvio Synopsis|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
    {category:5, display:'Dernier avertissement Copyvio', template:'Dernier avertissement Copyvio|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
    {category:5, display:'Unique avertissement Copyvio', template:'Bienvenue Copyvio 4|$(page)|$(extra)', extra:'Site copié (facultatif) :', help:''},
    {category:6, display:'Averto sursis', template:'Averto sursis|$(page)|$(extra)', extra:'Raison :', help:''},
    {category:6, display:'BSI CAA', template:'BSI CAA|$(page)', help:''},
    {category:6, display:'BSI BàS', template:'BSI BàS|$(page)|user=$(user)', help:''},
    {category:6, display:'BSI promo', template:'BSI promo|$(page)|user=$(user)', help:''},
    {category:6, display:'BSI canular', template:'BSI canular|$(page)|user=$(user)', help:''},
    {category:6, display:'BSI doublon', template:'BSI doublon|$(page)|$(extra)|user=$(user)', extra:'Titre de l\'article en double :', help:''},
    {category:6, display:'BSI vandalisme', template:'BSI vandalisme|$(page)', help:''},
    {category:6, display:'Bienvenue SI 2', template:'Bienvenue SI 2', help:''},
    {category:6, display:'Bienvenue SI 3', template:'Bienvenue SI 3', help:''},
    {category:6, display:'Bienvenue SI 4', template:'Bienvenue SI 4', help:''},
    {category:7, display:'Aide sources', template:'Aide sources|user=$(user)', help:''},
    {category:7, display:'Aide images', template:'Aide images|user=$(user)', help:''},
    {category:7, display:'Aide wikification', template:'Aide wikification|user=$(user)', help:''},
    {category:7, display:'Aide liens', template:'Aide liens', help:''},
  ],
  categories_container: null,
  alphabetic_container: null,
  current_display_mode: "categories",

  init: function () {
  },
  launch: function () {
    if (mw.config.get('wgArticleId') === 0 && mw.config.get('wgRelevantUserName') === null) {
        mw.notify(C.message.config['notify-not-a-page'], {title:'C-helper', type:'error'});
        return;
    }
    if (this.dialog === null) {
        this.build_dialog();
    }
    this.dialog.dialog("open");
  },
  "build_dialog": function () {
    this.dialog = $('<div>', {title:this.config['modal-title']});
    let form = $('<form>');
    this.dialog.append(form);

    // Try to determine the page name to display in the template, if it's ambiguous, ask a manual input
    if (mw.config.get('wgNamespaceNumber') == 2 || mw.config.get('wgNamespaceNumber') == 3) {
        $("<div>")
               .append($("<label>", {"for":"C-message-input-page"}).text("Article modifié :"))
               .append($("<input>", {type:"text", name:"C-message-input-page", id:"C-message-input-page"}))
               .append(C.util.construct_help_icon(this.config['page-input-help']))
               .appendTo(form);
    } else {
        $("<div>")
               .append($("<input>", {type:"hidden", name:"C-message-input-page", id:"C-message-input-page", value:mw.config.get('wgPageName').replaceAll('_', ' ')}))
               .appendTo(form);
    }
    $("<div>")
           .append($("<input>", {type:"checkbox", checked: "checked", name:"C-message-checkbox-subst", id:"C-message-checkbox-subst"}))
           .append($("<label>", {"for":"C-message-checkbox-subst"}).text("Substituer les modèles"))
           .append(C.util.construct_help_icon(this.config['subst-checkbox-help']))
           .appendTo(form);

    //Create sections
    this.alphabetic_container = $("<div>", {id:"C-message-alphabetic-container"});
    this.categories_container = $("<div>", {id:"C-message-categories-container"});
    for (let i=0; i<this.categories.length; i++) {
        this.categories[i].node = $("<div>").append($("<h3>").text(this.categories[i].display)).appendTo(this.categories_container);
    }
    for (let i=0; i<this.templates.length; i++) {
        this.templates[i].node = $("<div>");
        this.templates[i].node.append($("<input>", {type:"checkbox", id:"C-message-"+i, message_id:i, class:this.config['c-message-checkbox-class']}));
        this.templates[i].node.append($("<label>", {"for":"C-message-"+i}).text(this.templates[i].display));

        if (this.templates[i].help) {
            this.templates[i].node.append(C.util.construct_help_icon(this.templates[i].help));
        }
        if (this.templates[i].extra) {
            this.templates[i].node.append($('<span>', {id:'C-message-extra-'+i, class:this.config['c-message-extra-class']})
                                        .hide()
                                        .append($('<br>'))
                                        .append($('<label>', {"for":'C-message-extra-input-'+i}).html(this.templates[i].extra))
                                        .append("&nbsp;")
                                        .append($('<input>', {type:'text', id:'C-message-extra-input-'+i})));
        }
        this.categories[this.templates[i].category].node.append(this.templates[i].node);
    }
    form.append(this.alphabetic_container);
    form.append(this.categories_container);

    this.dialog.dialog({
      autoOpen: false,
      height: 400,
      width: 600,
      modal: true,
      buttons: [
        {
          text: C.message.config['submit'],
          click: function () {
            C.message.dialog.dialog("close");
            C.message.validate();
          },
        },
      ],
    dialogClass: 'c-helper-dialog',
    });

    $('.'+this.config['c-message-checkbox-class']).change(function () {
        if ($(this).is(":checked")) {
            $('#C-message-extra-'+$(this).attr('message_id')).show();
        } else {
            $('#C-message-extra-'+$(this).attr('message_id')).hide();
        }
    });
  },

  validate: async function () {
    let target_page = $('#C-message-input-page').val();
    let target_user_name;
    if ($(".diff").length) {
        target_user_name = $(".diff-ntitle .mw-userlink").text();
    } else {
        target_user_name = mw.config.get('wgRelevantUserName');
    }
    let reverted_edit = "";
    let to_append = "";
    let summary_array = [];
    for (let i=0; i<this.templates.length; i++) {
        if ($('#C-message-'+i).is(':checked')) {
            let template = this.templates[i].template;
            if (template.includes('$(diff)') && !reverted_edit && target_page) {
                reverted_edit = await this.last_edit_on_page_by_user(target_page, target_user_name)
                    .catch(function (err) {
                        let notification = 'Failed to guess the reverted edit.';
                        if ( err ) {
                            notification += ' ' + err;
                            if ( !notification.endsWith( '.' ) ) {
                                notification += '.';
                            }
                        }
                        // vu que ça n'interrompt pas le traitement, je mets en type "warn" et non "error"
                        mw.notify( notification, { type: 'warn' } );
                        return "";
                    });
            }
            let tmp = template.replaceAll('$(day)', "{{subst:CURRENTDAY}}")
                        .replaceAll('$(month)', "{{subst:CURRENTMONTHNAME}}")
                        .replaceAll('$(year)', "{{subst:CURRENTYEAR}}")
                        .replaceAll('$(page)', target_page)
                        .replaceAll('$(diff)', reverted_edit)
                        .replaceAll('$(user)', mw.config.get('wgUserName'));
            if ($('#C-message-extra-input-'+i).length > 0) {
                tmp = tmp.replaceAll('$(extra)', $('#C-message-extra-input-'+i).val());
            }
            let subst = "";
            if ($('#C-message-checkbox-subst').is(':checked')) {
                subst = "subst:";
            }
            to_append += '\n\n{{'+subst+tmp+'}}';
            summary_array.push(this.templates[i].display);
        }
    }
    to_append += '\n~~~~';
    if (summary_array.length > 0) {
        let template_links = summary_array.map(function (item) {
            return this.config['template-link-summary'].replaceAll('$1', item);
        }, this);
        let summary = this.config['add-summary'].replaceAll('$1', C.util.array_to_text(template_links));
        C.util.append("Discussion utilisateur:"+target_user_name, to_append, summary, function () {
            mw.notify(C.message.config['notify-success'], {title:'C-helper', type:'info'});
        });
    }
  },

  'last_edit_on_page_by_user': async function ( page, user ) {
    if ( !page ) {
        throw new Error( 'Missing "page" argument' );
    }
    if ( !user ) {
        throw new Error( 'Missing "user" argument' );
    }
    let data = await new mw.Api().get( {
        action: 'query',
        prop: 'revisions',
        titles: page,
        rvuser: user,
        rvlimit: 1,
        rvprop: 'ids',
        formatversion: 2
    } ).catch( function ( err ) {
        throw new Error( 'API error: ' + err );
    } );
    // la propriété "pages" peut être absente dans ce cas :
    // - input "#" (ou "#foobar"), qui est normalisé en "", c'est-à-dire un titre vide
    // la propriété "revisions" peut être absente dans divers cas :
    // - page inexistante
    // - titre de page invalide
    // - aucune révision trouvée (parce que l'utilisateur n'a jamais modifié la page)
    if ( !data.query.pages ) {
        throw new Error( 'Erroneous page title input' );
    }
    if ( !data.query.pages[ 0 ].revisions ) {
        if ( data.query.pages[ 0 ].missing ) {
            throw new Error( 'Page not found' );
        }
        if ( data.query.pages[ 0 ].invalid ) {
            throw new Error( 'Invalid page title' );
        }
        throw new Error( 'Revision not found' );
    }
    return data.query.pages[ 0 ].revisions[ 0 ].revid;
  },
};

C.modules.message.callback = C.message;
//</nowiki>