Utente:Titore/VC.js

Versione del 1 mag 2021 alle 19:13 di Titore (discussione | contributi) (feedback, formattazione)

Questa pagina definisce alcuni parametri di aspetto e comportamento generale di tutte le pagine. Per personalizzarli vedi Aiuto:Stile utente.


Nota: dopo aver salvato è necessario pulire la cache del proprio browser per vedere i cambiamenti (per le pagine globali è comunque necessario attendere qualche minuto). Per Mozilla / Firefox / Safari: fare clic su Ricarica tenendo premuto il tasto delle maiuscole, oppure premere Ctrl-F5 o Ctrl-R (Command-R su Mac); per Chrome: premere Ctrl-Shift-R (Command-Shift-R su un Mac); per Konqueror: premere il pulsante Ricarica o il tasto F5; per Opera può essere necessario svuotare completamente la cache dal menù Strumenti → Preferenze; per Internet Explorer: mantenere premuto il tasto Ctrl mentre si preme il pulsante Aggiorna o premere Ctrl-F5.

/**
 * Aggiunge un link nella barra degli strumenti laterale
 * per segnalare rapidamente un'utenza o un IP tra i vandalismi in corso.
 *
 * @author https://it.wikipedia.org/wiki/Utente:Titore and contributors
 * @date 2019-09-17
 * @license Dual-licensed under CC BY-SA 3.0 and GPL 3.0 (or any later version)
 */
(function (mw, $) {
    // API MediaWiki per lettura e invio dati
    const api = new mw.Api();

    // Nome utente e pagine attinenti (es. contributi, discussioni, pagina utente)
    const utente = mw.config.get('wgRelevantUserName');

    // Pagina di servizio
    const paginaSegnalazioni = 'Wikipedia:Vandalismi in corso';

    // Campo oggetto
    const oggetto = '+1';

    // Configurazione notifiche
    const notif = {
        errore: {
            title: 'Errore',
            type: 'error',
            autoHide: false,
            tag: 'notif'
        }
    };

    // Aggiunge link nella barra degli strumenti laterale
    if (utente) {
        var link = mw.util.addPortletLink(
            'p-tb',
            '#',
            "Segnala vandalo",
            "t-segnalavandalo",
            "Segnala questa utenza o IP in WP:VC");
        $(link).click((event) => {
            event.preventDefault();
            avviaScript();
        });
    }

    /**
     * Avvia lo script.
     */
    function avviaScript() {
        mw.loader.using('oojs-ui-windows')
            .done(() => {
                finestraDiDialogo();
            })
            .fail(() => {
                console.error('Impossibile avviare lo script VC.js.');
            });
    }

    /**
     * Finestra di dialogo
     */
    function finestraDiDialogo() {
        OO.ui.prompt(utente + ' verrà segnalato tra i vandalismi in corso', {
            title: 'Nuova segnalazione',
            textInput: { placeholder: 'Motivazione \(senza firma\)' },
            size: 'medium'
        }).done((motivo) => {
            switch (motivo) {

                // Clic su annulla
                case null:
                    console.warn('L\'utente ha fatto clic su "Annulla" o ha chiuso la finestra di dialogo.');
                    break;

                // Motivazione non compilata
                case '':
                    mw.notify('Fornire una motivazione', notif.errore);
                    console.error('L\'utente non ha fornito una motivazione');
                    break;

                // Motivazione compilata
                default:
                    controllaBlocco(utente, blocco => {
                        if (blocco) {
                            mw.notify(utente + ' risulta già bloccato.', notif.errore);
                            console.log('Segnalazione non inviata: ' +
                                utente + ' già bloccato.\nIl testo era: "' + motivo + '"');
                        } else {
                            mw.notify('Invio in corso...', { tag: 'notif', autoHide: false });
                            inviaSegnalazione('{{vandalo|' + utente + '}} ' + motivo + ' --~~\~~');
                        }
                    });
            }
        });
    }

    /**
     * Invia la segnalazione.
     * 
     * @param {string} segnalazione 
     */
    function inviaSegnalazione(segnalazione) {

        // Data odierna, ordinale per il primo del mese
        const dataOdierna = new Date()
            .toLocaleDateString("it-IT", { day: 'numeric', month: 'long' })
            .replace(/\b[1] /, '1º ');

        // URL per link in notifica
        const url = mw.config.get('wgArticlePath').replace('$1', paginaSegnalazioni);

        // Per aggiungere sottosezione con data se non già esistente
        parsingSezioni(titoloUltimaSezione => {

            api.postWithEditToken({
                action: 'edit',
                title: paginaSegnalazioni,
                appendtext: (dataOdierna == titoloUltimaSezione) ? ('\n\n' + segnalazione) :
                    ('\n\n=== ' + dataOdierna + ' ===\n' + segnalazione),
                summary: oggetto
            }).done((data) => {
                mw.notify($('<span>' + utente + ' è stato segnalato tra i ' +
                    '<a href="' + url + '#footer">vandalismi in corso</a>.</span>'), {
                    title: 'Segnalato',
                    tag: 'notif'
                });
                console.log('L\'utente ha scritto "' + motivo + '" e ha fatto clic su "OK".');
                console.log(data);
            }).fail((code) => {
                mw.notify(code, notif.errore);
                console.error('Segnalazione non inviata: ' + code);
            });
        });
    }

    /**
     * Parsing della pagina per ricavarne i titoli delle sezioni.
     * 
     * @param {function} titoloUltimaSezione - Risultato
     */
    function parsingSezioni(titoloUltimaSezione) {
        api.get({
            page: paginaSegnalazioni,
            action: 'parse',
            prop: 'sections'
        }).done(data => {
            titoloUltimaSezione(
                data.parse.sections[data.parse.sections.length - 1].line
                    // ordinale per il primo del mese
                    .replace(/\b[1] /, '1º ')
                    .replace('1° ', '1º ')
            );
        });
    }

    /**
     * Controlla se l'utente è bloccato.
     * 
     * @param {string} utente
     * @param {function} blocco - Risultato
     */
    function controllaBlocco(utente, blocco) {
        api.get({
            action: 'query',
            list: 'blocks',
            bkusers: utente,
            bklimit: '1',
            bkprop: 'by',
            format: 'json'
        }).done(data => {
            blocco(data.query.blocks[0]);
        });
    }

}(mediaWiki, jQuery));

// TODO
// [[Phab:T75714]]: Non è ancora possibile usare string literal (ES2015)
// avvisare se il vandalo:
//    è già stato segnalato di recente
//    non è stato avvisato
// drop down motivazioni frequenti
// textinput invece di prompt (poco spazio per inserire la motivazione)
// solo autoverificati?