User:Radar33/twinkle/speedylogaddon.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.
/// Code taken from [[User:Timotheus Canens/twinklespeedy.js]], modified from [[User:AzaToth/twinklespeedy.js]]

// If TwinkleConfig aint exist.
if( typeof( TwinkleConfig ) == 'undefined' ) {
  TwinkleConfig = {};
}

/**
 TwinkleConfig.noLogOnSpeedyNomination (array)
 What types of actions that should not be logged in the CSD log.
 Default is U1 (user request).
 */
if( typeof( TwinkleConfig.noLogOnSpeedyNomination ) == 'undefined' ) {
  TwinkleConfig.noLogOnSpeedyNomination = ['u1'];
}

/**
 TwinkleConfig.neverLogSpeedyNomination (boolean)
 Whether speedy nomination should be logged at all, default false.
 */
if( typeof( TwinkleConfig.neverLogSpeedyNomination ) == 'undefined' ) {
    TwinkleConfig.neverLogSpeedyNomination = false;
}

/**
 TwinkleConfig.speedyLogPageName (string)
 The name of the userspace subpage in which speedy nominations should be logged.
 Default "CSDlog".
 */
if( typeof( TwinkleConfig. speedyLogPageName ) == 'undefined' ) {
    TwinkleConfig.speedyLogPageName = "CSDlog";
}


//if [[User:AzaToth/twinklespeedy.js]] is updated, double check the following function, and add
/*
        lognomination: (TwinkleConfig.noLogOnSpeedyNomination.indexOf( normalized ) == -1) && (!TwinkleConfig.neverLogSpeedyNomination)
*/
//into the "var params" array

twinklespeedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
    wgPageName = wgPageName.replace( /_/g, ' ' ); // for queen/king/whatever and country!
    var value = e.target.value;
        
    if (value == 'multiple')
    {
        e.target.form.style.display = "none"; // give the user a cue that the dialog is being changed
        twinklespeedy.targetdialogcontent = e.target.form.parentNode; // make this accessible in scopeless setTimeout
        setTimeout("twinklespeedy.initDialog(twinklespeedy.callback.doMultiple, false, twinklespeedy.targetdialogcontent)", 150);
        return;
    }
    
    if (value == 'multiple-finish')
        value = 'multiple';
    else
    {
        // clear these out, whatever the case, to avoid errors
        twinklespeedy.dbmultipleCriteria = [];
        twinklespeedy.dbmultipleParameters = [];
    }
        
    var normalized = twinklespeedy.normalizeHash[ value ];

    // analyse each db-multiple criterion to determine whether to watch the page/notify the creator
    var watchPage = false;
    if (value == 'multiple')
    {
        for (var i in twinklespeedy.dbmultipleCriteria)
        {
            if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string' && 
                TwinkleConfig.watchSpeedyPages.indexOf(twinklespeedy.dbmultipleCriteria[i]) != -1)
            {
                watchPage = true;
                break;
            }
        }
    }
    else watchPage = TwinkleConfig.watchSpeedyPages.indexOf(normalized) != -1;
    
    var notifyuser = false;
    if (value == 'multiple')
    {
        for (var i in twinklespeedy.dbmultipleCriteria)
        {
            if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string' && 
                TwinkleConfig.notifyUserOnSpeedyDeletionNomination.indexOf(twinklespeedy.dbmultipleCriteria[i]) != -1)
            {
                notifyuser = true;
                break;
            }
        }
    }
    else notifyuser = (TwinkleConfig.notifyUserOnSpeedyDeletionNomination.indexOf(normalized) != -1) && e.target.form.notify.checked;
                
    var params = {
        value: value,
        normalized: normalized,
        watch: watchPage,
        usertalk: notifyuser,
        rcid: QueryString.exists( 'rcid' ) ? QueryString.get( 'rcid' ) : '',
        wgCanonicalNamespace : wgCanonicalNamespace,
// begin add-on (with addition of comma above
        lognomination: (TwinkleConfig.noLogOnSpeedyNomination.indexOf( normalized ) == -1) && (!TwinkleConfig.neverLogSpeedyNomination)
// end add-on
    };

    Status.init( e.target.form );

    Wikipedia.actionCompleted.redirect = wgPageName;
    Wikipedia.actionCompleted.notice = "Tagging complete";

    var query = {
        'action': 'query',
        'titles': wgPageName
    }

    var wikipedia_api = new Wikipedia.api( 'Checking if page exists', query, twinklespeedy.callbacks.user.main );
    wikipedia_api.params = params;
    wikipedia_api.post();
}


// if [[User:AzaToth/twinklespeedy.js]] is updated, double check the following function, and add
/*
    else if( self.params.lognomination ) {
        var query = {
            'title': 'User:' + wgUserName +'/' + TwinkleConfig.speedyLogPageName,
            'action': 'submit'
        };
        var wikipedia_wiki = new Wikipedia.wiki( 'Logging CSD nomination', query, twinklespeedy.callbacks.user.userLog );
        wikipedia_wiki.params = self.params;
        wikipedia_wiki.get();
    }
*/
// after the "if( self.params.usertalk ) {" block

twinklespeedy.callbacks.user.tagPage = function( self ) {
    form = this.responseXML.getElementById( 'editform' );

    var text = form.wpTextbox1.value;

    self.statelem.status( 'Checking for tags on the page...' );

    // check for existing deletion tags
    var tag = /(\{\{\s*(?:db|delete|db-.*?)(?:\||\s*\}\}))/.exec( text );
    if( tag ) {
        self.statelem.error( [ htmlNode( 'strong', tag[0] ) , " is already placed on the page." ] )
        return;
    }

    var xfd = /(\{\{(?:[rsaiftcm]fd|md1)[^{}]*?\}\})/i.exec( text );
    
    if( xfd && !confirm( "The deletion related template " + xfd[0] + " is already present on the page, do you still want to apply CSD template?" ) ) {
        return;
    }
    
    var code;
    var parameters;
    if (self.params.normalized == 'multiple')
    {
        code = "\{\{db-multiple";
        for (var i in twinklespeedy.dbmultipleCriteria)
            if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string')
                code += "|" + twinklespeedy.dbmultipleCriteria[i].toUpperCase();
        for (var i in twinklespeedy.dbmultipleParameters)
            if (typeof twinklespeedy.dbmultipleParameters[i] == 'string')
                code += "|" + i + "=" + twinklespeedy.dbmultipleParameters[i];
        code += "\}\}";
        self.params.utparams = [];
    }
    else
    {
        parameters = twinklespeedy.getParameters(self.params.value, self.params.normalized, self.statelem);
        if (!parameters) return;
        code = "\{\{db-" + self.params.value;
        for (var i in parameters)
            if (typeof parameters[i] == 'string')
                code += "|" + i + "=" + parameters[i];
        code += "\}\}";
        self.params.utparams = twinklespeedy.getUserTalkParameters(self.params.normalized, parameters);
    }    

    if( TwinkleConfig.markSpeedyPagesAsPatrolled && self.params.rcid != '' ) {
        // extract patrol token from "Mark page as patrolled" link on page
        var patrollinkmatch = /token=(.+)%2B%5C$/.exec($('.patrollink a').attr('href'));
        
        if (patrollinkmatch) {
            var patroltoken = patrollinkmatch[1] + "+\\";
            var patrolstat = new Status("Marking page as patrolled", "Doing...");
            (Wikipedia.numberOfActionsLeft)++;

            var query = {
                'title': wgPageName,
                'action': 'markpatrolled',
                'rcid': self.params.rcid,
                'token': patroltoken
            };

            jQuery.ajax( {
                context: patrolstat,
                type: 'GET',
                url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/index.php', 
                data: QueryString.create(query),
                dataType: 'xml',
                success: function(xml, textStatus, jqXHR) {
                    this.info(textStatus);
                    Wikipedia.actionCompleted();
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    if (textStatus == "parsererror") { // kludge for Firefox 4.0b12
                        this.info("Done");
                        Wikipedia.actionCompleted();
                    } else {
                        this.error(textStatus + ': ' + errorThrown + ' occurred while trying to mark as patrolled.');
                    }
                }
            } );
        }
    }

    // Notification to first contributor
    var query = {
        'action': 'query',
        'prop': 'revisions',
        'titles': wgPageName,
        'rvlimit': 1,
        'rvprop': 'user',
        'rvdir': 'newer'
    }
    var callback = function( self ) {
        var xmlDoc = self.responseXML;
        var user = xmlDoc.evaluate( '//rev/@user', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
        if( wgPageName != ( 'User talk:' + user ) ) {
            var query = {
                'title': 'User talk:' + user,
                'action': 'submit'
            };
            var wikipedia_wiki = new Wikipedia.wiki( 'Notifying of initial contributor (' + user + ')', query, twinklespeedy.callbacks.user.userNotification );
            wikipedia_wiki.params = self.params;
            wikipedia_wiki.get();
        } else {
            Status.info( 'Info', 'Current page is initial contributor\'s talk page, aborting notification' );
        }
    }

    if( self.params.usertalk ) {
        var wikipedia_api = new Wikipedia.api( 'Grabbing data of initial contributor', query, callback );
        wikipedia_api.params = self.params;
        wikipedia_api.post();
    }
// begin add-on
    else if( self.params.lognomination ) {
        var query = {
            'title': 'User:' + wgUserName +'/' + TwinkleConfig.speedyLogPageName,
            'action': 'submit'
        };
        var wikipedia_wiki = new Wikipedia.wiki( 'Logging CSD nomination', query, twinklespeedy.callbacks.user.userLog );
        wikipedia_wiki.params = self.params;
        wikipedia_wiki.get();
    }
// end add-on

    //wrap SD template in noinclude tags if we are in template space.
    //won't work with userboxes in userspace, or any other transcluded page outside template space
    if (self.params.wgCanonicalNamespace == "Template") code = "<noinclude>" + code + "</noinclude>";

    //Remove tags that become superfluous with this action
    text = text.replace(/{\{\s*(New unreviewed article|Userspace draft)\s*(\|(?:{{[^{}]*}}|[^{}])*)?}}\s*/ig, "");

    // Generate edit summary for edit
    var editsummary;
    switch (self.params.normalized)
    {
        case 'db':
            editsummary = 'Requesting [[WP:CSD|speedy deletion]] with rationale \"' + parameters["1"] + '\".';
            break;
        case 'multiple':
            editsummary = 'Requesting speedy deletion (';
            for (var i in twinklespeedy.dbmultipleCriteria)
                if (typeof twinklespeedy.dbmultipleCriteria[i] == 'string')
                    editsummary += '[[WP:CSD#' + twinklespeedy.dbmultipleCriteria[i].toUpperCase() + '|CSD ' + twinklespeedy.dbmultipleCriteria[i].toUpperCase() + ']], ';
            editsummary = editsummary.substr(0, editsummary.length - 2); // remove trailing comma
            editsummary += ').';
            break;
        default:
            editsummary = "Requesting speedy deletion ([[WP:CSD#" + self.params.normalized.toUpperCase() + "|CSD " + self.params.normalized.toUpperCase() + "]]).";
            break;
    }

    var postData = {
        'wpMinoredit': TwinkleConfig.markSpeedyPagesAsMinor ? '' : undefined,
        'wpWatchthis': (self.params.watch || form.wpWatchthis.checked ) ? '' : undefined,
        'wpStarttime': form.wpStarttime.value,
        'wpEdittime': form.wpEdittime.value,
        'wpAutoSummary': form.wpAutoSummary.value,
        'wpEditToken': form.wpEditToken.value,
        'wpSection': '',
        'wpSummary': editsummary + TwinkleConfig.summaryAd,
        'wpTextbox1': code + ((self.params.normalized == 'g10' || twinklespeedy.dbmultipleCriteria.indexOf('g10') != -1) ?
            '' : ("\n" + text) ) // cause attack pages to be blanked
    };
    self.post( postData );
}

twinklespeedy.callbacks.user.userLog = function( self ) {
    var form = self.responseXML.getElementById( 'editform' );
    var text = form.wpTextbox1.value;
    var date = new Date();
    var headerRe = new RegExp( "^==+\\s*(?:" + date.getUTCMonthName() + '|' + date.getUTCMonthNameAbbrev() +  ")\\s+" + date.getUTCFullYear() + "\\s*==+", 'm' );
    if( !headerRe.exec( text ) ) {
        Status.info( 'Info', 'Will create a new level 2 heading for the date, as none was found for this month' );
        var heading = date.getUTCMonthName() + " " + date.getUTCFullYear();
        text += "<noinclude>\n== " + heading + " ==\n</noinclude>";
        text += "<includeonly>\n; " + heading + " \n</includeonly>\n";
    }
    text += "* [[:" + wgPageName + "]]: [[WP:CSD#" + self.params.normalized.toUpperCase() + "|CSD " + self.params.normalized.toUpperCase() + "]] (\{\{tl|db-" + self.params.value + "\}\})";
    if ( typeof (self.params.notifieduser) != 'undefined')
        text += "; notified: \{\{user|" + self.params.notifieduser + "\}\}";
    text += " \~\~\~\~\~";
    var postData = {
        'wpMinoredit': form.wpMinoredit.checked ? '' : undefined,
        'wpWatchthis': form.wpWatchthis.checked ? '' : undefined,
        'wpStarttime': form.wpStarttime.value,
        'wpEdittime': form.wpEdittime.value,
        'wpAutoSummary': form.wpAutoSummary.value,
        'wpEditToken': form.wpEditToken.value,
        'wpSection': '',
        'wpSummary': 'Logging speedy deletion nomination of \[\[:' + wgPageName + '\]\].' + TwinkleConfig.summaryAd,
        'wpTextbox1': text
    };
    self.post( postData );
}