MediaWiki:Gadget-twinklearv1.js

Vikipedi, özgür ansiklopedi

Not: Sayfayı kaydettikten sonra değişiklikleri görebilmek için tarayıcınızın önbelleğinizi temizlemeniz gerekir. Google Chrome, Firefox, Microsoft Edge ve Safari: ⇧ Shift tuşuna basılı tutun ve Yeniden Yükle araç çubuğu düğmesine tıklayın. Ayrıntılar ve diğer tarayıcılara yönelik yönergeler için Vikipedi:Önbelleğinizi atlayın sayfasını inceleyin.

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklearv.js: ARV module / Raporla modülü
 ****************************************
 * Mode of invocation:     Tab ("ARV") / Raporla
 * Active on:              Any page with relevant user name (userspace, contribs, etc.)
 */

Twinkle.arv = function twinklearv() {
	var username = mw.config.get('wgRelevantUserName');
	if (!username || username === mw.config.get('wgUserName')) {
		return;
	}

	var title = mw.util.isIPAddress(username) ? 'IP adresini hizmetlilere raporla' : 'Kullanıcıyı hizmetlilere raporla';

	Twinkle.addPortletLink(function() {
		Twinkle.arv.callback(username);
	}, 'Raporla', 'tw-arv', title);
};

Twinkle.arv.callback = function (uid) {
	var Window = new Morebits.simpleWindow(600, 500);
	Window.setTitle('Gelişmiş Raporlama'); // Backronym
	Window.setScriptName('Twinkle');
	Window.addFooterLink('Kuklacılık', 'Vikipedi:Kukla');
	Window.addFooterLink('Üç geri dönüş kuralı', 'VP:3GDK');
	Window.addFooterLink('Engelleme politikası', 'VP:EP');
	Window.addFooterLink('Twinkle yardım', 'Vikipedi tartışma:Twinkle');

	var form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
	var categories = form.append({
		type: 'select',
		name: 'category',
		label: 'Rapor türünü seçin: ',
		event: Twinkle.arv.callback.changeCategory
	});
	categories.append({
		type: 'option',
		label: 'Vandalizm (VP:V)',
		value: 'aiv'
	});
	categories.append({
		type: 'option',
		label: 'Kullanıcı adı (VP:KET)',
		value: 'username',
		disabled: mw.util.isIPAddress(uid)
	});
	categories.append({
		type: 'option',
		label: 'Kuklacı (VP:KUKLA)',
		value: 'sock'
	});
	categories.append({
		type: 'option',
		label: 'Kukla (VP:KUKLA)',
		value: 'puppet'
	});
	/* categories.append({
		type: 'option',
		label: 'Edit warring (WP:AN3)',
		value: 'an3'
	}); */ // Çalışmıyor
	form.append({
		type: 'field',
		label: 'Work area',
		name: 'work_area'
	});
	form.append({ type: 'submit' });
	form.append({
		type: 'hidden',
		name: 'uid',
		value: uid
	});

	var result = form.render();
	Window.setContent(result);
	Window.display();

	// We must init the
	var evt = document.createEvent('Event');
	evt.initEvent('change', true, true);
	result.category.dispatchEvent(evt);
};

Twinkle.arv.callback.changeCategory = function (e) {
	var value = e.target.value;
	var root = e.target.form;
	var old_area = Morebits.quickForm.getElements(root, 'work_area')[0];
	var work_area = null;

	switch (value) {
		case 'aiv':
		/* falls through */
		default:
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Kullanıcıyı vandalizm yüzünden bildir',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Birincil bağlantılı sayfa: ',
				tooltip: 'Raporda herhangi bir sayfaya bağlantı vermemek için boş bırakın',
				value: mw.util.getParamValue('vanarticle') || '',
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					if (value === '') {
						root.badid.disabled = root.goodid.disabled = true;
					} else {
						root.badid.disabled = false;
						root.goodid.disabled = root.badid.value === '';
					}
				}
			});
			work_area.append({
				type: 'input',
				name: 'badid',
				label: 'Vandalizme uğramış sayfanın revizyon ID\'si ',
				tooltip: 'Revizyon ID\'si eklememek için boş bırakın',
				value: mw.util.getParamValue('vanarticlerevid') || '',
				disabled: !mw.util.getParamValue('vanarticle'),
				event: function(e) {
					var value = e.target.value;
					var root = e.target.form;
					root.goodid.disabled = value === '';
				}
			});
			work_area.append({
				type: 'input',
				name: 'goodid',
				label: 'Sayfanın vandalizmden önceki revizyon ID\'si: ',
				tooltip: 'Önceki haline ait revizyon ID\'si eklememek için boş bırakın',
				value: mw.util.getParamValue('vanarticlegoodrevid') || '',
				disabled: !mw.util.getParamValue('vanarticle') || mw.util.getParamValue('vanarticlerevid')
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Birden çok kez uyarılmasına rağmen yapılan vandalizm',
						value: 'final'
					},
					{
						label: 'Engeli bittikten sonra (1 gün içinde) yapılan vandalizm',
						value: 'postblock'
					},
					{
						label: 'Sadece vandalizm amaçlı hesap',
						value: 'vandalonly',
						disabled: mw.util.isIPAddress(root.uid.value)
					},
					{
						label: 'Yalnızca reklam amaçlı hesap',
						value: 'promoonly',
						disabled: mw.util.isIPAddress(root.uid.value)
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Yorum: '
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'username':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Kullanıcı adı ihlali bildir',
				name: 'work_area'
			});
			work_area.append({
				type: 'header',
				label: 'Uygunsuz kullanıcı adı türleri',
				tooltip: 'Vikipedi, yanıltıcı, tanıtım amaçlı veya rahatsız edici kullanıcı adlarına izin vermez. Alan adları ve e-posta adresleri de aynı şekilde yasaktır. Bu kriterler hem kullanıcı adları hem de imzaları için geçerlidir. Başka bir dilde uygunsuz olan veya yazım hataları ve değiştirmelerle uygunsuz bir adı temsil eden veya bunu dolaylı veya dolaylı olarak yapan kullanıcı adları da uygunsuz olarak kabul edilir.'
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Şaşırtıcı, yanlış yönlendirici, problem yaratıcı kullanıcı adı',
						value: 'şaşırtıcı, yanlış yönlendirici, problem yaratıcı',
						tooltip: 'Diğer kullanıcılarla karıştırılabilecek adlar. Vikipedi\'de sık kullanılan yazılım veya toplulukla ilgili terimler veya Vikipedi\'de resmi bir pozisyonu ima eden adlar. "Administrator", "Pagemove", "System operator" vb.'
					},
					{
						label: 'Ticari marka içeren kullanıcı adı',
						value: 'ticari marka içeren',
						tooltip: 'Ticari markalar ve özellikle spor kulüplerinin isimleri, kullanıcı adı olarak kullanılamaz.'
					},
					{
						label: 'Taciz edici veya karalayıcı kullanıcı adı',
						value: 'taciz edici veya karalayıcı',
						tooltip: 'Hakaret, küfür vs. Veya diğer kullanıcıların kişisel bilgilerini (telefon numarası, cadde/sokak/adres şeklinde) ifşa eder nitelik.'
					},
					{
						label: 'Spam amaçlı veya reklam içeren kullanıcı adı',
						value: 'spam amaçlı veya reklam içeren',
						tooltip: 'Belirli bir web sitesinin, şirketin vs. reklamını yapan kullanıcı adları bloke edilir.'
					},
					{
						label: 'Halen yaşayan tanınmış ya da yeni ölmüş tanınmış kişi adı',
						value: 'tanınmış kişi adı',
						tooltip: '(örneğin, Şener Şen, Michael Jackson, vb.) Ancak, eğer siz gerçekten "o kişi" iseniz durum değişir ve bunu kullanıcı sayfanızda açıkça belirtilmesi beklenir.'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Yorum:'
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;

		case 'puppet':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Şüpheli kuklayı bildir',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'input',
					name: 'sockmaster',
					label: 'Kuklacı',
					tooltip: 'Kuklacının kullanıcı adı Kullanıcı: ön eki olmadan'
				}
			);
			work_area.append({
				type: 'textarea',
				label: 'Deliller:',
				name: 'evidence',
				tooltip: 'Kanıtınızı girin. Bu kullanıcıların her birinin birden fazla hesabı suistimal edeceği açıkça belirtilmelidir. Genellikle bu, kullanıcıların neden a) aynı ve b) yıkıcı olduğunu doğrulayan farklı bilgiler, sayfa geçmişleri veya diğer bilgiler anlamına gelir. Bu sadece konuyu yargılamak için gerekli kanıt ve bilgi olmalıdır.'
			});
			work_area.append({
				type: 'checkbox',
				list: [
					{
						label: 'Gözetmenden kanıt isteyin',
						name: 'checkuser',
						tooltip: 'Bu seçenek devre dışıdır. Seçilirse görmezden gelinecektir.'
					},
					{
						label: 'Raporlanan kullanıcılara bildir',
						name: 'notify',
						tooltip: 'Bildirim zorunlu değildir.'
					}
				]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'sock':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Şüpheli kuklacıyı bildir',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'dyninput',
					name: 'sockpuppet',
					label: 'Kuklalar',
					sublabel: 'Kukla: ',
					tooltip: 'Kuklanın kullanıcı adı Kullanıcı: ön eki olmadan',
					min: 2
				});
			work_area.append({
				type: 'textarea',
				label: 'Deliller:',
				name: 'evidence',
				tooltip: 'Kanıtınızı girin. Bu kullanıcıların her birinin birden fazla hesabı suistimal edeceği açıkça belirtilmelidir. Genellikle bu, kullanıcıların neden a) aynı ve b) yıkıcı olduğunu doğrulayan farklı bilgiler, sayfa geçmişleri veya diğer bilgiler anlamına gelir. Bu sadece konuyu yargılamak için gerekli kanıt ve bilgi olmalıdır.'
			});
			work_area.append({
				type: 'checkbox',
				list: [
					{
						label: 'Gözetmenden kanıt isteyin',
						name: 'checkuser',
						tooltip: 'Bu seçenek devre dışıdır. Seçilirse görmezden gelinecektir.'
					},
					{
						label: 'Raporlanan kullanıcılara bildir',
						name: 'notify',
						tooltip: 'Bildirim zorunlu değildir.'
					}
				]
			});
			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
		case 'an3':
			work_area = new Morebits.quickForm.element({
				type: 'field',
				label: 'Report edit warring',
				name: 'work_area'
			});

			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Page',
				tooltip: 'The page being reported'
			});
			work_area.append({
				type: 'button',
				name: 'load',
				label: 'Load',
				event: function(e) {
					var root = e.target.form;
					var value = root.page.value;
					var uid = root.uid.value;
					var $diffs = $(root).find('[name=diffs]');
					$diffs.find('.entry').remove();

					var date = new Date();
					date.setHours(date.getHours() - 48); // all since 48 hours

					var api = new mw.Api();
					api.get({
						action: 'query',
						prop: 'revisions',
						format: 'json',
						rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
						rvlimit: 500, // intentionally limited
						rvend: date.toISOString(),
						rvuser: uid,
						indexpageids: true,
						redirects: true,
						titles: value
					}).done(function(data) {
						var pageid = data.query.pageids[0];
						var page = data.query.pages[pageid];
						if (!page.revisions) {
							return;
						}
						for (var i = 0; i < page.revisions.length; ++i) {
							var rev = page.revisions[i];
							var $entry = $('<div/>', {
								'class': 'entry'
							});
							var $input = $('<input/>', {
								'type': 'checkbox',
								'name': 's_diffs',
								'value': rev.revid
							});
							$input.data('revinfo', rev);
							$input.appendTo($entry);
							$entry.append('<span>"' + rev.parsedcomment + '" at <a href="' + mw.config.get('wgScript') + '?diff=' + rev.revid + '">' + moment(rev.timestamp).calendar() + '</a></span>').appendTo($diffs);
						}
					}).fail(function(data) {
						console.log('API failed :(', data); // eslint-disable-line no-console
					});
					var $warnings = $(root).find('[name=warnings]');
					$warnings.find('.entry').remove();

					api.get({
						action: 'query',
						prop: 'revisions',
						format: 'json',
						rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
						rvlimit: 500, // intentionally limited
						rvend: date.toISOString(),
						rvuser: mw.config.get('wgUserName'),
						indexpageids: true,
						redirects: true,
						titles: 'User talk:' + uid
					}).done(function(data) {
						var pageid = data.query.pageids[0];
						var page = data.query.pages[pageid];
						if (!page.revisions) {
							return;
						}
						for (var i = 0; i < page.revisions.length; ++i) {
							var rev = page.revisions[i];
							var $entry = $('<div/>', {
								'class': 'entry'
							});
							var $input = $('<input/>', {
								'type': 'checkbox',
								'name': 's_warnings',
								'value': rev.revid
							});
							$input.data('revinfo', rev);
							$input.appendTo($entry);
							$entry.append('<span>"' + rev.parsedcomment + '" at <a href="' + mw.config.get('wgScript') + '?diff=' + rev.revid + '">' + moment(rev.timestamp).calendar() + '</a></span>').appendTo($warnings);
						}
					}).fail(function(data) {
						console.log('API failed :(', data); // eslint-disable-line no-console
					});

					var $resolves = $(root).find('[name=resolves]');
					$resolves.find('.entry').remove();

					var t = new mw.Title(value);
					var ns = t.getNamespaceId();
					var talk_page = new mw.Title(t.getMain(), ns % 2 ? ns : ns + 1).getPrefixedText();

					api.get({
						action: 'query',
						prop: 'revisions',
						format: 'json',
						rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
						rvlimit: 500, // intentionally limited
						rvend: date.toISOString(),
						rvuser: mw.config.get('wgUserName'),
						indexpageids: true,
						redirects: true,
						titles: talk_page
					}).done(function(data) {
						var pageid = data.query.pageids[0];
						var page = data.query.pages[pageid];
						if (!page.revisions) {
							return;
						}
						for (var i = 0; i < page.revisions.length; ++i) {
							var rev = page.revisions[i];
							var $entry = $('<div/>', {
								'class': 'entry'
							});
							var $input = $('<input/>', {
								'type': 'checkbox',
								'name': 's_resolves',
								'value': rev.revid
							});
							$input.data('revinfo', rev);
							$input.appendTo($entry);
							$entry.append('<span>"' + rev.parsedcomment + '" at <a href="' + mw.config.get('wgScript') + '?diff=' + rev.revid + '">' + moment(rev.timestamp).calendar() + '</a></span>').appendTo($resolves);
						}

						// add free form input
						var $free_entry = $('<div/>', {
							'class': 'entry'
						});
						var $free_input = $('<input/>', {
							'type': 'text',
							'name': 's_resolves_free'
						});

						var $free_label = $('<label/>', {
							'for': 's_resolves_free',
							'html': 'Diff to additional discussions: '
						});
						$free_entry.append($free_label).append($free_input).appendTo($resolves);

					}).fail(function(data) {
						console.log('API failed :(', data); // eslint-disable-line no-console
					});
				}
			});
			work_area.append({
				type: 'field',
				name: 'diffs',
				label: 'User\'s reverts',
				tooltip: 'Select the edits you believe are reverts'
			});
			work_area.append({
				type: 'field',
				name: 'warnings',
				label: 'Warnings given to subject',
				tooltip: 'You must have warned the subject before reporting'
			});
			work_area.append({
				type: 'field',
				name: 'resolves',
				label: 'Resolution initiatives',
				tooltip: 'You should have tried to resolve the issue on the talk page first'
			});

			work_area.append({
				type: 'textarea',
				label: 'Comment:',
				name: 'comment'
			});

			work_area = work_area.render();
			old_area.parentNode.replaceChild(work_area, old_area);
			break;
	}
};

Twinkle.arv.callback.evaluate = function(e) {
	var form = e.target;
	var reason = '';
	var comment = '';
	if (form.reason) {
		comment = form.reason.value;
	}
	var uid = form.uid.value;

	var types;
	switch (form.category.value) {

		// Report user for vandalism
		case 'aiv':
			/* falls through */
		default:
			types = form.getChecked('arvtype');
			if (!types.length && comment === '') {
				alert('Bir sebep belirtmelisiniz');
				return;
			}

			types = types.map(function(v) {
				switch (v) {
					case 'final':
						return 'birden çok kez uyarılmasına rağmen yapılan vandalizm';
					case 'postblock':
						return 'engeli bittikten sonra (1 gün içinde) yapılan vandalizm';
					case 'vandalonly':
						return 'sadece vandalizm amaçlı hesap';
					case 'spambot':
						return 'account is evidently a spambot or a compromised account';
					case 'promoonly':
						return 'yalnızca reklam amaçlı hesap';
					default:
						return 'bilinmeyen sebep';
				}
			}).join('; ');


			if (form.page.value !== '') {
				// Allow links to redirects, files, and categories
				reason = '{{Yönlenme|:' + form.page.value + '}} sayfasında';

				if (form.badid.value !== '') {
					reason += ' ({{Fark|' + form.page.value + '|' + form.badid.value + '|' + form.goodid.value + '|Fark}})';
				}
				reason += ':';
			}

			if (types) {
				reason += ' ' + types;
			}
			if (comment !== '') {
				reason += (reason === '' ? '' : '. ') + comment;
			}
			reason = reason.trim();
			if (reason.search(/[.?!;]$/) === -1) {
				reason += '.';
			}
			reason += ' ~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);

			Morebits.wiki.actionCompleted.redirect = 'VP:KET';
			Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

			var aivPage = new Morebits.wiki.page('VP:KET', 'KET isteği işleniyor');
			//aivPage.setPageSection(1);
			aivPage.setFollowRedirect(true);

			aivPage.load(function() {
				var text = aivPage.getPageText();

			
				aivPage.getStatusElement().status('Yeni rapor ekleniyor...');
				aivPage.setEditSummary('[[Özel:Katkılar/' + uid + '|' + uid + ']] raporlanıyor.' + Twinkle.getPref('summaryAd'));
				aivPage.setAppendText('\n' + '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon|1=' + uid + '}} &ndash; ' + reason);
				aivPage.append();
			});
			break;

		// Report inappropriate username
		case 'username':
			types = form.getChecked('arvtype').map(Morebits.string.toLowerCaseFirstChar);

			var hasShared = types.indexOf('shared') > -1;
			if (hasShared) {
				types.splice(types.indexOf('shared'), 1);
			}

			if (types.length <= 2) {
				types = types.join(' ve ');
			} else {
				types = [ types.slice(0, -1).join(', '), types.slice(-1) ].join(' ve ');
			}
			var article = '';
			if (/[aeiouwyh]/.test(types[0] || '')) { // non 100% correct, but whatever, including 'h' for Cockney
				article = '';
			}
			reason = '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon|1=' + uid + '}} &ndash; ';
			if (types.length || hasShared) {
				reason += 'Kullanıcı adı politikası ihlali: ' + article + ' ' + types + ' kullanıcı adı' +
					(hasShared ? ' kullanıcı adı politikasının ihlali. ' : '. ');
			}
			if (comment !== '') {
				reason += Morebits.string.toUpperCaseFirstChar(comment) + '. ';
			}
			reason += '~~~~';
			reason = reason.replace(/\r?\n/g, '\n*:');  // indent newlines

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);

			Morebits.wiki.actionCompleted.redirect = 'Vikipedi:Kullanıcı engelleme talepleri';
			Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

			var uaaPage = new Morebits.wiki.page('Vikipedi:Kullanıcı engelleme talepleri', 'Ket isteği işleniyor');
			uaaPage.setFollowRedirect(true);

			uaaPage.load(function() {
				var text = uaaPage.getPageText();
				uaaPage.getStatusElement().status('Yeni rapor ekleniyor...');
				uaaPage.setEditSummary('Raporlanıyor [[Special:Contributions/' + uid + '|' + uid + ']].' + Twinkle.getPref('summaryAd'));
				uaaPage.setPageText(text + '\n' + reason);
				uaaPage.save();
			});
			break;

		// WP:SPI
		case 'sock':
			/* falls through */
		case 'puppet':
			var sockParameters = {
				evidence: form.evidence.value.trim(),
				checkuser: form.checkuser.checked,
				notify: form.notify.checked
			};

			var puppetReport = form.category.value === 'puppet';
			if (puppetReport && !form.sockmaster.value.trim()) {
				alert('Bu kuklacı için bir kukla hesabı girmediniz.');
				return;
			} else if (!puppetReport && !form.sockpuppet[0].value.trim()) {
				alert('Bu kuklacı için bir kukla hesabı girmediniz.');
				return;
			}

			sockParameters.uid = puppetReport ? form.sockmaster.value.trim() : uid;
			sockParameters.sockpuppets = puppetReport ? [uid] : $.map($('input:text[name=sockpuppet]', form), function(o) {
				return $(o).val() || null;
			});

			Morebits.simpleWindow.setButtonsEnabled(false);
			Morebits.status.init(form);
			Twinkle.arv.processSock(sockParameters);
			break;

		case 'an3':
			var diffs = $.map($('input:checkbox[name=s_diffs]:checked', form), function(o) {
				return $(o).data('revinfo');
			});

			if (diffs.length < 3 && !confirm('You have selected fewer than three offending edits. Do you wish to make the report anyway?')) {
				return;
			}

			var warnings = $.map($('input:checkbox[name=s_warnings]:checked', form), function(o) {
				return $(o).data('revinfo');
			});

			if (!warnings.length && !confirm('You have not selected any edits where you warned the offender. Do you wish to make the report anyway?')) {
				return;
			}

			var resolves = $.map($('input:checkbox[name=s_resolves]:checked', form), function(o) {
				return $(o).data('revinfo');
			});
			var free_resolves = $('input[name=s_resolves_free]').val();

			var an3_next = function(free_resolves) {
				if (!resolves.length && !free_resolves && !confirm('You have not selected any edits where you tried to resolve the issue. Do you wish to make the report anyway?')) {
					return;
				}

				var an3Parameters = {
					'uid': uid,
					'page': form.page.value.trim(),
					'comment': form.comment.value.trim(),
					'diffs': diffs,
					'warnings': warnings,
					'resolves': resolves,
					'free_resolves': free_resolves
				};

				Morebits.simpleWindow.setButtonsEnabled(false);
				Morebits.status.init(form);
				Twinkle.arv.processAN3(an3Parameters);
			};

			if (free_resolves) {
				var oldid = mw.util.getParamValue('oldid', free_resolves);
				var api = new mw.Api();
				api.get({
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'ids|timestamp|comment',
					indexpageids: true,
					revids: oldid
				}).done(function(data) {
					var pageid = data.query.pageids[0];
					var page = data.query.pages[pageid];
					an3_next(page);
				}).fail(function(data) {
					console.log('API hatası :(', data); // eslint-disable-line no-console
				});
			} else {
				an3_next();
			}
			break;
	}
};

Twinkle.arv.processSock = function(params) {
	Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

	// notify all user accounts if requested
	if (params.notify && params.sockpuppets.length > 0) {

		var notifyEditSummary = 'Kuklacılık şüphesi hakkında bildirim.' + Twinkle.getPref('summaryAd');
		var notifyText = '\n\n{{subst:kuklacılıkşüphesibildirim|1=' + params.uid + '}} ~~~~';

		// notify user's master account
		var masterTalkPage = new Morebits.wiki.page('User talk:' + params.uid, 'Şüpheli kuklacıya bildirim gönderiliyor');
		masterTalkPage.setFollowRedirect(true);
		masterTalkPage.setEditSummary(notifyEditSummary);
		masterTalkPage.setAppendText(notifyText);
		masterTalkPage.append();

		var statusIndicator = new Morebits.status('Şüpheli kuklalara bildirim gönderiliyor', '0%');
		var total = params.sockpuppets.length;
		var current = 0;

		// display status of notifications as they progress
		var onSuccess = function(sockTalkPage) {
			var now = parseInt(100 * ++current / total, 10) + '%';
			statusIndicator.update(now);
			sockTalkPage.getStatusElement().unlink();
			if (current >= total) {
				statusIndicator.info(now + ' (tamamlandı)');
			}
		};

		var socks = params.sockpuppets;

		// notify each puppet account
		for (var i = 0; i < socks.length; ++i) {
			var sockTalkPage = new Morebits.wiki.page('Kullanıcı mesaj:' + socks[i], 'Bildiriliyor ' + socks[i]);
			sockTalkPage.setFollowRedirect(true);
			sockTalkPage.setEditSummary(notifyEditSummary);
			sockTalkPage.setAppendText(notifyText);
			sockTalkPage.append(onSuccess);
		}
	}

	// prepare the SPI report
	var text = '\n\n{{subst:Vikipedi:Denetçi isteği/Giriş kutusu/Twinkle|socksraw=' +
		params.sockpuppets.map(function(v) {
			return '* {{' + (mw.util.isIPAddress(v) ? 'checkip' : 'checkuser') + '|1=' + v + '}}';
		}).join('\n') + '\n|evidence=' + params.evidence + ' \n';

	if (params.checkuser) {
		text += '|checkuser=yes';
	}
	text += '}}';

	var reportpage = 'Vikipedi:Denetçi isteği/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = 'Raporlama tamamlandı';

	var spiPage = new Morebits.wiki.page(reportpage, 'Tartışma sayfasını alınıyor');
	spiPage.setFollowRedirect(true);
	spiPage.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] için denetçi isteği ekleniyor.' + Twinkle.getPref('summaryAd'));
	spiPage.setAppendText(text);
	switch (Twinkle.getPref('spiWatchReport')) {
		case 'yes':
			spiPage.setWatchlist(true);
			break;
		case 'no':
			spiPage.setWatchlistFromPreferences(false);
			break;
		default:
			spiPage.setWatchlistFromPreferences(true);
			break;
	}
	spiPage.append();

	Morebits.wiki.removeCheckpoint();  // all page updates have been started
};

Twinkle.arv.processAN3 = function(params) {
	// prepare the AN3 report
	var minid;
	for (var i = 0; i < params.diffs.length; ++i) {
		if (params.diffs[i].parentid && (!minid || params.diffs[i].parentid < minid)) {
			minid = params.diffs[i].parentid;
		}
	}

	var api = new mw.Api();
	api.get({
		action: 'query',
		prop: 'revisions',
		format: 'json',
		rvprop: 'sha1|ids|timestamp|comment',
		rvlimit: 100, // intentionally limited
		rvstartid: minid,
		rvexcludeuser: params.uid,
		indexpageids: true,
		redirects: true,
		titles: params.page
	}).done(function(data) {
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"
		var orig;
		if (data.length) {
			var sha1 = data[0].sha1;
			for (var i = 1; i < data.length; ++i) {
				if (data[i].sha1 === sha1) {
					orig = data[i];
					break;
				}
			}

			if (!orig) {
				orig = data[0];
			}
		}

		var origtext = '';
		if (orig) {
			origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} "' + orig.comment + '"';
		}

		var grouped_diffs = {};

		var parentid, lastid;
		for (var j = 0; j < params.diffs.length; ++j) {
			var cur = params.diffs[j];
			if ((cur.revid && cur.revid !== parentid) || lastid === null) {
				lastid = cur.revid;
				grouped_diffs[lastid] = [];
			}
			parentid = cur.parentid;
			grouped_diffs[lastid].push(cur);
		}

		var difftext = $.map(grouped_diffs, function(sub) {
			var ret = '';
			if (sub.length >= 2) {
				var last = sub[0];
				var first = sub.slice(-1)[0];
				var label = 'Consecutive edits made from ' + moment(first.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + ' to ' + moment(last.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]');
				ret = '# {{diff|oldid=' + first.parentid + '|diff=' + last.revid + '|label=' + label + '}}\n';
			}
			ret += sub.reverse().map(function(v) {
				return (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
			}).join('\n');
			return ret;
		}).reverse().join('\n');
		var warningtext = params.warnings.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
		}).join('\n');
		var resolvetext = params.resolves.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + moment(v.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + '}} "' + v.comment + '"';
		}).join('\n');

		if (params.free_resolves) {
			var page = params.free_resolves;
			var rev = page.revisions[0];
			resolvetext += '\n# ' + ' {{diff2|' + rev.revid + '|' + moment(rev.timestamp).utc().format('HH:mm, D MMMM YYYY [(UTC)]') + ' on ' + page.title + '}} "' + rev.comment + '"';
		}

		var comment = params.comment.replace(/~*$/g, '').trim();

		if (comment) {
			comment += ' ~~~~';
		}

		var text = '\n\n' + '{{subst:AN3 report|diffs=' + difftext + '|warnings=' + warningtext + '|resolves=' + resolvetext + '|pagename=' + params.page + '|orig=' + origtext + '|comment=' + comment + '|uid=' + params.uid + '}}';

		var reportpage = 'Vikipedi:Hizmetli duyuru panosu/3GK';

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = 'Reporting complete';

		var an3Page = new Morebits.wiki.page(reportpage, 'Retrieving discussion page');
		an3Page.setFollowRedirect(true);
		an3Page.setEditSummary('Adding new report for [[Special:Contributions/' + params.uid + '|' + params.uid + ']].' + Twinkle.getPref('summaryAd'));
		an3Page.setAppendText(text);
		an3Page.append();

		// notify user

		var notifyEditSummary = 'Notifying about edit warring noticeboard discussion.' + Twinkle.getPref('summaryAd');
		var notifyText = '\n\n{{subst:an3-notice|1=' + mw.util.wikiUrlencode(params.uid) + '|auto=1}} ~~~~';

		var talkPage = new Morebits.wiki.page('User talk:' + params.uid, 'Notifying edit warrior');
		talkPage.setFollowRedirect(true);
		talkPage.setEditSummary(notifyEditSummary);
		talkPage.setAppendText(notifyText);
		talkPage.append();
		Morebits.wiki.removeCheckpoint();  // all page updates have been started
	}).fail(function(data) {
		console.log('API failed :(', data); // eslint-disable-line no-console
	});
};
})(jQuery);


// </nowiki>