User:Magiczocker/Multiwikifinder.js

From Support Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* jshint esversion: 6 */
( function ( mw ) {
	'use strict';

	var config = mw.config.get( [
			'wgUserLanguage',
			'wgPageName'
		] ),
		paused = false,
		title = '',
		length = 0,
		elements = {},
		count = 0,
		found = 0,
		input,
		button,
		widget,
		i18n,
		wikis,
		host;

	if ( config.wgPageName !== 'User:Magiczocker/Multiwikifinder' ) {
		return;
	}

	function log( msg ) {
		console.log( '[Multiwikifinder]', msg );
	}

	function updateCount() {
		count++;
		if ( count === length ) {
			widget.setNotices( [] );
			widget.setSuccess( [ mw.format(i18n['wikis-found'], mw.language.convertNumber(found), mw.language.convertNumber(length)) ] );
			input.setReadOnly(false);
			button.setDisabled(false);
		} else {
			widget.setNotices( [ mw.format(i18n['wikis-checking'], mw.language.convertNumber(count), mw.language.convertNumber(length)) ] );
		}
	}

	function unpause() {
		paused = false;
		process();
	}

	function pause() {
		paused = true;
		setTimeout( unpause, 5000 );
	}

	function process() {
		if ( paused ) {
			return;
		}
		host = wikis[ count ];
		if ( host ) {
			fetch( host + '/api.php?' + new URLSearchParams( {
				action: 'query',
				format: 'json',
				titles: title,
				prop: 'info',
				formatversion: 2,
				origin: '*'
			} ), {
				method: 'GET'
			} ).then( function ( response ) {
				return response.json();
			} ).then( function ( data ) {
				const page = data.query.pages[ 0 ];
				if ( !page.missing ) {
					found++;
					var link = host + mw.util.getUrl(page.title);
					if ( page.redirect ) link += '?redirect=no';
					var liEle = document.createElement( 'li' );
					liEle.innerHTML = '<a href="' + link + '">' + link + '</a>';
					elements.output.append( liEle );
				}
				updateCount();
				process();
			} ).catch( function ( error ) {
				pause();
				log( error );
			} );
		} else {
			log( 'Done' );
		}
	}

	function getWikis() {
		fetch( 'https://support.wiki.gg/wiki/User:Magiczocker/list.json?action=raw', {
			method: 'GET'
		} ).then( function ( response ) {
			return response.json();
		} ).then( function ( data ) {
			wikis = data.flatMap( function ( wiki ) {
				return wiki.lang.map( function ( lang ) {
					// [name].wiki.gg/en redirects to [name].wiki.gg
					return 'https://' + wiki.name + '.wiki.gg' + ( lang === 'en' ? '' : '/' + lang );
				} );
			} );
			length = wikis.length;
			process();
		} ).catch( log );
	}

	function start() {
		if (input.isReadOnly() || button.isDisabled()) return;
		input.setReadOnly(true);
		button.setDisabled(true);
		count = 0;
		found = 0;
		elements.output.innerHTML = '';
		widget.setSuccess( [] );
		widget.setNotices( [ i18n['main-loading'] ] );
		title = input.getValue();
		if ( wikis ) {
			process();
		} else {
			getWikis();
		}
	}

	function init( $content ) {
		var main = $content.find( '#globalTracker:not(.loaded)' )[ 0 ];
		if ( !main ) {
			return;
		}
		main.classList.add( 'loaded' );
		main.innerHTML = '';
		input = new OO.ui.TextInputWidget( {
			required: true,
			placeholder: i18n['main-header']
		} );
		button = new OO.ui.ButtonWidget( {
			label: i18n['main-button'],
			flags: ['primary', 'progressive']
		} );
		widget = new OO.ui.ActionFieldLayout(
			input, button, {
				id: 'multiwikifinder',
				label: i18n['main-label'],
				align: 'top'
			}
		);
		$content.append(
			widget.$element,
			$('<ol>').attr('id', 'multiwikifinder-output')
		);
		elements = {
			output: $content.find('#multiwikifinder-output')[0]
		};
		input.on('enter', start);
		button.on('click', start);
	}

	mw.loader.using( [
		'oojs-ui-widgets',
		'mediawiki.widgets',
		'mediawiki.util',
		'mediawiki.language'
	] ).then( function () {
		/* Load i18n */
		fetch( 'https://support.wiki.gg/wiki/User:Magiczocker/Multiwikifinder-i18n.json?action=raw', {
			method: 'GET'
		} ).then( function ( response ) {
			return response.json();
		} ).then( function ( i18no ) {
			i18n = i18no[ config.wgUserLanguage ] || i18no.en;
			mw.hook( 'wikipage.content' ).add( init );
		} ).catch( log );
	} );
}( window.mediaWiki ) );