MediaWiki:Gadget-NominateToDel.js

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
/*
*****************************************
* Щоб увімкнути додаток, зайдіть у ваші налаштування, відкрийте вкладку «Додатки»
* та поставте галочку навпроти тексту «Дозволяє швидко номінувати статтю на повільне вилучення»
* (розділ «Редагування»)
*****************************************
* @author RLuts & others (see: https://uk.wikipedia.org/w/index.php?title=MediaWiki:Gadget-NominateToDel.js&action=history)
* for ukwiki only
* @ver 1.2
*/

//<nowiki>
if (typeof(window.NominateToDel) == 'undefined') {
	window.NominateToDel = {
		
		install: function () {
			if($.inArray('Статті-кандидати на вилучення', mw.config.get('wgCategories')) >= 0) {
				return;
			}
			//Текст
			this.talkPrefix = "Вікіпедія:Статті-кандидати на вилучення";
			this.preloadPage = "Вікіпедія:Статті-кандидати на вилучення/Заготовка";
			this.userTalkPrefix = 'User_talk:';
			this.nomText = 'Номінувати на вилучення';
			this.emptyReason = "Введіть причину номінації";
			this.summary = 'Статтю {article} номіновано на вилучення ([[Вікіпедія:Додатки/NominateForDel|NominateForDel.js]])';
			this.addTemplateSummary = 'Статтю номіновано на вилучення ([[Вікіпедія:Додатки/NominateForDel|NominateForDel.js]])';
			this.userTalkSummary = 'Статтю {article} номіновано на вилучення ([[Вікіпедія:Додатки/NominateForDel|NominateForDel.js]])';
			
			/* Для відлагодження додатку. Прохання не вилучати!!! У режимі «debug» замість префікса «Вікіпедія:Статті-кандидати на вилучення», «User_talk:»
			* сторінки зберігаються в наступних префіксах:
			*/
			if(mw.config.get('debug')) {
				this.talkPrefix = "User:RLuts/scripttest";
				this.userTalkPrefix = 'User:RLuts/scripttest/User_talk:';
			}
			
			var ntd = this;
			var link = mw.util.addPortletLink( 'p-cactions', '#',  this.nomText );
			$( link ).click( function ( e ) {
				e.preventDefault();
				ntd.showDialog();
			});
		},
		
		showDialog: function () {
			var ntd = this;
			if( $( '#ntd-dialog' ).length === 0 ) {
				 $( "#mw-content-text" ).append('<div id="ntd-dialog" style="display:none;" title="' + this.nomText + '"><p style="font-size:.8em; color:red">Цей інструмент дозволяє створити нове обговорення на сторінці <a style="color:red; text-decoration:underline" href="https://uk.wikipedia.org/wiki/Вікіпедія:ВИЛ">ВП:ВИЛ</a></p>Причина (вікірозміткою, підпис згенерується автоматично):<textarea id="ntd-reasonbox" rows="8" cols="100" style="margin-top: 0.1em;"></textarea><div id="ntd-preview"></div></div>');
			}
			mw.loader.using( 'jquery.ui', function() {
				$( '#ntd-dialog' ).dialog({
					width: 400,
					buttons: {
						'Зберегти' : function() {
							ntd.check();
						},
						'Попередній перегляд': function() {
							ntd.preview();
						}
					}
				});
			});
			$('#ntd-reasonbox').focus();
		},
		
		preview: function () {
			var reason = $( '#ntd-reasonbox' ).val();
			var param = {
				action: 'parse',
				format: 'json',
				prop: 'text',
				text: reason
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				console.log(data.parse.text['*']);
				$('#ntd-preview').html(data.parse.text['*']);
			});
		},
		
		check: function () {
			var reason = $( '#ntd-reasonbox' ).val();
			if( this.isEmpty( reason ) ) {
				$('#ntd-dialog').append( '<p style="font-size:80%; color:red">' + this.emptyReason + '</p>' );
				return 0;
			} else {
				this.reason = $( '#ntd-reasonbox' ).val();
				this.wait('Створюється нове обговорення на сторінці ВП:ВИЛ');
				this.getDate();
			}
		},
		
		getDate: function () {
			var ntd = this;
			var date = new Date();
			var month = date.getUTCMonth();
			var year = date.getUTCFullYear();
			var uk_month = "";
			switch(month) {
				case 0: uk_month = ' січня '; break;
				case 1: uk_month = ' лютого '; break;
				case 2: uk_month = ' березня '; break;
				case 3: uk_month = ' квітня '; break;
				case 4: uk_month = ' травня '; break;
				case 5: uk_month = ' червня '; break;
				case 6: uk_month = ' липня '; break;
				case 7: uk_month = ' серпня '; break;
				case 8: uk_month = ' вересня '; break;
				case 9: uk_month = ' жовтня '; break;
				case 10: uk_month = ' листопада '; break;
				case 11: uk_month = ' грудня '; break;
			}
				var day = date.getUTCDate();
				ntd.date = day + uk_month + year;
				ntd.getTalkPage(ntd.talkPrefix + "/" + day + uk_month + year);
		},
		
		getTalkPage: function (page) {
			var ntd = this;
			var talkcont;
			var param = {
				action: 'query',
				format: 'json',
				rvprop: 'ids',
				rvlimit: '1',
				prop: 'revisions',
				titles: page
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				param.rvprop = 'content|timestamp';
				param.indexpageids = '';
				var nominatedGender = mw.user.options.get('gender') == 'female' ? 'Поставила' : 'Поставив';
				if(data.query.pages[-1]) {
					param.titles = ntd.preloadPage;
					$.get(mw.util.wikiScript('api'), param).done(function(data) {
						talkcont = data.query.pages[data.query.pageids[0]].revisions[0]['*'].split('-->')[0] + '-->\n\n== [[' + mw.config.get('wgPageName').replace(/_/g,' ').replace('Файл:', ':Файл:') + ']] ==\n* \'\'\'' + nominatedGender + ':\'\'\' --~~~~\n* {{За}}:\n# ' + $.trim(ntd.reason).replace(/-?-?~~~~/g,'') + ' --~~~~\n* {{Проти}}:\n* {{Утримаюсь}}:\n';
						ntd.addTalk(page, talkcont);
					});
				} else {
					param.titles = page;
					$.get(mw.util.wikiScript('api'), param).done(function(data) {
						talkcont = data.query.pages[data.query.pageids[0]].revisions[0]['*'] + '\n\n== [[' + mw.config.get('wgPageName').replace(/_/g,' ').replace('Файл:', ':Файл:') + ']] ==\n* \'\'\'' + nominatedGender + ':\'\'\' --~~~~\n* {{За}}:\n# ' + $.trim(ntd.reason).replace(/-?-?~~~~/g,'') + ' --~~~~\n* {{Проти}}:\n* {{Утримаюсь}}:\n';
						var timestamp = data.query.pages[data.query.pageids[0]].revisions[0].timestamp;
						ntd.addTalk(page, talkcont, timestamp);
					});
				}
			});
		},
		
		addTalk: function (pgtalk, talkcont, timestamp) {
			var ntd = this;
			var t = '';
			if(mw.config.get( 'wgNamespaceNumber' ) == 6) t = ':';
			ntd.preferences(function(watchlist){
				watchlist == undefined ? watchlist_aux = undefined: watchlist_aux = watchlist.watchlist_discussionpage;
				ntd.writeInPage( pgtalk, talkcont, timestamp, ntd.summary.replace('{article}', '[[' + t + mw.config.get('wgPageName') + ']]').replace(/_/g,' '), null, null, watchlist_aux, function() {
					ntd.addTemplate(watchlist);
				});
			});
		},
		
		addTemplate: function (watchlist) {
			var ntd = this;
			watchlist == undefined ? watchlist_aux = undefined: watchlist_aux = watchlist.watchlist_nominatedpage;
			this.wait('Додається шаблон {{delete}} на сторінку ' + mw.config.get( 'wgPageName' ).replace(/_/g,' '));
			this.writeInPage( mw.config.get( 'wgPageName' ), '{{subst:afd}}\n', '', this.addTemplateSummary, 'prependtext', null, watchlist_aux, function () {
				ntd.getCreator(watchlist);
			});
		},
		
		getCreator: function (watchlist) {
			var ntd = this;
			this.wait('Додається повідомлення на сторінку обговорення автора статті');
			var param = {
				action: 'query',
				prop: 'revisions',
				format: 'json',
				rvlimit: '1',
				rvdir: 'newer',
				rvprop: 'user',
				indexpageids: '',
				titles: mw.config.get ( 'wgPageName' )
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				if(data.query.pages[data.query.pageids[0]].revisions[0].anon === undefined && data.query.pages[data.query.pageids[0]].revisions[0].user) {
					ntd.isOnTop(data.query.pages[data.query.pageids[0]].revisions[0].user, watchlist);
				} else {
					ntd.success();
				}
			});
		},
		
		isOnTop: function (user, watchlist) {
			var ntd = this;
			var param = {
				action: 'query',
				prop: 'templates',
				format: 'json',
				tllimit: '1',
				tltemplates: 'Template:Нові_зверху',
				indexpageids: '',
				titles: this.userTalkPrefix + user
			};
			$.get(mw.util.wikiScript('api'), param).done(function(data) {
				if(data.query.pages[data.query.pageids[0]].templates) {
					ntd.notifyUser(user, true, watchlist);
				} else {
					ntd.notifyUser(user, false, watchlist);
				}	
			});
		},
		
		notifyUser: function (user, top, watchlist) {
			var ntd = this;
			var content, timestamp;
			watchlist == undefined ? watchlist_aux = undefined: watchlist_aux = watchlist.watchlist_usertalkpage;
			if(top) {
				var param = {
					action: 'query',
					prop: 'revisions',
					format: 'json',
					rvprop: 'content|timestamp',
					rvlimit: '1',
					rvsection: '0',
					titles: this.userTalkPrefix + user,
					indexpageids: ''
				};
				$.get(mw.util.wikiScript('api'), param).done(function(data) {
					content = data.query.pages[data.query.pageids[0]].revisions[0]['*'] + '\n\n{{subst:папв|' + mw.config.get( 'wgPageName' ).replace(/_/g,' ') + '|' + ntd.date + '}} --~~~~';
					timestamp = data.query.pages[data.query.pageids[0]].revisions[0].timestamp;
					ntd.writeInPage ( ntd.userTalkPrefix + user, content, timestamp, ntd.userTalkSummary.replace('{article}', '[[' + mw.config.get('wgPageName').replace(/_/g,' ') + ']]'), null, 0, watchlist_aux, function() {
						ntd.success();
					});
				});
			} else {
				content = '\n\n{{subst:папв|' + mw.config.get( 'wgPageName' ).replace(/_/g,' ') + '|' + ntd.date + '}} --~~~~';
				ntd.writeInPage ( ntd.userTalkPrefix + user, content, '', ntd.userTalkSummary.replace('{article}', '[[' + mw.config.get('wgPageName') + ']]').replace(/_/g,' '), 'appendtext', null, watchlist_aux, function() {
					ntd.success();
				});
			}
		},
		
		success: function() {
			this.wait('Перезавантаження сторінки');
			setTimeout(function(){
				$( '#ntd-dialog' ).dialog('close');
					location.reload(); },1000
				);			
		},
		
		wait: function(mes) {
			$('#ntd-dialog').dialog("close");
			$('#ntd-dialog').prop('title', 'Зачекайте, будь ласка...');
			$('#ntd-dialog').html('<p style="font-size: 120%; font-weight:bold;">' + mes + '</p>');
			$('#ntd-dialog').dialog({
				modal: true,
				buttons: false
			});
		},
		
		isEmpty: function( str ) {
			return (!/\S/.test(str));
		},
		preferences: function (next) {
			var params = {
				action: 'query',
				titles: 'User:'+ mw.config.get("wgUserName") +'/gadget-preferences.json',
				prop: 'pageprops',
				format: 'json'
			};
			var api = new mw.Api();
			api.get( params ).then( function ( data ) {
				if (data.query.pages[-1] == undefined) {
					$.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=User:' + mw.config.get("wgUserName") + '/gadget-preferences.json', function(data){
						next(data.NominateToDel);
					});
				}
				else
					next();
			});
		},
		
		writeInPage: function ( title, content, timestamp, summary, option, section, watchlist, success ) {
			var ntd = this;
			if (watchlist == undefined)
				watchlist = 'watch';
			var param = {
				action: 'edit',
				title: title, 
				summary: summary, 
				watchlist: watchlist,
				basetimestamp: timestamp,
				format: 'json'
			};
			param[option || 'text'] = content;
			if (section || section === 0) 
				param.section = section;
			api = new mw.Api();
			api.postWithToken( 'csrf', param ).done( function ( data ) {
				if (data.edit.result == 'Success') {
					success();
				}
			}).fail(function (code) {
				switch(code) {
					case 'editconflict':
						alert('Конфлікт редагувань на сторінці ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте ще раз');
						break;
					case 'protectedpage':
						alert('Сторінка ' + title + ' захищена. Зв\'яжіться з адміністраторами на сторінці ВП:Запити до адміністраторів');
						break;
					case 'spamdetected':
						alert('При редагуванні сторінки ' + title + ' автоматичний фільтр визначив ваш текст, як спам');
						break;
					case 'blocked':
						alert('Ви заблоковані у цій вікі. Спробуйте, будь ласка, пізніше');
						break;
					case 'abusefilter-disallowed':
						alert('Автоматичний фільтр заборонив редагування сторінки ' + title);
						break;
					case 'notoken':
						alert('Неможливо отримати токен. Зверніться, будь ласка, у «Кнайпу (адміністрування)»');
						break;
					default:
						alert('Невідома помилка при редагуванні сторінки ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте пізніше');
						break;
				}
				ntd.success();
			});
		}
	};
}
//</nowiki>
$(document).ready(function () {
	if((mw.config.get( 'wgNamespaceNumber' ) === 0 || mw.config.get('debug') || mw.config.get( 'wgNamespaceNumber' ) == 6 || mw.config.get( 'wgNamespaceNumber' ) == 10) && mw.config.get('wgArticleId') > 0) {
		NominateToDel.install();
	}
});