Qeyd: Dəyişiklikləri yayımladıqdan sonra etdiyiniz dəyişikliklərin görünməsi üçün brauzerinizin keşinin təmizlənməsi lazım ola bilər.

  • Firefox / Safari: Reload düyməsinə basılı tutarkən Shift düyməsinə basın, və ya Ctrl+F5 və ya Ctrl+R (Mac üçün ⌘-R )
  • Google Chrome: Ctrl-Shift-R (Mac üçün ⌘-Shift-R)
  • Edge: Ctrl düyməsini basılı tutarkən Refresh düyməsinə basın, və ya sadəcə Ctrl+F5.
// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklearv.js: ARV module
 ****************************************
 * Mode of invocation:     Tab ("ARV")
 * 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 isIP = mw.util.isIPAddress(username, true);
	// Ignore ranges wider than the CIDR limit
	if (Morebits.ip.isRange(username) && !Morebits.ip.validCIDR(username)) {
		return;
	}
	var userType = isIP ? 'IP' + (Morebits.ip.isRange(username) ? ' range' : '') : 'user';

	Twinkle.addPortletLink(function() {
		Twinkle.arv.callback(username, isIP);
	}, 'Şikayət', 'tw-arv', 'İstifadəçini inzibatçılara şikayət et');
};

Twinkle.arv.callback = function (uid, isIP) {
	var Window = new Morebits.simpleWindow(600, 500);
	Window.setTitle('İstifadəçini inzibatçılara şikayət et'); // Backronym
	Window.setScriptName('Twinkle');
	Window.addFooterLink('Vandalizm', 'Vikipediya:Vandalizm');
	Window.addFooterLink('İstifadəçi adları', 'Vikipediya:İstifadəçi adları');
	Window.addFooterLink('Redaktə müharibəsi', 'Vikipediya:Redaktə müharibəsi');
	Window.addFooterLink('Kömək', 'WP:TW/DOC#şikayət');

	var form = new Morebits.quickForm(Twinkle.arv.callback.evaluate);
	var categories = form.append({
		type: 'select',
		name: 'category',
		label: 'Şikayətin növünü seçin:',
		event: Twinkle.arv.callback.changeCategory
	});
	categories.append({
		type: 'option',
		label: 'Vandalizm',
		value: 'aiv'
	});
	categories.append({
		type: 'option',
		label: 'İstifadəçi adı',
		value: 'username',
		disabled: isIP
	});/*
	categories.append({
		type: 'option',
		label: 'Kukla hesab (işlədən)',
		value: 'sock'
	});
	categories.append({
		type: 'option',
		label: 'Kukla hesab',
		value: 'puppet'
	});*/
	categories.append({
		type: 'option',
		label: 'Redaktə müharibəsi',
		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
	});

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

	// Check if the user is blocked, update notice
	var query = {
		action: 'query',
		list: 'blocks',
		bkprop: 'range|flags',
		format: 'json'
	};
	if (isIP) {
		query.bkip = uid;
	} else {
		query.bkusers = uid;
	}
	new Morebits.wiki.api("Checking the user's block status", query, function(apiobj) {
		var blocklist = apiobj.getResponse().query.blocks;
		if (blocklist.length) {
			// If an IP is blocked *and* rangeblocked, only use whichever is more recent
			var block = blocklist[0];
			var message = (isIP ? 'This IP ' + (Morebits.ip.isRange(uid) ? 'range' : 'address') : 'This account') + ' is ' + (block.partial ? 'partially' : 'already') + ' blocked';
			// Start and end differ, range blocked
			message += block.rangestart !== block.rangeend ? ' as part of a rangeblock.' : '.';
			if (block.partial) {
				$('#twinkle-arv-blockwarning').css('color', 'black'); // Less severe
			}
			$('#twinkle-arv-blockwarning').text(message);
		}
	}).post();


	// 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: 'İstifadəçini vandalizmə görə şikayət et',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Əsas əlaqəli səhifə:',
				tooltip: 'Heç bir səhifəyə keçid verməmək üçün boş buraxı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: 'Redaktə nömrəsi (ID):',
				tooltip: 'Yoxdursa, boş buraxa bilərsiniz',
				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: 'Vandalizmdən əvvəlki stabil versiyanın redaktə nömrəsi (ID):',
				tooltip: 'Yoxdursa, boş buraxa bilərsiniz',
				value: mw.util.getParamValue('vanarticlegoodrevid') || '',
				disabled: !mw.util.getParamValue('vanarticle') || mw.util.getParamValue('vanarticlerevid')
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Sonuncu xəbərdarlıqdan (4-cü səviyyə) sonrakı vandalizm ',
						value: 'final'
					},
					{
						label: 'Blokdan çıxdıqdan sonrakı 24 saat ərzində vandalizm',
						value: 'postblock'
					},
					{
						label: 'Sadəcə vandalizm məqsədli istifadəçi hesabı',
						value: 'vandalonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'Sadəcə reklam məqsədli istifadəçi hesabı',
						value: 'promoonly',
						disabled: mw.util.isIPAddress(root.uid.value, true)
					},
					{
						label: 'Yalnız spam məqsədli istifadəçi hesabı ',
						value: 'spambot'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Şərh:'
			});
			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: 'Uyğunsuz istifadəçi adını şikayət et',
				name: 'work_area'
			});
			work_area.append({
				type: 'header',
				label: 'Uyğunsuzluq kriteriyalarını seçin',
				tooltip: 'Vikipediya aldadıcı, reklam xarakterli, təhqiredici və ya pozucu olan istifadəçi adlarına icazə vermir. Domen adları və e-poçt ünvanları da qadağandır. Bu meyarlar həm istifadəçi adlarına, həm də istifadəçi imzalarına aiddir. Başqa dillərdə uyğunsuz olan istifadəçi adları da buna daxildir.'
			});
			work_area.append({
				type: 'checkbox',
				name: 'arvtype',
				list: [
					{
						label: 'Aldadıcı',
						value: '[[Vikipediya:İstifadəçi adları#Aldadıcı|aldadıcı]]',
						tooltip: 'Bu kriteriya istifadəçi haqqında yanıltıcı şeyləri nəzərdə tutur. Məsələn, yalnış faktlar, səlahiyyətlər və ya bot hesabı təəssüratı yaradan istifadəçi adları.'
					},
					{
						label: 'Reklam xarakterli',
						value: '[[Vikipediya:İstifadəçi adları#Reklam|reklam]]',
						tooltip: 'Reklam məqsədli istifadəçi adları şirkət, vebsayt və ya qrupları tanıtmaq məqsədli olur.'
					},
					{
						label: 'Paylaşılan istifadə',
						value: '[[Vikipediya:İstifadəçi adları#Paylaşılan istifadə|paylaşılan istifadə]]',
						tooltip: 'Paylaşılan istifadə ehtimalını ifadə edən istifadəçi adlarına (şirkətlərin və ya qrupların adları və ya təşkilatlar daxilindəki yazıların adları) icazə verilmir. İstifadəçi adları şirkət və ya qrup adını ehtiva edirsə, lakin aydın şəkildə fərdi şəxsi ifadə etmək üçün nəzərdə tutulubsa, məqbuldur, məsələn, "XYZ şirkətindən Nailə" və s.'
					},
					{
						label: 'Təhqiramiz',
						value: '[[Vikipediya:İstifadəçi adları#Təhqiramiz|təhqiramiz]]',
						tooltip: 'Digər istifadəçiləri təhqir və ya narahat edən istifadəçi adları'
					},
					{
						label: 'Pozucu',
						value: 'pozucu',
						tooltip: 'Pozucu istifadəçi adlarına birbaşa trollinq, şəxsi hücumlar və ya başqa şəkildə Vikipediyanı pozmaq niyyətli adlar daxildir.'
					}
				]
			});
			work_area.append({
				type: 'textarea',
				name: 'reason',
				label: 'Şərh:'
			});
			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: 'Kukla olduğundan şübhələndiyiniz istifadəçi hesabını şikayət edin',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'input',
					name: 'sockmaster',
					label: 'Kukla hesabı işlədən',
					tooltip: 'Kukla hesabı işlədənin istifadəçi adı ("İstifadəçi:" prefikssiz)'
				}
			);
			work_area.append({
				type: 'textarea',
				label: 'Sübut:',
				name: 'evidence',
				tooltip: 'Göstərəcəyiniz sübutlar istifadəçinin bir neçə hesabdan sui-istifadə etdiyini aydın şəkildə göstərməlidir. Buna səhifə tarixçələri, redaktələrin keçidləri və istifadəçinin kuklalardan sui-istifadəsini sübut edən digər faktlar daxildir.'
			});
			work_area.append({
				type: 'checkbox',
				list: [
					/*{
						label: 'Request CheckUser',
						name: 'checkuser',
						tooltip: 'CheckUser is a tool used to obtain technical evidence related to a sockpuppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why using the tool is appropriate. It will not be used to publicly connect user accounts and IP addresses.'
					},*/
					{
						label: 'Şikayət edilən istifadəçini məlumatlandır',
						name: 'notify',
						tooltip: 'Bildiriş məcburi deyil. Bir çox hallarda, xüsusən xroniki kuklalar üçün bildiriş əks nəticə verə bilər. Buna baxmayaraq, bildiriş bu şikayəti daha ədalətli edə bilər. Qərar sizdən asılıdır.'
					}
				]
			});
			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: 'Kukla hesablar işlətdiyini güman etdiyiniz istifadəçini şikayət edin',
				name: 'work_area'
			});
			work_area.append(
				{
					type: 'dyninput',
					name: 'sockpuppet',
					label: 'Kukla hesablar',
					sublabel: 'Kukla:',
					tooltip: 'Kukla hesabın sadəcə adı ("İstifadəçi:" prefikssiz)',
					min: 2
				});
			work_area.append({
				type: 'textarea',
				label: 'Sübut:',
				name: 'evidence',
				tooltip: 'Göstərəcəyiniz sübutlar istifadəçinin bir neçə hesabdan sui-istifadə etdiyini aydın şəkildə göstərməlidir. Buna səhifə tarixçələri, redaktələrin keçidləri və istifadəçinin kuklalardan sui-istifadəsini sübut edən digər faktlar daxildir.'
			});
			work_area.append({
				type: 'checkbox',
				list: [ /*{
					label: 'Request CheckUser',
					name: 'checkuser',
					tooltip: 'CheckUser is a tool used to obtain technical evidence related to a sockpuppetry allegation. It will not be used without good cause, which you must clearly demonstrate. Make sure your evidence explains why using the tool is appropriate. It will not be used to publicly connect user accounts and IP addresses.'
				},*/ {
					label: 'Şikayət edilən istifadəçini məlumatlandır',
					name: 'notify',
					tooltip: 'Bildiriş məcburi deyil. Bir çox hallarda, xüsusən xroniki kuklalar üçün bildiriş əks nəticə verə bilər. Buna baxmayaraq, bildiriş bu şikayəti daha ədalətli edə bilər. Qərar sizdən asılıdır.'
				} ]
			});
			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: 'Redaktə müharibəsinə görə şikayət et',
				name: 'work_area'
			});
			work_area.append({
				type: 'input',
				name: 'page',
				label: 'Səhifə',
				tooltip: 'Redaktə müharibəsi aparılan səhifə'
			});
			work_area.append({
				type: 'button',
				name: 'load',
				label: 'Yüklə',
				event: function(e) {
					var root = e.target.form;

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

					// Run for each AN3 field
					var getAN3Entries = function(field, rvuser, titles) {
						var $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(function(data) {
							var pageid = data.query.pageids[0];
							var page = data.query.pages[pageid];
							if (!page.revisions) {
								$('<span class="entry">Tapılmadı</span>').appendTo($field);
							} else {
								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_' + field,
										value: rev.revid
									});
									$input.data('revinfo', rev);
									$input.appendTo($entry);
									var comment = '<span>';
									// revdel/os
									if (typeof rev.commenthidden === 'string') {
										comment += '(comment hidden)';
									} else {
										comment += '"' + rev.parsedcomment + '"';
									}
									comment += ' at <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') {
								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: 'Əlavə müzakirələrin URL keçidi: '
								});
								$free_entry.append($free_label).append($free_input).appendTo($field);
							}
						}).fail(function() {
							$('<span class="entry">API xətası, səhifəni yenidən yükləyərək cəhd edin</span>').appendTo($field);
						});
					};

					// warnings
					var uid = root.uid.value;
					getAN3Entries('warnings', mw.config.get('wgUserName'), 'User talk:' + uid);

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

						// resolutions
						var t = new mw.Title(page);
						var 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: 'İstifadəçinin geriqaytarmaları',
				tooltip: 'Geri qaytarılan redaktələri seçin'
			});
			work_area.append({
				type: 'field',
				name: 'warnings',
				label: 'Verilmiş xəbərdarlıqlar',
				tooltip: 'İstifadəçini şikayət etməzdən qabaq ona xəbərdarlıq verməlisiniz'
			});
			work_area.append({
				type: 'field',
				name: 'resolves',
				label: 'Həll təşəbbüsləri',
				tooltip: 'Problemi ilk növbədə müzakirə səhifəsində həll etmək lazımdır'
			});

			work_area.append({
				type: 'textarea',
				label: 'Şərh:',
				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('Səbəb göstərməlisiniz');
				return;
			}

			types = types.map(function(v) {
				switch (v) {
					case 'final':
						return 'son xəbərdarlıqdan sonra vandalizm';
					case 'postblock':
						return 'blokun açılmasından qısa müddət sonra vandalizm';
					case 'vandalonly':
						return 'açıq şəkildə sadəcə vandalizm məqsədli redaktələr';
					case 'promoonly':
						return 'istifadəçi hesabından yalnız reklam məqsədilə istifadə';
					case 'spambot':
						return 'spam məqsədli istifadəçi hesabı';
					default:
						return 'naməlum səbəb';
				}
			}).join('; ');


			if (form.page.value !== '') {
				// Allow links to redirects, files, and categories
				reason = 'On {{No redirect|:' + form.page.value + '}}';

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

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

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

			Morebits.wiki.actionCompleted.redirect = 'Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən şikayətlər';
			Morebits.wiki.actionCompleted.notice = 'Şikayət tamamlandı';

			var aivPage = new Morebits.wiki.page('Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən şikayətlər', 'Sorğu yerinə yetirilir');
		  //aivPage.setPageSection(1);
			aivPage.setFollowRedirect(true);

			aivPage.load(function() {
				var text = aivPage.getPageText();
				var $aivLink = '<a target="_blank" href="/wiki/Vikipediya:İnzibatçılara_müraciət/İstifadəçilərdən_şikayətlər">VP:İM/İŞ</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(uid) + '\\s*\\}\\}').test(text)) {
					aivPage.getStatusElement().error('Şikayət artıq mövcuddur, yenisi əlavə edilməyəcək');
					Morebits.status.printUserText(reason, 'Yazdığınız şərh aşağıda verilmişdir. Əllə əlavə etmək istəsəniz, surətini mübadilə buferinə köçürə və ' + $aivLink + ' səhifəsində yerləşdirə bilərsiniz:');
					return;
				}

				// then check for any bot reports
				var tb2Page = new Morebits.wiki.page('Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən şikayətlər', 'Bot şikayətləri yoxlanılır');
				tb2Page.load(function() {
					var tb2Text = tb2Page.getPageText();
					var tb2statelem = tb2Page.getStatusElement();

					if (new RegExp('\\{\\{\\s*(?:(?:[Ii][Pp])?[Vv]andal|[Uu]serlinks)\\s*\\|\\s*(?:1=)?\\s*' + Morebits.string.escapeRegExp(uid) + '\\s*\\}\\}').test(tb2Text)) {
						if (confirm(uid + ' adlı istifadəçi artıq bot tərəfindən bildirişdir. Yenə də şikayət etmək istədiyinizdən əminsinizmi?')) {
							tb2statelem.info('Bot şikayətinə baxmayaraq davam edilir');
						} else {
							tb2statelem.error('Bot tərəfindən əlavə edilmiş şikayət mövcuddur, dayandırılır');
							Morebits.status.printUserText(reason, 'Yazdığınız şərh aşağıda verilmişdir. Əllə əlavə etmək istəsəniz, surətini mübadilə buferinə köçürə və ' + $aivLink + ' səhifəsində yerləşdirə bilərsiniz:');
							return;
						}
					} else {
						tb2statelem.info('Ziddiyyətli bot şikayəti yoxdur');
					}

					aivPage.getStatusElement().status('Yeni şikayət əlavə edilir...');
					aivPage.setEditSummary('[[Special:Contributions/' + uid + '|' + uid + ']] şikayət edilir.');
					aivPage.setChangeTags(Twinkle.changeTags);
					aivPage.setAppendText('\n\n=== ' + uid + ' ===\n* {{' + (mw.util.isIPAddress(uid, true) ? 'IPvandal' : 'vandal') + '|' + (/=/.test(uid) ? '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(' və ');
			} else {
				types = [ types.slice(0, -1).join(', '), types.slice(-1) ].join(' və ');
			}
			var article = '';
			if (/[aeiouwyh]/.test(types[0] || '')) { // non 100% correct, but whatever, including 'h' for Cockney
				article = '';
			}
			reason = '\n=== ' + uid + ' ===\n* {{user-uaa|1=' + uid + '}} &ndash; ';
			if (types.length || hasShared) {
				reason += '[[Vikipediya:İstifadəçi adları|İstifadəçi adları]] prinsiplərinin pozulması: ' + types + ' məqsədli istifadəçi adı' +
					(hasShared ? ' (özlüyündə [[Vikipediya:İstifadəçi adları#Paylaşılan istifadə|paylaşılan istifadəni]] ehtiva edir). ' : '. ');
			}
			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 = 'Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən şikayətlər#İstifadəçi adları';
			Morebits.wiki.actionCompleted.notice = 'Şikayət yerinə yetirildi';

			var uaaPage = new Morebits.wiki.page('Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən şikayətlər', 'İnzibatçılara müraciət edilir');
			uaaPage.setFollowRedirect(true);

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

				// check if user has already been reported
				if (new RegExp('\\{\\{\\s*user-uaa\\s*\\|\\s*(1\\s*=\\s*)?' + Morebits.string.escapeRegExp(uid) + '\\s*(\\||\\})').test(text)) {
					uaaPage.getStatusElement().error('İstifadəçi artıq siyahıdadır.');
					var $uaaLink = '<a target="_blank" href="/wiki/Vikipediya:İnzibatçılara_müraciət/İstifadəçilərdən_şikayətlər">VP:İM/İŞ</a>';
					Morebits.status.printUserText(reason, 'Yazdığınız şərh aşağıda verilmişdir. Əllə əlavə etmək istəsəniz, surətini mübadilə buferinə köçürə və ' + $aivLink + ' səhifəsində yerləşdirə bilərsiniz:');
					return;
				}
				uaaPage.getStatusElement().status('Yeni şikayət əlavə edilir...');
				uaaPage.setEditSummary('[[Xüsusi:Fəaliyyətlər/' + uid + '|' + uid + ']] şikayət edilir.');
				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;

		// 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('You have not entered a sockmaster account for this puppet. Consider reporting this account as a sockpuppeteer instead.');
				return;
			} else if (!puppetReport && !form.sockpuppet[0].value.trim()) {
				alert('You have not entered any sockpuppet account(s) for this sockmaster. Consider reporting this account as a sockpuppet instead.');
				return;
			}

			sockParameters.uid = puppetReport ? form.sockmaster.value.trim() : uid;
			sockParameters.sockpuppets = puppetReport ? [uid] : Morebits.array.uniq($.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('Siz 3-dən az qərəzli redaktə seçmisiniz. Yenə də davam etmək istəyirsiniz?')) {
				return;
			}

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

			if (!warnings.length && !confirm('Siz istifadəçiyə xəbərdarlıq etdiyiniz redaktələri göstərmədiniz. Yenə də davam etmək istəyirsiniz?')) {
				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('Siz məsələni həll etmək üçün etdiyiniz redaktələri göstərmədiniz. Yenə də davam etmək istəyirsiniz?')) {
					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 query;
				var diff, oldid;
				var 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);
				}
				var title = mw.util.getParamValue('title', free_resolves);
				var 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(function(data) {
					var page;
					if (data.compare && data.compare.fromtitle === data.compare.totitle) {
						page = data;
					} else if (data.query) {
						var pageid = data.query.pageids[0];
						page = data.query.pages[pageid];
					} else {
						return;
					}
					an3_next(page);
				}).fail(function(data) {
					console.log('API xətarı :(', 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 = 'Notifying about suspicion of sockpuppeteering.';
		var notifyText = '\n\n{{subst:socksuspectnotice|1=' + params.uid + '}} ~~~~';

		// notify user's master account
		var masterTalkPage = new Morebits.wiki.page('User talk:' + params.uid, 'Notifying suspected sockpuppeteer');
		masterTalkPage.setFollowRedirect(true);
		masterTalkPage.setEditSummary(notifyEditSummary);
		masterTalkPage.setChangeTags(Twinkle.changeTags);
		masterTalkPage.setAppendText(notifyText);
		masterTalkPage.append();

		var statusIndicator = new Morebits.status('Notifying suspected sockpuppets', '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 + ' (completed)');
			}
		};

		var socks = params.sockpuppets;

		// notify each puppet account
		for (var i = 0; i < socks.length; ++i) {
			var sockTalkPage = new Morebits.wiki.page('User talk:' + socks[i], 'Notification for ' + socks[i]);
			sockTalkPage.setFollowRedirect(true);
			sockTalkPage.setEditSummary(notifyEditSummary);
			sockTalkPage.setChangeTags(Twinkle.changeTags);
			sockTalkPage.setAppendText(notifyText);
			sockTalkPage.append(onSuccess);
		}
	}

	// prepare the SPI report
	var text = '\n\n{{subst:SPI report|socksraw=' +
		params.sockpuppets.map(function(v) {
			return '* {{' + (mw.util.isIPAddress(v, true) ? 'checkip' : 'checkuser') + '|1=' + v + '}}';
		}).join('\n') + '\n|evidence=' + params.evidence + ' \n';

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

	var reportpage = 'Wikipedia:Sockpuppet investigations/' + params.uid;

	Morebits.wiki.actionCompleted.redirect = reportpage;
	Morebits.wiki.actionCompleted.notice = 'Şikayət əlavə edildi';

	var spiPage = new Morebits.wiki.page(reportpage, 'Müzakirə səhifəsi əldə edilir');
	spiPage.setFollowRedirect(true);
	spiPage.setEditSummary('Adding new report for [[Special:Contributions/' + params.uid + '|' + params.uid + ']].');
	spiPage.setChangeTags(Twinkle.changeTags);
	spiPage.setAppendText(text);
	spiPage.setWatchlist(Twinkle.getPref('spiWatchReport'));
	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;
		}
	}

	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(function(data) {
		Morebits.wiki.addCheckpoint(); // prevent notification events from causing an erronous "action completed"

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

		};

		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 + '}} ';
		}

		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 ' + new Morebits.date(first.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC) to ' + new Morebits.date(last.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (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 + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ';
			}).join('\n');
			return ret;
		}).reverse().join('\n');
		var warningtext = params.warnings.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ';
		}).join('\n');
		var resolvetext = params.resolves.reverse().map(function(v) {
			return '# ' + ' {{diff2|' + v.revid + '|' + new Morebits.date(v.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC)}} ';
		}).join('\n');

		if (params.free_resolves) {
			var page = params.free_resolves;
			if (page.compare) {
				resolvetext += '\n# ' + ' {{diff|oldid=' + page.compare.fromrevid + '|diff=' + page.compare.torevid + '|label=Consecutive edits on ' + page.compare.totitle + '}}';
			} else if (page.revisions) {
				var revCount = page.revisions.length;
				var 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 + '}} ';
				} else { // diff and oldid are nonconsecutive
					rev = page.revisions[0];
					var revLatest = page.revisions[revCount - 1];
					var label = 'Consecutive edits made from ' + new Morebits.date(rev.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC) to ' + new Morebits.date(revLatest.timestamp).format('HH:mm, D MMMM YYYY', 'utc') + ' (UTC) on ' + page.title;
					resolvetext += '\n# {{diff|oldid=' + rev.revid + '|diff=' + revLatest.revid + '|label=' + label + '}}\n';
				}
			}
		}

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

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

		var text = '\n\n' + '{{subst:RM3 şikayət|geriqaytarmalar=' + difftext + '|xəbərdarlıqlar=' + warningtext + '|həlletmələr=' + resolvetext + '|səhifə=' + params.page + '|orijinal=' + origtext + '|şərh=' + comment + '|istifadəçi=' + params.uid + '}}';

		var reportpage = 'Vikipediya:İnzibatçılara müraciət/İstifadəçilərdən_şikayətlər';

		Morebits.wiki.actionCompleted.redirect = reportpage;
		Morebits.wiki.actionCompleted.notice = 'Şikayət əlavə edildi';

		var an3Page = new Morebits.wiki.page(reportpage, 'Müzakirə səhifəsi əldə edilir');
		an3Page.setFollowRedirect(true);
		an3Page.setEditSummary('[[Special:Contributions/' + params.uid + '|' + params.uid + ']] şikayət edilir.');
		an3Page.setChangeTags(Twinkle.changeTags);
		an3Page.setAppendText(text);
		an3Page.append();

		// notify user

		var notifyText = '\n\n{{subst:rm3-bildiriş|1=' + mw.util.wikiUrlencode(params.uid) + '|avto=1}} ~~~~';

		var talkPage = new Morebits.wiki.page('İstifadəçi müzakirəsi:' + params.uid, 'Redaktə müharibəsi aparan istifadəçi şikayət edilir');
		talkPage.setFollowRedirect(true);
		talkPage.setEditSummary('Redaktə müharibəsindən şikayət barədə bildiriş.');
		talkPage.setChangeTags(Twinkle.changeTags);
		talkPage.setAppendText(notifyText);
		talkPage.append();
		Morebits.wiki.removeCheckpoint();  // all page updates have been started
	}).fail(function(data) {
		console.log('API xətası :(', data); // eslint-disable-line no-console
	});
};

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


// </nowiki>
Mənbə — ""

Informasiya Melumat Axtar

Anarim.Az

Sayt Rehberliyi ile Elaqe

Saytdan Istifade Qaydalari

Anarim.Az 2004-2023