<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchprotect.js</id>
	<title>MediaWiki:Gadget-twinklebatchprotect.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://eurovision.jobogamer.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchprotect.js"/>
	<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;action=history"/>
	<updated>2026-06-11T12:28:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=67&amp;oldid=prev</id>
		<title>Alfie: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=67&amp;oldid=prev"/>
		<updated>2026-03-19T09:58:26Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:58, 19 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Alfie</name></author>
	</entry>
	<entry>
		<id>https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=66&amp;oldid=prev</id>
		<title>en&gt;Novem Linguae: Repo at 58a0dd8: switch to camelcase, part 1 (#2245)</title>
		<link rel="alternate" type="text/html" href="https://eurovision.jobogamer.xyz/index.php?title=MediaWiki:Gadget-twinklebatchprotect.js&amp;diff=66&amp;oldid=prev"/>
		<updated>2025-11-25T20:41:30Z</updated>

		<summary type="html">&lt;p&gt;Repo at 58a0dd8: switch to camelcase, part 1 (#2245)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// &amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 ****************************************&lt;br /&gt;
 *** twinklebatchprotect.js: Batch protect module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;P-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing project pages and user pages; existing and&lt;br /&gt;
 *                         non-existing categories; Special:PrefixIndex&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect = function twinklebatchprotect() {&lt;br /&gt;
	if (Morebits.userIsSysop &amp;amp;&amp;amp; ((mw.config.get(&amp;#039;wgArticleId&amp;#039;) &amp;gt; 0 &amp;amp;&amp;amp; (mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 2 ||&lt;br /&gt;
		mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 4)) || mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 14 ||&lt;br /&gt;
		mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;Prefixindex&amp;#039;)) {&lt;br /&gt;
		Twinkle.addPortletLink(Twinkle.batchprotect.callback, &amp;#039;P-batch&amp;#039;, &amp;#039;tw-pbatch&amp;#039;, &amp;#039;Protect pages linked from this page&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.unlinkCache = {};&lt;br /&gt;
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {&lt;br /&gt;
	const Window = new Morebits.SimpleWindow(600, 400);&lt;br /&gt;
	Window.setTitle(&amp;#039;Batch protection&amp;#039;);&lt;br /&gt;
	Window.setScriptName(&amp;#039;Twinkle&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Protection policy&amp;#039;, &amp;#039;WP:PROT&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Twinkle help&amp;#039;, &amp;#039;WP:TW/DOC#protect&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(&amp;#039;Give feedback&amp;#039;, &amp;#039;WT:TW&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	const form = new Morebits.QuickForm(Twinkle.batchprotect.callback.evaluate);&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
		event: Twinkle.protect.formevents.editmodify,&lt;br /&gt;
		list: [&lt;br /&gt;
			{&lt;br /&gt;
				label: &amp;#039;Modify edit protection&amp;#039;,&lt;br /&gt;
				value: &amp;#039;editmodify&amp;#039;,&lt;br /&gt;
				name: &amp;#039;editmodify&amp;#039;,&lt;br /&gt;
				tooltip: &amp;#039;Only for existing pages.&amp;#039;,&lt;br /&gt;
				checked: true&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;editlevel&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Edit protection:&amp;#039;,&lt;br /&gt;
		event: Twinkle.protect.formevents.editlevel,&lt;br /&gt;
		list: Twinkle.protect.protectionLevels&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;editexpiry&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Expires:&amp;#039;,&lt;br /&gt;
		event: function(e) {&lt;br /&gt;
			if (e.target.value === &amp;#039;custom&amp;#039;) {&lt;br /&gt;
				Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		list: Twinkle.protect.protectionLengths // Default (2 days) set after render&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
		event: Twinkle.protect.formevents.movemodify,&lt;br /&gt;
		list: [&lt;br /&gt;
			{&lt;br /&gt;
				label: &amp;#039;Modify move protection&amp;#039;,&lt;br /&gt;
				value: &amp;#039;movemodify&amp;#039;,&lt;br /&gt;
				name: &amp;#039;movemodify&amp;#039;,&lt;br /&gt;
				tooltip: &amp;#039;Only for existing pages.&amp;#039;,&lt;br /&gt;
				checked: true&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;movelevel&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Move protection:&amp;#039;,&lt;br /&gt;
		event: Twinkle.protect.formevents.movelevel,&lt;br /&gt;
		// Autoconfirmed is required for a move, redundant&lt;br /&gt;
		list: Twinkle.protect.protectionLevels.filter((level) =&amp;gt; level.value !== &amp;#039;autoconfirmed&amp;#039;)&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;moveexpiry&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Expires:&amp;#039;,&lt;br /&gt;
		event: function(e) {&lt;br /&gt;
			if (e.target.value === &amp;#039;custom&amp;#039;) {&lt;br /&gt;
				Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		list: Twinkle.protect.protectionLengths // Default (2 days) set after render&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
		event: function twinklebatchprotectFormCreatemodifyEvent(e) {&lt;br /&gt;
			e.target.form.createlevel.disabled = !e.target.checked;&lt;br /&gt;
			e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === &amp;#039;all&amp;#039;);&lt;br /&gt;
			e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = e.target.checked ? &amp;#039;&amp;#039; : &amp;#039;transparent&amp;#039;;&lt;br /&gt;
		},&lt;br /&gt;
		list: [&lt;br /&gt;
			{&lt;br /&gt;
				label: &amp;#039;Modify create protection&amp;#039;,&lt;br /&gt;
				value: &amp;#039;createmodify&amp;#039;,&lt;br /&gt;
				name: &amp;#039;createmodify&amp;#039;,&lt;br /&gt;
				tooltip: &amp;#039;Only for pages that do not exist.&amp;#039;,&lt;br /&gt;
				checked: true&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;createlevel&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Create protection:&amp;#039;,&lt;br /&gt;
		event: Twinkle.protect.formevents.createlevel,&lt;br /&gt;
		list: Twinkle.protect.protectionLevels&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;createexpiry&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Expires:&amp;#039;,&lt;br /&gt;
		event: function(e) {&lt;br /&gt;
			if (e.target.value === &amp;#039;custom&amp;#039;) {&lt;br /&gt;
				Twinkle.protect.doCustomExpiry(e.target);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		list: Twinkle.protect.protectionLengths // Default (indefinite) set after render&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;header&amp;#039;,&lt;br /&gt;
		label: &amp;#039;&amp;#039; // horizontal rule&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		type: &amp;#039;input&amp;#039;,&lt;br /&gt;
		name: &amp;#039;reason&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Reason:&amp;#039;,&lt;br /&gt;
		size: 60,&lt;br /&gt;
		tooltip: &amp;#039;For the protection log and page history.&amp;#039;&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	const query = {&lt;br /&gt;
		action: &amp;#039;query&amp;#039;,&lt;br /&gt;
		prop: &amp;#039;revisions|info|imageinfo&amp;#039;,&lt;br /&gt;
		rvprop: &amp;#039;size|user&amp;#039;,&lt;br /&gt;
		inprop: &amp;#039;protection&amp;#039;,&lt;br /&gt;
		format: &amp;#039;json&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	if (mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 14) { // categories&lt;br /&gt;
		query.generator = &amp;#039;categorymembers&amp;#039;;&lt;br /&gt;
		query.gcmtitle = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
		query.gcmlimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
	} else if (mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;Prefixindex&amp;#039;) {&lt;br /&gt;
		query.generator = &amp;#039;allpages&amp;#039;;&lt;br /&gt;
		query.gapnamespace = mw.util.getParamValue(&amp;#039;namespace&amp;#039;) || $(&amp;#039;select[name=namespace]&amp;#039;).val();&lt;br /&gt;
		query.gapprefix = mw.util.getParamValue(&amp;#039;prefix&amp;#039;) || $(&amp;#039;input[name=prefix]&amp;#039;).val();&lt;br /&gt;
		query.gaplimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
	} else {&lt;br /&gt;
		query.generator = &amp;#039;links&amp;#039;;&lt;br /&gt;
		query.titles = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
		query.gpllimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	const statusdiv = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
	statusdiv.style.padding = &amp;#039;15px&amp;#039;; // just so it doesn&amp;#039;t look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.Status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	const statelem = new Morebits.Status(&amp;#039;Grabbing list of pages&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	const wikipediaApi = new Morebits.wiki.Api(&amp;#039;loading...&amp;#039;, query, ((apiobj) =&amp;gt; {&lt;br /&gt;
		const response = apiobj.getResponse();&lt;br /&gt;
		const pages = (response.query &amp;amp;&amp;amp; response.query.pages) || [];&lt;br /&gt;
		const list = [];&lt;br /&gt;
		pages.sort(Twinkle.sortByNamespace);&lt;br /&gt;
		pages.forEach((page) =&amp;gt; {&lt;br /&gt;
			const metadata = [];&lt;br /&gt;
			const missing = !!page.missing;&lt;br /&gt;
			let editProt;&lt;br /&gt;
&lt;br /&gt;
			if (missing) {&lt;br /&gt;
				metadata.push(&amp;#039;page does not exist&amp;#039;);&lt;br /&gt;
				editProt = page.protection.filter((pr) =&amp;gt; pr.type === &amp;#039;create&amp;#039; &amp;amp;&amp;amp; pr.level === &amp;#039;sysop&amp;#039;).pop();&lt;br /&gt;
			} else {&lt;br /&gt;
				if (page.redirect) {&lt;br /&gt;
					metadata.push(&amp;#039;redirect&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				if (page.ns === 6) {&lt;br /&gt;
					metadata.push(&amp;#039;uploader: &amp;#039; + page.imageinfo[0].user);&lt;br /&gt;
					metadata.push(&amp;#039;last edit from: &amp;#039; + page.revisions[0].user);&lt;br /&gt;
				} else {&lt;br /&gt;
					metadata.push(mw.language.convertNumber(page.revisions[0].size) + &amp;#039; bytes&amp;#039;);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				editProt = page.protection&lt;br /&gt;
					.filter((pr) =&amp;gt; pr.type === &amp;#039;edit&amp;#039; &amp;amp;&amp;amp; pr.level === &amp;#039;sysop&amp;#039;)&lt;br /&gt;
					.pop();&lt;br /&gt;
			}&lt;br /&gt;
			if (editProt) {&lt;br /&gt;
				metadata.push(&amp;#039;fully&amp;#039; + (missing ? &amp;#039; create&amp;#039; : &amp;#039;&amp;#039;) + &amp;#039; protected&amp;#039; +&lt;br /&gt;
				(editProt.expiry === &amp;#039;infinity&amp;#039; ? &amp;#039; indefinitely&amp;#039; : &amp;#039;, expires &amp;#039; + new Morebits.Date(editProt.expiry).calendar(&amp;#039;utc&amp;#039;) + &amp;#039; (UTC)&amp;#039;));&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			const title = page.title;&lt;br /&gt;
			list.push({ label: title + (metadata.length ? &amp;#039; (&amp;#039; + metadata.join(&amp;#039;; &amp;#039;) + &amp;#039;)&amp;#039; : &amp;#039;&amp;#039;), value: title, checked: true, style: editProt ? &amp;#039;color:red&amp;#039; : &amp;#039;&amp;#039; });&lt;br /&gt;
		});&lt;br /&gt;
		form.append({ type: &amp;#039;header&amp;#039;, label: &amp;#039;Pages to protect&amp;#039; });&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: &amp;#039;Select All&amp;#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.QuickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: &amp;#039;Deselect All&amp;#039;,&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.QuickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, false);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
			shiftClickSupport: true,&lt;br /&gt;
			list: list&lt;br /&gt;
		});&lt;br /&gt;
		form.append({ type: &amp;#039;submit&amp;#039; });&lt;br /&gt;
&lt;br /&gt;
		const result = form.render();&lt;br /&gt;
		Window.setContent(result);&lt;br /&gt;
&lt;br /&gt;
		// Set defaults&lt;br /&gt;
		result.editexpiry.value = &amp;#039;2 days&amp;#039;;&lt;br /&gt;
		result.moveexpiry.value = &amp;#039;2 days&amp;#039;;&lt;br /&gt;
		result.createexpiry.value = &amp;#039;infinity&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		Morebits.QuickForm.getElements(result, &amp;#039;pages&amp;#039;).forEach(Twinkle.generateArrowLinks);&lt;br /&gt;
&lt;br /&gt;
	}), statelem);&lt;br /&gt;
&lt;br /&gt;
	wikipediaApi.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.currentProtectCounter = 0;&lt;br /&gt;
Twinkle.batchprotect.currentprotector = 0;&lt;br /&gt;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = &amp;#039;Batch protection is now complete&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	const form = event.target;&lt;br /&gt;
&lt;br /&gt;
	const numProtected = $(Morebits.QuickForm.getElements(form, &amp;#039;pages&amp;#039;))&lt;br /&gt;
		.filter((index, element) =&amp;gt; element.checked &amp;amp;&amp;amp; element.nextElementSibling.style.color === &amp;#039;red&amp;#039;)&lt;br /&gt;
		.length;&lt;br /&gt;
	if (numProtected &amp;gt; 0 &amp;amp;&amp;amp; !confirm(&amp;#039;You are about to act on &amp;#039; + mw.language.convertNumber(numProtected) + &amp;#039; fully protected page(s). Are you sure?&amp;#039;)) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	const input = Morebits.QuickForm.getInputData(form);&lt;br /&gt;
&lt;br /&gt;
	if (!input.reason) {&lt;br /&gt;
		alert(&amp;quot;You&amp;#039;ve got to give a reason, you rouge admin!&amp;quot;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Morebits.SimpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.Status.init(form);&lt;br /&gt;
&lt;br /&gt;
	if (input.pages.length === 0) {&lt;br /&gt;
		Morebits.Status.error(&amp;#039;Error&amp;#039;, &amp;#039;Nothing to protect, aborting&amp;#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	const batchOperation = new Morebits.BatchOperation(&amp;#039;Applying protection settings&amp;#039;);&lt;br /&gt;
	batchOperation.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
	batchOperation.setOption(&amp;#039;preserveIndividualStatusLines&amp;#039;, true);&lt;br /&gt;
	batchOperation.setPageList(input.pages);&lt;br /&gt;
	batchOperation.run((pageName) =&amp;gt; {&lt;br /&gt;
		const query = {&lt;br /&gt;
			action: &amp;#039;query&amp;#039;,&lt;br /&gt;
			titles: pageName,&lt;br /&gt;
			format: &amp;#039;json&amp;#039;&lt;br /&gt;
		};&lt;br /&gt;
		const wikipediaApi = new Morebits.wiki.Api(&amp;#039;Checking if page &amp;#039; + pageName + &amp;#039; exists&amp;#039;, query,&lt;br /&gt;
			Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);&lt;br /&gt;
		wikipediaApi.params = $.extend({&lt;br /&gt;
			page: pageName,&lt;br /&gt;
			batchOperation: batchOperation&lt;br /&gt;
		}, input);&lt;br /&gt;
		wikipediaApi.post();&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchprotect.callbacks = {&lt;br /&gt;
	main: function(apiobj) {&lt;br /&gt;
		const response = apiobj.getResponse();&lt;br /&gt;
&lt;br /&gt;
		if (response.query.normalized) {&lt;br /&gt;
			apiobj.params.page = response.query.normalized[0].to;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		const exists = !response.query.pages[0].missing;&lt;br /&gt;
&lt;br /&gt;
		const page = new Morebits.wiki.Page(apiobj.params.page, &amp;#039;Protecting &amp;#039; + apiobj.params.page);&lt;br /&gt;
		let takenAction = false;&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.editmodify) {&lt;br /&gt;
			page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (exists &amp;amp;&amp;amp; apiobj.params.movemodify) {&lt;br /&gt;
			page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!exists &amp;amp;&amp;amp; apiobj.params.createmodify) {&lt;br /&gt;
			page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);&lt;br /&gt;
			takenAction = true;&lt;br /&gt;
		}&lt;br /&gt;
		if (!takenAction) {&lt;br /&gt;
			Morebits.Status.warn(&amp;#039;Protecting &amp;#039; + apiobj.params.page, &amp;#039;page &amp;#039; + (exists ? &amp;#039;exists&amp;#039; : &amp;#039;does not exist&amp;#039;) + &amp;#039;; nothing to do, skipping&amp;#039;);&lt;br /&gt;
			apiobj.params.batchOperation.workerFailure(apiobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		page.setEditSummary(apiobj.params.reason);&lt;br /&gt;
		page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.addInitCallback(Twinkle.batchprotect, &amp;#039;batchprotect&amp;#039;);&lt;br /&gt;
}());&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>en&gt;Novem Linguae</name></author>
	</entry>
</feed>