MediaWiki:Gadget-twinklearv.js - Vikipedi
İçeriğe atla
Ana menü
Gezinti
  • Anasayfa
  • Hakkımızda
  • İçindekiler
  • Rastgele madde
  • Seçkin içerik
  • Yakınımdakiler
Katılım
  • Deneme tahtası
  • Köy çeşmesi
  • Son değişiklikler
  • Dosya yükle
  • Topluluk portalı
  • Wikimedia dükkânı
  • Yardım
  • Özel sayfalar
Vikipedi Özgür Ansiklopedi
Ara
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç

MediaWiki:Gadget-twinklearv.js

  • Arayüz metni
  • Tartışma
  • Oku
  • Kaynağı gör
  • Geçmişi gör
Araçlar
Eylemler
  • Oku
  • Kaynağı gör
  • Geçmişi gör
Genel
  • Sayfaya bağlantılar
  • İlgili değişiklikler
  • Kalıcı bağlantı
  • Sayfa bilgisi
  • Kısaltılmış URL'yi al
  • Karekodu indir
Yazdır/dışa aktar
  • Bir kitap oluştur
  • PDF olarak indir
  • Basılmaya uygun görünüm
Diğer projelerde
Görünüm
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: Raporlama modülü
 ****************************************
 * Çağırma modu:           Sekme ("Raporla")
 * Etkin olduğu yerler:    İlgili kullanıcı adına sahip herhangi bir sayfa (kullanıcı sayfası, katkılar, vb.)
 */

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

	const isIP = mw.util.isIPAddress(username, true);
	// Ignore ranges wider than the CIDR limit
	if (Morebits.ip.isRange(username) && !Morebits.ip.validCIDR(username)) {
		return;
	}
	const userType = isIP ? 'IP' + (Morebits.ip.isRange(username) ? ' aralığını' : '') : 'kullanıcıyı';

	Twinkle.addPortletLink(() => {
		Twinkle.arv.callback(username, isIP);
	}, 'Raporla', 'tw-arv', userType + ' hizmetlilere raporla');
};

Twinkle.arv.callback = function (uid, isIP) {
	const Window = new Morebits.SimpleWindow(600, 500);
	Window.setTitle('Gelişmiş Raporlama ve İnceleme'); // Backronym
	Window.setScriptName('Twinkle');
	//Window.addFooterLink('AIV guide', 'WP:GAIV');
	//Window.addFooterLink('UAA guide', 'WP:UAAI');
	//Window.addFooterLink('SPI guide', 'Wikipedia:Sockpuppet investigations/SPI/Guide to filing cases');
	Window.addFooterLink('Rapor tercihleri', 'VP:TWTER#arv');
	Window.addFooterLink('Twinkle yardım', 'VT:TW');
	//Window.addFooterLink('Give feedback', 'WT:TW');

	const form = new Morebits.QuickForm(Twinkle.arv.callback.evaluate);
	const 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)', //(WP:UAA)
		value: 'username',
		disabled: isIP
	});
	categories.append({
		type: 'option',
		label: 'Kuklacı (VP:Dİ)',
		value: 'sock'
	});
	categories.append({
		type: 'option',
		label: 'Kukla (VP:Dİ)',
		value: 'puppet'
	});
	categories.append({
		type: 'option',
		label: 'Değişiklik savaşı (VP:Ş)',
		value: 'an3',
		disabled: Morebits.ip.isRange(uid) // rvuser template doesn't support ranges
	});
	form.append({
		type: 'div',
		label: '',
		style: 'color: red',
		id: 'twinkle-arv-blockwarning'
	});

	form.append({
		type: 'field',
		label: 'Work area',
		name: 'work_area'
	});
	form.append({ type: 'submit' });
	form.append({
		type: 'hidden',
		name: 'uid',
		value: uid
	});

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

	// Check if the user is blocked, update notice
	const query = {
		action: 'query',
		list: 'blocks',
		bkprop: 'range|flags',
		format: 'json'
	};
	if (isIP) {
		query.bkip = uid;
	} else {
		query.bkusers = uid;
	}
	new Morebits.wiki.Api("Kullanıcının engel durumu kontrol ediliyor", query, ((apiobj) => {
		const blocklist = apiobj.getResponse().query.blocks;
		if (blocklist.length) {
			// If an IP is blocked *and* rangeblocked, only use whichever is more recent
			const block = blocklist[0];
			let message = (isIP ? 'Bu IP ' + (Morebits.ip.isRange(uid) ? 'aralığı' : 'adresi') : 'Bu hesap');
			// Start and end differ, range blocked
			message += block.rangestart !== block.rangeend ? ' bir IP bloğunun parçası olarak' : '';
			message += (block.partial ? 'kısmen' : 'zaten') + ' engellenmiş.'
			if (block.partial) {
				$('#twinkle-arv-blockwarning').css('color', 'black'); // Less severe
			}
			$('#twinkle-arv-blockwarning').text(message);
		}
	})).post();

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

Twinkle.arv.callback.changeCategory = function (e) {
	const value = e.target.value;
	const root = e.target.form;
	const old_area = Morebits.QuickForm.getElements(root, 'work_area')[0];
	let 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 raporla',
				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: Twinkle.getPrefill('vanarticle') || '',
				event: function(e) {
					const value = e.target.value;
					const 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: Twinkle.getPrefill('vanarticlerevid') || '',
				disabled: !Twinkle.getPrefill('vanarticle'),
				event: function(e) {
					const value = e.target.value;
					const 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: Twinkle.getPrefill('vanarticlegoodrevid') || '',
				disabled: !Twinkle.getPrefill('vanarticle') || Twinkle.getPrefill('vanarticlerevid')
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Birden çok kez uyarılmasına (seviye 4 veya 4tu) 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, true)
					},
					{
						label: 'Yalnızca reklam amaçlı hesap',
						value: 'promoonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'Spambot veya şifresi ele geçirilmiş hesap',
						value: 'spambot'
					}
				]
			});
			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 raporla',
				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. "Hizmetli", "Sayfayı taşı", "Sistem denetçisi" 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: 'Halen yaşayan ya da yeni ölmüş tanınmış kişi adı',
						value: 'Halen yaşayan ya da yeni ölmüş tanınmış kişiyi içeren',
						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.'
					},
					{
						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.'
					}
				]
			});
			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ı raporla',
				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: 'Denetçi İste',
						name: 'checkuser',
						tooltip: 'Denetçi , bir kuklacı iddiasıyla ilgili teknik kanıt elde etmek için kullanılan bir araçtır. Açıkça verilen kabul edilebilir bir dedil olmadan kullanılmayacaktır. Delilinizin aracın neden kullanılması gerektiğini açıkladığından emin olun.'
					}*/
				]
			});
			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: 'sockpuppets',
					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: 'Denetçi İste',
					name: 'checkuser',
					tooltip: 'Denetçi, bir kuklacı iddiasıyla ilgili teknik kanıt elde etmek için kullanılan bir araçtır. Açıkça verilen kabul edilebilir bir dedil olmadan kullanılmayacaktır. Delilinizin aracın neden kullanılması gerektiğini açıkladığından emin olun.'
				}*/ ]
			});
			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: 'Değişiklik savaşını raporla',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Sayfa',
				tooltip: 'Raporlanan sayfa'
			});
			work_area.append({
				type: 'button',
				name: 'load',
				label: 'Yükle',
				event: function(e) {
					const root = e.target.form;

					const date = new Morebits.Date().subtract(48, 'hours'); // all since 48 hours

					// Run for each AN3 field
					const getAN3Entries = function(field, rvuser, titles) {
						const $field = $(root).find('[name=' + field + ']');
						$field.find('.entry').remove();

						new mw.Api().get({
							action: 'query',
							prop: 'revisions',
							format: 'json',
							rvprop: 'sha1|ids|timestamp|parsedcomment|comment',
							rvlimit: 500, // intentionally limited
							rvend: date.toISOString(),
							rvuser: rvuser,
							indexpageids: true,
							titles: titles
						}).done((data) => {
							const pageid = data.query.pageids[0];
							const page = data.query.pages[pageid];
							if (!page.revisions) {
								$('<span class="entry">Bulunamadı</span>').appendTo($field);
							} else {
								for (let i = 0; i < page.revisions.length; ++i) {
									const rev = page.revisions[i];
									const $entry = $('<div>', {
										class: 'entry'
									});
									const $input = $('<input>', {
										type: 'checkbox',
										name: 's_' + field,
										value: rev.revid
									});
									$input.data('revinfo', rev);
									$input.appendTo($entry);
									let comment = '<span>';
									// revdel/os
									if (typeof rev.commenthidden === 'string') {
										comment += '(yorum gizlendi)';
									} else {
										comment += '"' + rev.parsedcomment + '"';
									}
									comment += ' <a href="' + mw.config.get('wgScript') + '?diff=' + rev.revid + '">' + new Morebits.Date(rev.timestamp).calendar() + '</a></span>';
									$entry.append(comment).appendTo($field);
								}
							}

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

								const $free_label = $('<label>', {
									for: 's_resolves_free',
									html: 'Ek tartışmalarla farkın URL bağlantısı: '
								});
								$free_entry.append($free_label).append($free_input).appendTo($field);
							}
						}).fail(() => {
							$('<span class="entry">API hatası, sayfayı yeniden yükleyin ve tekrar deneyin</span>').appendTo($field);
						});
					};

					// warnings
					const uid = root.uid.value;
					getAN3Entries('warnings', mw.config.get('wgUserName'), 'Kullanıcı mesaj:' + uid);

					// diffs and resolves require a valid page
					const page = root.page.value;
					if (page) {
						// diffs
						getAN3Entries('diffs', uid, page);

						// resolutions
						const t = new mw.Title(page);
						const talk_page = t.getTalkPage().getPrefixedText();
						getAN3Entries('resolves', mw.config.get('wgUserName'), talk_page);
					} else {
						$(root).find('[name=diffs]').find('.entry').remove();
						$(root).find('[name=resolves]').find('.entry').remove();
					}
				}
			});
			work_area.append({
				type: 'field',
				name: 'diffs',
				label: 'Kullanıcının geri almaları (son 48 saat içinde)',
				tooltip: 'Değişikliği geri aldığına inandığınız değişikliklerini seçin'
			});
			work_area.append({
				type: 'field',
				name: 'warnings',
				label: 'Konuyla alakalı verilen uyarılar',
				tooltip: 'Raporlamadan önce kullanıcıyı konuyla alakalı uyarmış olmalısınız'
			});
			work_area.append({
				type: 'field',
				name: 'resolves',
				label: 'Çözüm girişimleri',
				tooltip: 'Önce tartışma sayfasında sorunu çözmeye çalışmalısınız'
			});

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

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

Twinkle.arv.callback.evaluate = function(e) {
	const form = e.target;
	let reason = '';
	const input = Morebits.QuickForm.getInputData(form);

	const uid = form.uid.value;

	switch (input.category) {

		// Report user for vandalism
		case 'aiv':
			/* falls through */
		default:
			reason = Twinkle.arv.callback.getAivReasonWikitext(input);

			if (reason === null) {
				alert('Bir gerekçe belirtmelisiniz');
				return;
			}

			Morebits.SimpleWindow.setButtonsEnabled(false);
			Morebits.Status.init(form);

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

			var aivPage = new Morebits.wiki.Page('Vikipedi:Kullanıcı engelleme talepleri', 'Kullanıcı engelleme talebi işleniyor');
			// aivPage.setPageSection(1); // Türkçe Vikipedi'de section altına raporlamıyoruz
			aivPage.setFollowRedirect(true);

			aivPage.load(() => {
				const text = aivPage.getPageText();
				const $aivLink = '<a target="_blank" href="/wiki/VP:KET">VP:KET</a>';

				// check if user has already been reported
				if (new RegExp('\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*' + Morebits.string.escapeRegExp(input.uid) + '\\s*\\}\\}').test(text)) {
					aivPage.getStatusElement().error('Rapor zaten mevcut, yeni bir tane eklenmiyor');
					Morebits.Status.printUserText(reason, 'Yazdığınız yorumlar, bu kullanıcı için ' + $aivLink + ' sayfasındaki mevcut raporun altında manuel olarak bir yorum yapmak istemeniz durumunda aşağıda verilmiştir:');
					return;
				}

				// NOT: bot rapor sistemimiz yok. olursa da büyük ihtimal aynı sayfa içinde raporlayacağından yukarıdaki kod tarafından algılanır, bu yüzden burası bizim için gerekli değil
				// then check for any bot reports
				/*const tb2Page = new Morebits.wiki.Page('Wikipedia:Administrator intervention against vandalism/TB2', 'Bot raporları kontrol ediliyor');
				tb2Page.load(() => {
					const tb2Text = tb2Page.getPageText();
					const tb2statelem = tb2Page.getStatusElement();

					if (new RegExp('\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*' + Morebits.string.escapeRegExp(input.uid) + '\\s*\\}\\}').test(tb2Text)) {
						if (confirm( input.uid + ' kullanıcısı zaten bir bot tarafından raporlanmış. Yine de raporlamak istiyor musunuz?')) {
							tb2statelem.info('Bot raporuna rağmen devam edildi');
						} else {
							tb2statelem.error('Bir bottan gelen rapor zaten mevcut, durduruluyor');
							Morebits.Status.printUserText(reason, $aivLink + 'adresinde manuel olarak yayınlamak istemeniz durumunda yazdığınız yorumlar aşağıda verilmiştir:');
							return;
						}
					} else {
						tb2statelem.info('Çakışan bot raporu yok');
					}*/

					aivPage.getStatusElement().status('Yeni rapor ekleniyor...');
					aivPage.setEditSummary('[[Special:Contributions/' + input.uid + '|' + input.uid + ']] raporlanıyor.');
					aivPage.setChangeTags(Twinkle.changeTags);
					aivPage.setAppendText('\n' + '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon' + '|' + (/=/.test(input.uid) ? '1=' : '') + uid + '}} &ndash; ' + reason);
					aivPage.setAppendText(Twinkle.arv.callback.buildAivReport(input));
					aivPage.append();
				});
			// });
			break;

		// Uygunsuz kullanıcı adı bildirme
		case 'username':
			var censorUsername = input.arvtype.includes('offensive'); // check if the username is marked offensive

			reason = Twinkle.arv.callback.getUsernameReportWikitext(input);

			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', 'Kullanıcı engelleme talebi işleniyor');
			uaaPage.setFollowRedirect(true);

			uaaPage.load(() => {
				const text = uaaPage.getPageText();

				// check if user has already been reported
				if (new RegExp('\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?' + Morebits.string.escapeRegExp(input.uid) + '\\s*(\\||\\})').test(text)) {
					uaaPage.getStatusElement().error('Kullanıcı zaten listelenmiş.');
					const $uaaLink = '<a target="_blank" href="/wiki/VP:KET">VP:KET</a>';
					Morebits.Status.printUserText(reason, + $uaaLink + ' adresinde manuel olarak yayınlamak istemeniz durumunda yazdığınız yorumlar aşağıda verilmiştir.:');
					return;
				}
				uaaPage.getStatusElement().status('Yeni rapor ekleniyor...');
				uaaPage.setEditSummary((censorUsername ? 'ofansif bir kullanıcı adı ' : '[[Special:Contributions/' + input.uid + '|' + input.uid + ']] ') + 'raporlanıyor.');
				uaaPage.setChangeTags(Twinkle.changeTags);
				
				// Blank newline per [[Special:Permalink/996949310#Spacing]]; see also [[WP:LISTGAP]] and [[WP:INDENTGAP]]
				uaaPage.setPageText(text + '\n' + reason + '\n*');
				uaaPage.save();
			});
			break;

		// VP:Dİ
		case 'sock':
			/* falls through */
		case 'puppet':
			var reportData = Twinkle.arv.callback.getSpiReportData(input);

			if (reportData.error) {
				alert(reportData.error);
				return;
			}

			Morebits.SimpleWindow.setButtonsEnabled(false);
			Morebits.Status.init(form);

			Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

			const reportpage = 'Vikipedi:Denetçi isteği/Dava/' + reportData.sockmaster;

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

			const spiPage = new Morebits.wiki.Page(reportpage, 'Tartışma sayfası alınıyor');
			spiPage.setFollowRedirect(true);
			spiPage.setEditSummary('[[Special:Contributions/' + reportData.sockmaster + '|' + reportData.sockmaster + ']] için yeni rapor ekleniyor.');
			spiPage.setChangeTags(Twinkle.changeTags);
			spiPage.setAppendText(reportData.wikitext);
			spiPage.setWatchlist(Twinkle.getPref('spiWatchReport'));
			spiPage.append();

			// İsteğimizi VP:Dİ'ye ekleyelim
			const logPage = new Morebits.wiki.Page("Vikipedi:Denetçi isteği", 'Denetçi istekleri sayfası alınıyor');
			logPage.load(() => {
				let logText = logPage.getPageText();
				const logStatusElement = logPage.getStatusElement();
				
				const reg = /({{\s*?Vikipedi:Denetçi isteği\/Başlık\s*?}})/;
				const originalTextLength = logText.length;
					logText = logText.replace(reg, '$1\n\{\{' + reportpage + '\}\}');
					if (logText.length === originalTextLength) {
						const linknode = document.createElement('a');
						linknode.setAttribute('href', mw.util.getUrl('Vikipedi:Twinkle/Dİ düzeltme'));
						linknode.appendChild(document.createTextNode('Denetçi isteği sayfası nasıl düzeltilir'));
						logStatusElement.error([ 'VP:Dİ\'de ilgili başlık bulunamadı. Bu sorunu çözmek için lütfen ', linknode, ' sayfasına bakın.' ]);
						return;
					}
					
				logStatusElement.status('İstek VP:Dİ sayfasına ekleniyor...');
					logPage.setEditSummary('[[Special:Contributions/' +  reportData.sockmaster + '|' +  reportData.sockmaster + ']] ile ilgili denetçi isteği ekleniyor.');
					logPage.setChangeTags(Twinkle.changeTags);
					logPage.setPageText(logText);
					logPage.setCreateOption('recreate');
					logPage.save();
			})

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

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

			if (diffs.length < 3 && !confirm('Üçten az revizyon seçtiniz. Yine de raporlamak istiyor musunuz?')) {
				return;
			}

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

			if (!warnings.length && !confirm('Kullanıcıyı uyardığınız herhangi bir değişiklik seçmediniz. Yine de raporlamak istiyor musunuz?')) {
				return;
			}

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

			var an3_next = function(free_resolves) {
				if (!resolves.length && !free_resolves && !confirm('Sorunu çözmeye çalıştığınız herhangi bir değişiklik seçmediniz. Yine de raporlamak istiyor musunuz?')) {
					return;
				}

				const 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) {
				let query;
				let diff, oldid;
				const specialDiff = /Special:Diff\/(\d+)(?:\/(\S+))?/i.exec(free_resolves);
				if (specialDiff) {
					if (specialDiff[2]) {
						oldid = specialDiff[1];
						diff = specialDiff[2];
					} else {
						diff = specialDiff[1];
					}
				} else {
					diff = mw.util.getParamValue('diff', free_resolves);
					oldid = mw.util.getParamValue('oldid', free_resolves);
				}
				const title = mw.util.getParamValue('title', free_resolves);
				const diffNum = /^\d+$/.test(diff); // used repeatedly

				// rvdiffto in prop=revisions is deprecated, but action=compare doesn't return
				// timestamps ([[phab:T247686]]) so we can't rely on it unless necessary.
				// Likewise, we can't rely on a meaningful comment for diff=cur.
				// Additionally, links like Special:Diff/123/next, Special:Diff/123/456, or ?diff=next&oldid=123
				// would each require making use of rvdir=newer in the revisions API.
				// That requires a title parameter, so we have to use compare instead of revisions.
				if (oldid && (diff === 'cur' || (!title && (diff === 'next' || diffNum)))) {
					query = {
						action: 'compare',
						fromrev: oldid,
						prop: 'ids|title',
						format: 'json'
					};
					if (diffNum) {
						query.torev = diff;
					} else {
						query.torelative = diff;
					}
				} else {
					query = {
						action: 'query',
						prop: 'revisions',
						rvprop: 'ids|timestamp|comment',
						format: 'json',
						indexpageids: true
					};

					if (diff && oldid) {
						if (diff === 'prev') {
							query.revids = oldid;
						} else {
							query.titles = title;
							query.rvdir = 'newer';
							query.rvstartid = oldid;

							if (diff === 'next' && title) {
								query.rvlimit = 2;
							} else if (diffNum) {
								// Diffs may or may not be consecutive, no limit
								query.rvendid = diff;
							}
						}
					} else {
						// diff=next|prev|cur with no oldid
						// Implies title= exists otherwise it's not a valid diff link (well, it is, but to the Main Page)
						if (diff && /^\D+$/.test(diff)) {
							query.titles = title;
						} else {
							query.revids = diff || oldid;
						}
					}
				}

				new mw.Api().get(query).done((data) => {
					let page;
					if (data.compare && data.compare.fromtitle === data.compare.totitle) {
						page = data;
					} else if (data.query) {
						const pageid = data.query.pageids[0];
						page = data.query.pages[pageid];
					} else {
						return;
					}
					an3_next(page);
				}).fail((data) => {
					console.log('API failed :(', data); // eslint-disable-line no-console
				});
			} else {
				an3_next();
			}
			break;
	}
};

Twinkle.arv.callback.getAivReasonWikitext = function(input) {
	let text = '';
	let type = input.arvtype;

	if (!type.length && input.reason === '') {
		return null;
	}

	type = type.map((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 'promoonly':
				return 'hesap sadece reklam amaçlı kullanılıyor';
			case 'spambot':
				return 'spambot veya şifresi ele geçirilmiş hesap';
			default:
				return 'bilinmeyen gerekçe';
		}
	}).join('; ');

	if (input.page !== '') {
		// Allow links to redirects, files, and categories
		text = '{{Yönlenme|:' + input.page + '}} üzerinde';
		if (input.badid !== '') {
			text += ' ({{Fark|' + input.page + '|' + input.badid + '|' + input.goodid + '|fark}})';
		}
		text += ':';
	}

	if (type) {
		text += ' ' + type;
	}

	if (input.reason !== '') {
		const textEndsInPunctuationOrBlank = /([.?!;:]|^)$/.test(text);
		text += textEndsInPunctuationOrBlank ? '' : '.';
		const textIsBlank = text === '';
		text += textIsBlank ? '' : ' ';
		text += input.reason;
	}

	text = text.trim();
	const textEndsInPunctuation = /[.?!;]$/.test(text);
	if (!textEndsInPunctuation) {
		text += '.';
	}

	text += ' ~~~~';
	text = text.replace(/\r?\n/g, '\n*:');  // indent newlines

	return text;
};

Twinkle.arv.callback.buildAivReport = function(input) {
	return '\n{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon|' + (/=/.test(input.uid) ? '1=' : '') + input.uid + '}} &ndash; ' + Twinkle.arv.callback.getAivReasonWikitext(input);
};

Twinkle.arv.callback.getUsernameReportWikitext = function(input) {
	// generate human-readable string, e.g. "misleading and promotional username"
	if (input.arvtype.length <= 2) {
		input.arvtype = input.arvtype.join(' ve ');
	} else {
		input.arvtype = [ input.arvtype.slice(0, -1).join(', '), input.arvtype.slice(-1) ].join(' ve ');
	}

	/* a or an? bize fark etmez
	let adjective = 'a';
	if (/[aeiouwyh]/.test(input.arvtype[0] || '')) {  non 100% correct, but whatever, including 'h' for Cockney
		adjective = 'an';
	} */

	let text = '{{kopyala:Vikipedi:Kullanıcı engelleme talepleri/Twinkle-şablon|1=' + input.uid + '}} &ndash; ';
	if (input.arvtype.length) {
		text += 'Kullanıcı adı politikasının ihlali: ' + input.arvtype + ' kullanıcı adı. ';
	}
	if (input.reason !== '') {
		text += Morebits.string.toUpperCaseFirstChar(input.reason);
		const endsInPeriod = /\.$/.test(input.reason);
		if (!endsInPeriod) {
			text += '.';
		}
		text += ' ';
	}
	text += '~~~~';
	text = text.replace(/\r?\n/g, '\n*:');  // indent newlines

	return text;
};

Twinkle.arv.callback.getSpiReportData = function(input) {
	const isPuppetReport = input.category === 'puppet';

	if (!isPuppetReport) {
		input.sockpuppets = input.sockpuppets.filter((sock) => sock !== ''); // ignore empty sockpuppet inputs
	}

	if (isPuppetReport && !input.sockmaster) {
		return { error: 'Bu kukla için bir kuklacı hesabı girmediniz. Bunun yerine bu hesabı bir kuklacı olarak bildirmeyi düşünün.' };
	} else if (!isPuppetReport && input.sockpuppets.length === 0) {
		return { error: 'Bu kuklacı için bir kukla hesabı girmediniz. Bunun yerine bu hesabı bir kukla olarak bildirmeyi düşünün.' };
	}

	input.sockmaster = input.sockmaster || input.uid;
	input.sockpuppets = isPuppetReport ? [input.uid] : Morebits.array.uniq(input.sockpuppets);

	let text = '\n=== ' + input.sockmaster + ' ===\n* ' +
	    '* {{' + (mw.util.isIPAddress(input.sockmaster) ? 'checkip' : 'checkuser') + '|' + input.sockmaster + '}}\n' +
	    input.sockpuppets.map(function(sock) {
	        var templateName = mw.util.isIPAddress(sock) ? 'checkip' : 'checkuser';
	        return '* {{' + templateName + '|' + sock + '}}';
	    }).join('\n') +
	    '\n\'\'\'Kanıt\'\'\': ' + input.evidence + ' -~~~~';

	/*if (input.checkuser) {
		text += '|checkuser=yes';
	}*/

	return {
		sockmaster: input.sockmaster,
		wikitext: text
	};
};

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

	new mw.Api().get({
		action: 'query',
		prop: 'revisions',
		format: 'json',
		rvprop: 'sha1|ids|timestamp|comment',
		rvlimit: 100, // intentionally limited
		rvstartid: minid,
		rvexcludeuser: params.uid,
		indexpageids: true,
		titles: params.page
	}).done((data) => {
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

		// In case an edit summary was revdel'd
		const hasHiddenComment = function(rev) {
			if (!rev.comment && typeof rev.commenthidden === 'string') {
				return '(comment hidden)';
			}
			return '"' + rev.comment + '"';

		};

		let orig;
		if (data.length) {
			const sha1 = data[0].sha1;
			for (let i = 1; i < data.length; ++i) {
				if (data[i].sha1 === sha1) {
					orig = data[i];
					break;
				}
			}

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

		let origtext = '';
		if (orig) {
			origtext = '{{diff2|' + orig.revid + '|' + orig.timestamp + '}} ' + hasHiddenComment(orig);
		}

		const grouped_diffs = {};

		let parentid, lastid;
		for (let j = 0; j < params.diffs.length; ++j) {
			const 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);
		}

		const difftext = $.map(grouped_diffs, (sub) => {
			let ret = '';
			if (sub.length >= 2) {
				const last = sub[0];
				const first = sub.slice(-1)[0];
				const label = 'Şu değişiklikten itibaren yapılan ardışık değişiklikler: ' + new Morebits.Date(first.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'den ' + new Morebits.date(last.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'ye kadar';
				ret = '# {{diff|oldid=' + first.parentid + '|diff=' + last.revid + '|label=' + label + '}}\n';
			}
			ret += sub.reverse().map((v) => (sub.length >= 2 ? '#' : '') + '# {{diff2|' + v.revid + '|' + new Morebits.Date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v)).join('\n');
			return ret;
		}).reverse().join('\n');
		const warningtext = params.warnings.reverse().map((v) => '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.Date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v)).join('\n');

		let resolvetext = params.resolves.reverse().map((v) => '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.Date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ' + hasHiddenComment(v)).join('\n');

		if (params.free_resolves) {
			const page = params.free_resolves;
			if (page.compare) {
				resolvetext += '\n#  {{diff|oldid=' + page.compare.fromrevid + '|diff=' + page.compare.torevid + '|label=' + page.compare.totitle + ' sayfasında ardışık düzenlemeler}}';
			} else if (page.revisions) {
				const revCount = page.revisions.length;
				let rev;
				if (revCount < 3) { // diff=prev or next
					rev = revCount === 1 ? page.revisions[0] : page.revisions[1];
					resolvetext += '\n#  {{diff2|' + rev.revid + '|' + new Morebits.Date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC) on ' + page.title + '}} ' + hasHiddenComment(rev);
				} else { // diff and oldid are nonconsecutive
					rev = page.revisions[0];
					const revLatest = page.revisions[revCount - 1];
					const label = 'Şu değişiklikten itibaren yapılan ardışık değişiklikler: ' + new Morebits.Date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'den ' + new Morebits.Date(revLatest.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)\'e kadar ' + page.title + ' sayfasında';
					resolvetext += '\n# {{diff|oldid=' + rev.revid + '|diff=' + revLatest.revid + '|label=' + label + '}}\n';
				}
			}
		}

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

		if (comment) {
			comment += ' --~~~~';
		}
		if (!comment) {
			comment = 'Bildirimde bulunan kullanıcı yorum yapmamıştır. Eğer bildirimi siz yaptıysanız lütfen burayı doldurun. Bu mesaj Twinkle tarafından otomatik olarak eklenen bir yer tutucudur ve yorum işlevi görmemektedir. --~~~~';
		}

		const text = '\n\n{{subst:3GD raporu|diffs=' + difftext + '|warnings=' + warningtext + '|resolves=' + resolvetext + '|pagename=' + params.page + '|orig=' + origtext + '|comment=' + comment + '|uid=' + params.uid + '}}';

		const reportpage = 'Vikipedi:Şikâyet';

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

		const an3Page = new Morebits.wiki.Page(reportpage, 'Tartışma sayfası alınıyor');
		an3Page.setFollowRedirect(true);
		an3Page.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] için yeni rapor ekleniyor.');
		an3Page.setChangeTags(Twinkle.changeTags);
		an3Page.setAppendText(text);
		an3Page.append();

		// notify user
		const notifyText = '\n\n{{subst:değişiklik savaşı bildirimi|1=' + mw.util.wikiUrlencode(params.uid) + '}}--~~~~';

		const talkPage = new Morebits.wiki.Page('Kullanıcı mesaj:' + params.uid, 'Bildirilen kullanıcıya haber veriliyor');
		talkPage.setFollowRedirect(true);
		talkPage.setEditSummary('Değişiklik savaşı raporu bildirimi.');
		talkPage.setChangeTags(Twinkle.changeTags);
		talkPage.setAppendText(notifyText);
		talkPage.append();
		Morebits.wiki.removeCheckpoint();  // all page updates have been started
	}).fail((data) => {
		console.log('API failed :(', data); // eslint-disable-line no-console
	});
};

Twinkle.addInitCallback(Twinkle.arv, 'arv');
}());

// </nowiki>
"https://tr.wikipedia.org/w/index.php?title=MediaWiki:Gadget-twinklearv.js&oldid=35145734" sayfasından alınmıştır
  • Sayfa en son 20.32, 24 Mart 2025 tarihinde değiştirildi.
  • Metin Creative Commons Atıf-AynıLisanslaPaylaş Lisansı altındadır ve ek koşullar uygulanabilir. Bu siteyi kullanarak Kullanım Şartlarını ve Gizlilik Politikasını kabul etmiş olursunuz.
    Vikipedi® (ve Wikipedia®) kâr amacı gütmeyen kuruluş olan Wikimedia Foundation, Inc. tescilli markasıdır.
  • Gizlilik politikası
  • Vikipedi hakkında
  • Sorumluluk reddi
  • Davranış Kuralları
  • Geliştiriciler
  • İstatistikler
  • Çerez politikası
  • Mobil görünüm
  • Wikimedia Foundation
  • Powered by MediaWiki
MediaWiki:Gadget-twinklearv.js
Konu ekle