User:Neolexx/CommonsRing.js

Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
/* BEGIN */ jQuery(document).ready(function() {




/* *********************
   MAIN                */


if (location.href != 'https://commons.wikimedia.org/wiki/User:Neolexx/CommonsRing.JS') {
	return;
}
else if (typeof ScriptEngineMajorVersion == 'function' && ScriptEngineMajorVersion() < 9) {
	window.alert('Вы используете устаревшую версию Internet Explorer, которая более не поддерживается.');
	return;
}
else {
	// OK, let's have it...
}


var CANONICAL_URL = 'https://commons.wikimedia.org/wiki/';

var SCRIPT_PATH = 'https://commons.wikimedia.org/w/api.php';

var HOME_WIKI = 'ru.wikipedia.org';

var WIKI_LANGUAGE_CODE = 'ru';

var ISO_LANGUAGE_CODE = 'ru-RU';

var DIALOG_MESSAGE = [
	'Проверить состояние вклада с аккаунта:',
	' \u2014 такой аккаунт не найден.'
];

var LOADING_SIGN = '<img '.concat(
	'width="120" height="79" src="https://upload.wikimedia.org/wikipedia/commons/',
	'thumb/b/b1/Loading_icon.gif/120px-Loading_icon.gif">'
);

var LI_BASE = '<li style="margin-bottom:1em;padding:0.5em 1em;';

var LI_OK_USED = 'outline:green solid 2px;">';

var LI_OK_UNUSED = 'outline:green dashed 2px;">';

var LI_DR_USED = 'outline:red solid 2px;">';

var LI_DR_UNUSED = 'outline:red dashed 2px;">';

var queryBase = {
	format : 'json',
	formatversion : 2,
	action : 'query'
};

var queryUserProfile = jQuery.extend({}, queryBase, {
	list : 'users',
	usprop : 'groups|editcount|registration',
	ususers : ''}
);

var queryContributorUploads = jQuery.extend({}, queryBase, {
	list : 'usercontribs',
	uclimit : 'max',
	ucnamespace : 6,
	ucshow : 'new',
	ucprop : 'title',
	ucuser : ''}
);

var queryWikipediaUsage = jQuery.extend({}, queryBase, {
	prop : 'globalusage',
	gulimit : 'max',
	gufilterlocal : 1,
	guprop : 'url|namespace',
	titles : ''}
);


var queryPendingDeleteRequest = jQuery.extend({}, queryBase, {
	prop : 'templates',
	tltemplates : 'Template:Delete|Template:Copyvio|Template:Duplicate',
	titles : ''}
);

var cnt = ''; // batch queries 'continue' field

var ptr = -1; // global cycle pointer

var resource = null; // current file

var record = ''; // current record markup

var usage_list = ''; // wiki usage list

var ups = []; // uploaded files

var dat = { // data summary
	used : [],     // used at home wiki
	dr_used : [],  // used with DR pending
	dr_unused : [] // unused with DR pending
};

var contributor = mw.config.get('wgUserName') || '';

getContributorProfile(DIALOG_MESSAGE[0], contributor);




/* *********************
   MAIN FUNCTIONS      */


function getContributorProfile() {
	
	contributor = window.prompt(arguments[0], arguments[1]);
	
	
	if (!!contributor) {
	
		queryUserProfile.ususers = contributor;

		jQuery.get(SCRIPT_PATH, queryUserProfile, showContributorProfile);
	
	}

}




function showContributorProfile(data) {
	
	if ('missing' in data.query.users[0]) {

		getContributorProfile(contributor.concat(DIALOG_MESSAGE[1], '\n', DIALOG_MESSAGE[0]), '');

	}
	
    else {
	
		_$('Nx_Timestamp').textContent = 'check started: '.concat((new Date()).toUTCString());

		_$('Nx_Name').innerHTML = getComboLink(CANONICAL_URL.concat('User:', contributor), contributor, 'c:', false);
		
		_$('Nx_Registration').textContent = 'активность на Викискладе с '.concat(getDateString(data.query.users[0].registration));
		
		_$('Nx_Edits').textContent = 'правок на Викискладе: '.concat(data.query.users[0].editcount);
		
		_$('Nx_Status').textContent = 'статус на Викискладе: '.concat(getUserProjectStatus(data.query.users[0].groups));
		
		_$('Nx_Total').textContent = 'загруженых файлов: ...'
		
		_$('Nx_Summary').innerHTML = LOADING_SIGN;
		
		queryContributorUploads.ucuser = contributor;
		
		window.setTimeout(getContributorUploads, 10);
		
	}

}




function getContributorUploads() {
	
	if (cnt != '') {
	
		queryContributorUploads.uccontinue = cnt;
		
	}
	else {
	
		cnt = '';
		
		delete queryContributorUploads.uccontinue;
		
	}
	
	jQuery.get(SCRIPT_PATH, queryContributorUploads,
		function(data) {

			jQuery.merge(ups, data.query.usercontribs);

			if ('continue' in data) {
			
				cnt = data.continue.uccontinue;
				
				window.setTimeout(getContributorUploads, 10);
				
			}
			else {
				
				if (ups.length > 0) {
				
					_$('Nx_Total').textContent = 'загруженых файлов: '.concat(ups.length);
				
					window.setTimeout(checkContributions, 10);
				
				}
				else {
				
					_$('Nx_Total').textContent = 'загрузок не найдено';
					
					_$('Nx_Summary').style.display = 'none';
					
				}
			
			}
		}
	);
	
}




function checkContributions() {

	ptr++;
	
	if (ptr < ups.length) {
	
		queryWikipediaUsage.titles = ups[ptr].title;
	
		jQuery.get(SCRIPT_PATH, queryWikipediaUsage,
			function(data) {

				usage_list = '<ol>';
				
				for (var p in data.query.pages) {
					resource = data.query.pages[p];
					break;
					// the simplest for such nutty data sructure...
				}		
	
				for (var i=0; i<resource.globalusage.length; i++) {
					if ( (resource.globalusage[i].wiki == HOME_WIKI) && (resource.globalusage[i].ns == 0) ) {
						usage_list+= '<li>'.concat(
							getComboLink(resource.globalusage[i].url, resource.globalusage[i].title, 'w:ru:', false),
							'</li>'
						);
					}
				}
				
				usage_list+= '</ol>';
				
				record = LI_BASE;
				
			}
			).done(function() {

				queryPendingDeleteRequest.titles = resource.title;
				
				jQuery.get(SCRIPT_PATH, queryPendingDeleteRequest, function(data) {
				
					if ('templates' in data.query.pages[0]) { // DR
					
						if (usage_list != '<ol></ol>') { // USED
							record+= LI_DR_USED.concat(
								getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
								usage_list, '</li>'
							);
							dat.dr_used.push(resource.title);
						}
						else { // UNUSED
							record+= LI_DR_UNUSED.concat(
								getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
								'</li>'
							);
							dat.dr_unused.push(resource.title);
						}
					
					}
					else { // OK
						
						if (usage_list != '<ol></ol>') { // USED
							record+= LI_OK_USED.concat(
								getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
								usage_list, '</li>'
							);
							dat.used.push(resource.title);
						}
						else { // UNUSED
							record+= LI_OK_UNUSED.concat(
								getComboLink(CANONICAL_URL.concat(resource.title), resource.title, 'c:', true),
								'</li>'
							);
						}
					}
					
					jQuery('#Nx_Uploads').append(record);
					
					_$('Nx_Summary').scrollIntoView(false);
					
					window.setTimeout(checkContributions, 10);
					
				});

			});
	}
	else {
		ptr = -1;
		_$('Nx_Summary').innerHTML = '<ul>'.concat(
			'<li>всего файлов: ', ups.length, '</li>',
			'<li>использовано в статьях: ', dat.used.length, ' (',
			Math.round(dat.used.length / ups.length * 100),'%)</li>',
			'<li>вынесены на КБУ и КУ: ', (dat.dr_used.length + dat.dr_unused.length), ' \u2014 ',
			'из них используемые в статьях: ', dat.dr_used.length, '</li>',
			'<ul>'
		);
	}

}




/* *********************
   AUXILIARY FUNCTIONS */


function _$(id) {

	return document.getElementById(id);

}




function getUserProjectStatus(flags) {

    if (jQuery.inArray('bureaucrat', flags) != -1) {
		return 'бюрократ';
	}
	else if (jQuery.inArray('sysop', flags) != -1) {
		return 'администратор';
	}
	else if (jQuery.inArray('filemover', flags) != -1) {
		return 'переименовывающий';
	}
	else if (jQuery.inArray('patroller', flags) != -1) {
		return 'патрулирующий';
	}
	else if (jQuery.inArray('autopatrolled', flags) != -1) {
		return 'автопатрулируемый';
	}
	else {
		return 'рядовой участник';
	}

}




function getDateString(iso) {

	if ( (typeof iso == 'string') && (iso.indexOf('T') > 0) ) {
		return new Date(iso.split('T')[0]).toLocaleDateString(ISO_LANGUAGE_CODE);
	}
	else {
		return '?'; // some registration dates can be lost
	}

}




function getComboLink(thisLink, thisText, thisNS, isFile) {

	return '<a target="ext" href="'.concat(
		thisLink, '">', isFile? thisText.substr(5) : thisText,
		'</a><span class="NxWikiLink" style="display:none;">[[',
		thisNS, thisText, '|', isFile? thisText.substr(5) : thisText,
		']]</span>'
	);

}


/* END */ });