User:Enterprisey/revert-and-block.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//<nowiki>
$( function () {
    var ADVERT = " ([[User:Enterprisey/revert-and-block|RNB]])";
    var IP_BLOCK_LENGTH = window.revertAndBlockIpBlockLength || "31 hours";
    if( mw.config.get( "wgAction" ) === "history" ) {
        mw.loader.using( [ "mediawiki.util", "mediawiki.api" ] ).then( function () {
            var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
            var api = new mw.Api();

            function deliverBlockTemplate( username, isAnon ) {
                var now = new Date();
                var sectionName = MONTHS[now.getMonth()] + " " + now.getFullYear();
                api.get( {
                    prop: "revisions",
                    rvprop: "content",
                    rvlimit: "1",
                    rvslots: "main",
                    titles: "User talk:" + username,
                    formatversion: "2"
                } ).then( function ( data ) {
                    var existingText;
                    if( data.query.pages[0].missing ) {
                        existingText = "";
                    } else {
                        existingText = data.query.pages[0].revisions[0].slots.main.content;
                    }
                    var shouldAddSectionHeader = !( new RegExp( /==\s*/.source +
                        sectionName.replace( " ", "\\s*" ) + /\s*==/.source ).test( existingText ) );

                    var textToAdd = "\n\n" +
                        ( shouldAddSectionHeader
                            ? "== " + sectionName + " ==\n\n"
                            : ""
                        ) +
                        "{{subst:uw-vblock|" +
                        ( isAnon
                            ? "anon=yes|time=" + IP_BLOCK_LENGTH + "|"
                            : "indef=yes|"
                        ) +
                        "sig=yes|page=" + mw.config.get( "wgPageName" ) + "}}";

                    return api.postWithToken( "csrf", {
                        action: "edit",
                        title: "User talk:" + username,
                        appendtext: textToAdd,
                        summary: "You have been blocked from editing for persistent vandalism." + ADVERT
                    } );
                } ).then( function () {
                    mw.notify( "Notification sent." );
                } );
            }

            function appendLink( obj ) {
                obj.append( $( "<span>" ).append( $( "<a>" )
                    .attr( "href", "#" )
                    .text( "RNB" )
                    .click( function () {
                        var api = new mw.Api();
                        var parentLine = $( this ).parents( "li" );
                        var username = parentLine.find( ".history-user a" ).get( 0 ).textContent;
                        var parentLineEl = parentLine.get(0);

                        // A crucial confirmation...
                        if( window.revertAndBlockNoConfirm || confirm( "Revert and block " + username + "?" ) ) {

                            // Revert edit
                            api.postWithToken( "csrf", {
                                action: "edit",
                                title: mw.config.get( "wgPageName" ),
                                undo: parentLineEl.dataset.mwRevid,
                                undoafter: parentLineEl.nextElementSibling && parentLineEl.nextElementSibling.dataset.mwRevid
                            } ).then( function () { mw.notify( "Undid revision." ); } );

                            // Add talk page template
                            var isAnon = parentLine.find( ".history-user a" ).hasClass( "mw-anonuserlink" );
                            deliverBlockTemplate( username, isAnon );

                            // Place indef/31 hr block (for logged-in users & IPs respectively)
                            api.postWithToken( "csrf", {
                                action: "block",
                                user: username,
                                expiry: isAnon ? IP_BLOCK_LENGTH : "never",
                                reason: "[[Wikipedia:Vandalism|Vandalism]]",
                                nocreate: "true",
                                autoblock: "true",
                                watchuser: "true",
                            } ).then( function () { mw.notify( "Blocked." ); } );
                        }
                        return false;
                    } ) ) );
            }
            var selector = "span.mw-changeslist-links:not(.mw-history-histlinks):not(.mw-usertoollinks)";

            // Adding the hook automatically calls appendLink for the first time
            mw.hook( "wikipage.content" ).add( function ( obj ) { appendLink( obj.find( selector ) ); } );
        } );
    }
} );
//</nowiki>