Jump to content

User:PhantomTech/scripts/AFCRHS.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.
// This script is meant to help with [[Wikipedia:Articles for creation/Redirects]]. The GUI
// was put together pretty messily and some of the code isn't too pretty either, but it works.
// To use it, add a new line with
// importScript( 'User:PhantomTech/scripts/AFCRHS.js' );
// to your common.js and add yourself to the Articles for Creation
// checkpage at [[Wikipedia:WikiProject Articles for creation/Participants]]
//
// For help using the script, to report issues or to request changes use [[User Talk:PhantomTech]].

importScript( "MediaWiki:Gadget-morebits.js" );
importStylesheet( "MediaWiki:Gadget-morebits.css" );

( function ( $, mw ) {
	'use strict';
	$( document ).ready( function () {

		function replyButton( sectionID ) {
			var window = new Morebits.simpleWindow( 750, 400 );
			window.setTitle( 'Response Interface' );
			window.setScriptName( 'AFC/R HS' );
			window.addFooterLink( 'Source', 'User:PhantomTech/scripts/AFCRHS.js' );

			var form = new Morebits.quickForm( submitForm );
			form.append( {
				type: 'hidden',
				name: 'sectionID',
				value: sectionID
			} );
			form.append( {
				type: 'radio',
				name: 'acceptRadio',
				list: [
					{ name: 'accept', label: 'Accept', value: true },
					{ name: 'accept', label: 'Decline', value: false, checked: true }
				],
				event: function ( event ) {
					updateDynamicArea( event.target.form );
				}
			} );
			form.append( {
				type: 'div',
				name: 'dynamic_area',
				label: 'Something broke...'
			} );
			form.append( {
				type: 'submit',
				label: 'Submit'
			} );
			var renderedForm = form.render();

			window.setContent( renderedForm );
			window.display();
			updateDynamicArea( renderedForm );
		}

		function updateDynamicArea( form ) {
			var accept = Morebits.quickForm.getElements( form, "accept" )[ 0 ].checked;

			var dynamic_area = new Morebits.quickForm.element( {
				type: 'div',
				name: 'dynamic_area'
			} );

			if ( !accept ) {
				dynamic_area.append( {
					type: 'header',
					label: 'Decline request'
				} );
				dynamic_area.append( {
					type: 'select',
					name: 'declineOptions',
					label: 'Decline reason: ',
					list: [
						{ type: 'option', name: 'declineOptions', value: 'unlikely', label: 'Unlikely title' },
						{ type: 'option', name: 'declineOptions', value: 'exists', label: 'Suggested title exists' },
						{ type: 'option', name: 'declineOptions', value: 'empty', label: 'Submission is empty' },
						{ type: 'option', name: 'declineOptions', value: 'notarget', label: 'Target does not exist' },
						{
							type: 'option',
							name: 'declineOptions',
							value: 'externallink',
							label: 'Target is external link'
						},
						{
							type: 'option',
							name: 'declineOptions',
							value: 'notredirect',
							label: 'Request is not for a redirect'
						},
						{
							type: 'option',
							name: 'declineOptions',
							value: 'editrequest',
							label: 'Request is an edit request'
						},
						{
							type: 'option',
							name: 'declineOptions',
							value: 'notenglish',
							label: 'Request not in english'
						},
						{ type: 'option', name: 'declineOptions', value: 'decline', label: 'Custom reason' }
					]
				} );
				dynamic_area.append( {
					type: 'input',
					name: 'comment',
					label: 'Provide custom reason if it is selected: '
				} );
			} else {
				dynamic_area.append( {
					type: 'header',
					label: 'Accept request'
				} );
				dynamic_area.append( {
					type: 'div',
					name: 'redirectTypeInstructions',
					label: 'Enter "none" for none, "to acronym" for {' + '{R' + ' to acronym}}, etc.'
				} );
				dynamic_area.append( {
					type: 'input',
					name: 'redirectTypes',
					label: 'Redirect type: ',
					value: 'none'
				} );
				dynamic_area.append( {
					type: 'input',
					name: 'redirTarget',
					label: 'Redirect target: '
				} );
				dynamic_area.append( {
					type: 'input',
					name: 'comment',
					label: 'Comments: ',
					value: 'All of the redirects you requested were created. Thank you for your contribution to Wikipedia!'
				} );
				dynamic_area.append( {
					type: 'dyninput',
					name: 'redirectList',
					label: 'List of redirects to be created',
					min: 1,
					max: 30,
					sublabel: 'Name: '
				} );
			}

			form.replaceChild( dynamic_area.render(), Morebits.quickForm.getElements( form, "dynamic_area" )[ 0 ] );
		}

		function submitForm( e ) {
			// Check if we're still on the current version of the page
			var redirectPage = new Morebits.wiki.page( mw.config.get( 'wgPageName' ) );
			redirectPage.load( function () {
				if ( parseInt( redirectPage.getCurrentID() ) !== mw.config.get( 'wgRevisionId' ) ) {
					alert( 'Changes have been made to this page since the version you\'re viewing' );
					return;
				}

				// If version check passes, start making changes
				Morebits.simpleWindow.setButtonsEnabled( false );

				var redirectType, target, redirects;
				var form = e.target;
				var sectionID = parseInt( form.sectionID.value );
				var accept = form.accept[ 0 ].checked;
				var comment = form.comment.value;
				var redirectTemplateCode = 'accept';
				var page = new Morebits.wiki.page( mw.config.get( 'wgPageName' ) );
				if ( accept ) {
					redirectType = form.redirectTypes.value;
					if ( redirectType !== 'none' ) {
						redirectType = '\n{' + '{R ' + redirectType + '}}';
					} else {
						redirectType = '';
					}
					target = form.redirTarget.value;
					redirects = [];
					for ( var i = 0; i < form.redirectList.length; i++ ) {
						if ( form.redirectList[ i ].value.length > 0 ) {
							redirects.push( form.redirectList[ i ].value );
						}
					}
					if (redirects.length === 0) {
						redirects.push(form.redirectList.value);
					}
				} else {
					redirectTemplateCode = form.declineOptions.value;
				}

				Morebits.status.init( form );
				var requestStatus = new Morebits.status( 'Marking request on page as ' + (accept ? 'accepted' : 'denied' ) );

				page.setPageSection( sectionID );
				requestStatus.info( 'Loading request page...' );

				if ( accept ) {
					// Get WikiProjects from target's talk page
					var targetPageTalkPage = new Morebits.wiki.page( 'Talk:' + target );
					targetPageTalkPage.load( function () {
						var talkPageText = '{' + '{sub' + 'st:WPAFC/redirect}}';
						if ( targetPageTalkPage.getPageText().indexOf("{" + "{Disambig" + "Project}}") > -1 || targetPageTalkPage.getPageText().indexOf("{" + "{ Disambig" + "Project }}") > -1 ) {
							talkPageText += '\n{' + '{WikiProject ' + 'Disambiguation|class=redirect}}';
						}
						var match = targetPageTalkPage.getPageText().match( /\{\{ ?((W|w)ikiProject |(W|w)P)(?!Articles for creation)(.*?)(?=\n|\||}})/g );
						if ( match !== null ) {
							for ( var t = 0; t < match.length; t++ ) {
								talkPageText += '\n' + match[ t ] + '|class=redirect}}';
							}
						}

						// Get ready to do some crazy recursion to get around making functions
						// in loops without really solving the problem...
						var index = -1;
						var createRedirectFunction = function () {
							index++;
							var redirectPage = new Morebits.wiki.page( redirects[ index ] );
							redirectPage.load( function () { // Load redirect
								// Create redirect page
								redirectPage.setPageText( '#REDIRECT [[' + target + ']]' + redirectType );
								redirectPage.setEditSummary( 'Creating redirect per request - Using [[User:PhantomTech/scripts/AFCRHS.js|AFC/R HS]]' );
								redirectPage.setCreateOption( 'createonly' );
								redirectPage.setMaxRetries(5);
								redirectPage.save( function () { // Save redirect
									// When that's done...
									var redirectTalkPage = new Morebits.wiki.page( 'Talk:' + redirects[ index ] );
									redirectTalkPage.load( function () { // Load redirect talk
										// Create redirect talk page
										redirectTalkPage.setPageText( talkPageText );
										redirectTalkPage.setEditSummary( 'Creating redirect talk page per request - Using [[User:PhantomTech/scripts/AFCRHS.js|AFC/R HS]]' );
										redirectPage.setMaxRetries(5);
										redirectTalkPage.save( function () { // Save redirect talk
											// When that's done... Do it all over again!
											if ( index + 1 < redirects.length ) {
												createRedirectFunction();
												//setTimeout(createRedirectFunction, 1000);
											} else {
												page.load( function () { // Edit Request
													var text = page.getPageText();
													var match = text.match( /(==.*?==\n)((.|\n)*)/ );

													text = match[ 1 ] + '{' + '{afc-c|' + ( accept ? 'a' : 'd' ) + '}}\n' + match[ 2 ] + '\n:{' + '{su' + 'bst:afc redirect|' + redirectTemplateCode + '|' + comment + '}} ~~' + '~~\n{' + '{afc' + '-c|b}}';

													page.setPageSection( sectionID );
													page.setPageText( text );
													page.setMaxConflictRetries( 0 );
													page.setEditSummary( 'Responding to redirect request with [[User:PhantomTech/scripts/AFCRHS.js|AFC/R HS]]' );
													page.save();
												} );
											}
										} );
									} );
								} );
							} );
						};

						createRedirectFunction();
						//setTimeout(createRedirectFunction, 1000);
					} );
				} else {
					page.load( function () { // Edit request
						var text = page.getPageText();
						var match = text.match( /(==.*?==\n)((.|\n)*)/ );

						text = match[ 1 ] + '{' + '{afc-c|' + ( accept ? 'a' : 'd' ) + '}}\n' + match[ 2 ] + '\n:{' + '{su' + 'bst:afc redirect|' + redirectTemplateCode + '|' + comment + '}} ~~' + '~~\n{' + '{afc' + '-c|b}}';

						page.setPageSection( sectionID );
						page.setPageText( text );
						page.setMaxConflictRetries( 0 );
						page.setEditSummary( 'Responding to redirect request with [[User:PhantomTech/scripts/AFCRHS.js|AFC/R HS]]' );
						page.save();
					} );
				}
			} );
		}

		// Only start on the right page and if we're working with the current version
		if ( mw.config.get( 'wgPageName' ) === 'Wikipedia:Articles_for_creation/Redirects' && mw.config.get( 'wgRevisionId' ) === mw.config.get( 'wgCurRevisionId' ) ) {
			mw.loader.using( 'jquery.ui' );
			mw.loader.using( 'jquery.tipsy' );

			// Check if user is approved
			var checkPage = new Morebits.wiki.page( 'Wikipedia:WikiProject Articles for creation/Participants' );
			checkPage.setPageSection( 1 );
			checkPage.load( function () {
				var approvedUsers = checkPage.getPageText().match( /(?:\n\* ?\{\{user2\|(.*?)}})/g );
				if ( approvedUsers === null ) {
					alert( 'Failed to load checkpage' );
				} else if ( $.inArray( mw.user.getName(), approvedUsers ) ) {
					// Add links next to section headings
					$( 'h2:has(.mw-headline:contains("Redirect request"))' ).each( function () {
						var id = $( this ).children().last().find( 'a' ).attr( "href" ).match( /&section=(\d+)/i )[ 1 ];
						var $replyLink = $( '<span class="mw-editsection">[<a href="#null">Respond</a>]</span>' );
						$replyLink.click( function () {
							replyButton( id );
						} );

						$( this ).append( $replyLink );
					} );
				} else {
					alert( 'You aren\'t on the checkpage at [[Wikipedia:WikiProject Articles for creation/Participants]]' );
				}
			} );
		}
	} );
}( jQuery, mediaWiki ) );