User:Evad37/Thanky.js

/***************************************************************************************************

Thanky: Adds thank links next to diff links on special pages (e.g. watchlist, recent changes, etc)

  • /

/* jshint esversion: 5, laxbreak: true, undef: true, eqnull: true, maxerr: 3000 */

/* globals $, mw, OO, extraJs */

/* */

$.when(

// Resource loader modules

mw.loader.using([

'mediawiki.util', 'mediawiki.api', 'mediawiki.Uri',

'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows'

]),

// Page ready

$.ready

).then(function() {

var config = {

scriptVersion: "0.0.1",

mw: mw.config.get(['wgNamespaceNumber', 'wgUserName', 'wgCanonicalSpecialPageName'])

};

if( config.mw.wgNamespaceNumber != -1 ) {

// only operate in Special: namespace

return;

}

var API = new mw.Api( {

ajax: {

headers: {

'Api-User-Agent': 'Thanky/' + config.scriptVersion +

' ( https://en.wikipedia.org/wiki/User:Evad37/Thanky )'

}

}

} );

API.get( {

action: 'query',

meta: 'allmessages',

ammessages: [ 'Thanks-confirmation2', 'Thanks-thank', 'Thanks-thanked', 'Error', 'Centralauth-rename-table-status-failed' ],

amenableparser: 1,

amargs: mw.config.get('wgUserName')

} ).then(function(response) {

var messages = {};

response.query.allmessages.forEach(function(message) {

messages[message.normalizedname] = message['*'];

});

var makeErrorMsg = function(code, jqxhr) {

var details = '';

if ( code === 'http' && jqxhr.textStatus === 'error' ) {

details = 'HTTP ' + messages.error + ' ' + jqxhr.xhr.status;

} else if ( code === 'http' ) {

details = 'HTTP ' + messages.error + ': ' + jqxhr.textStatus;

} else if ( code === 'ok-but-empty' ) {

details = messages.error + ': Got an empty response from the server';

} else {

details = 'API ' + messages.error + ': ' + code;

}

return details;

};

// Hook on to changes in page content - initial load, 'New filters for edit review' changes, etc

mw.hook( 'wikipage.content' ).add( function ( $content ) {

$content.find("a.mw-changeslist-diff").not(".thanky-linkAdded").each(function() {

var uri = new mw.Uri(this.attributes.href.value);

var diffNumber = Number(uri.query.diff);

var oldidNumber = Number(uri.query.oldid);

if(isNaN(diffNumber) && isNaN(oldidNumber)) {

// Can't work out revision, so can't send thanks

return;

}

var revision = isNaN(diffNumber) ? oldidNumber : diffNumber;

var $thank = $("").attr("href","#").text( messages["thanks-thank"] ).click(function(e){

e.preventDefault();

OO.ui.confirm( messages["thanks-confirmation2"] ).then( function ( confirmed ) {

if ( confirmed ) {

API.postWithToken("csrf", {

action: "thank",

rev: revision,

source: "Thanky/" + config.mw.wgCanonicalSpecialPageName

}).then(

function() {

mw.notify("✓ " + messages["thanks-thanked"]);

$thank.hide().after( messages["thanks-thanked"] );

},

function(code, err) {

mw.notify( makeErrorMsg(code, err), {

title: "✗ " + messages["thanks-thank"] + " " + messages['centralauth-rename-table-status-failed'].toUpperCase(),

type: 'warn'

} );

}

);

}

});

});

$(this).addClass("thanky-linkAdded").after(

$("").append($thank)

);

});

});

});

});

/* */