Участница:Megitsune-chan/close-discussions.js

/* Скрипт для закрытия страниц обсуждений 
 * Написан с использованием нейросети claude-3-5-sonnet-20241022
 * Версия скрипта: 1.0
 */
 
// <nowiki>
$(function() {
	'use strict';
	
	const templateConfig = {
	'К_восстановлению': 'ВУС-Навигация',
	'К_объединению': 'КОБ-Навигация', 
	'К_переименованию': 'КПМ-Навигация',
	'К_разделению': 'КР-Навигация',
	'К_улучшению': 'КУЛ-Навигация',
	'К_удалению': 'КУ-Навигация'
};

	const pageName = mw.config.get('wgPageName');
	
	let api;

	// Функция для проверки, является ли страница текущей датой
	function isCurrentDatePage(pageName) {
		const today = new Date();
		const months = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 
						'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
		const currentDateString = `${today.getDate()}_${months[today.getMonth()]}_${today.getFullYear()}`;
		return pageName.endsWith(currentDateString);
	}

	const discussionType = Object.keys(templateConfig).find(type => 
		pageName.includes('Википедия:' + type + '/'));

	if (!discussionType || isCurrentDatePage(pageName)) return;
	if (mw.config.get('wgUserName') === null) return;
	
	// Создаём кнопку и её контейнер
	const $buttonContainer = $('<div>')
		.css({
			'position': 'absolute',
			'left': '0.5em',
			'top': '50%',
			'transform': 'translateY(-50%)',
			'z-index': '1'
		});
		
	const $closeButton = $('<button>')
		.text('Закрыть день')
		.addClass('mw-ui-button')
		.addClass('mw-ui-progressive')
		.css({
			'padding': '5px 10px',
			'cursor': 'pointer',
			'white-space': 'nowrap',
			'margin': '0'
		})
		.click(handleClose);
	
	$buttonContainer.append($closeButton);
	
	// Инициализация
	mw.loader.using([
		'mediawiki.api',
		'mediawiki.ui.button',
	], () => {
		api = new mw.Api();
		
		// Используем хук для гарантированного добавления кнопки
		mw.hook('wikipage.content').add(function () {
			// Находим основной контейнер шаблона
			const $mainContainer = $('.ts-Шапка_обсуждений_по_дням');
		
			if ($mainContainer.length) {
				// Добавляем контейнер с кнопкой
				$mainContainer.css('position', 'relative');
				$mainContainer.append($buttonContainer);
			
				// Добавляем отступ для контента
				const $content = $mainContainer.find('.ts-Шапка_обсуждений_по_дням-content');
				$content.css({
					'margin-left': '90px',
					'margin-right': '0'
				});
			}
		});
	});
	
	function handleClose() {
		if (!confirm('Вы уверены, что хотите закрыть обсуждение за этот день?')) {
			return;
		}
		
		const templateName = templateConfig[discussionType];
		api = api || new mw.Api();
		
		api.get({
			action: 'query',
			prop: 'revisions',
			titles: pageName,
			rvprop: 'content',
			rvslots: 'main',
			formatversion: '2'
		}).then(function(response) {
			const pageContent = response.query.pages[0].revisions[0].slots.main.content;
			
			const newContent = pageContent.replace(
				new RegExp('\\{\\{' + templateName + '\\}\\}'),
				'{{' + templateName + '|closed=1}}'
			);
			
			api.postWithToken('csrf', {
				action: 'edit',
				title: pageName,
				text: newContent,
				summary: 'Закрытие страницы обсуждений [[Участница:Megitsune-chan/close-discussions|скриптом]]',
				assertuser: mw.config.get( 'wgUserName' ),
				bot: false
			}).then(function() {
				location.reload();
			}).catch(function(error) {
				console.error('Ошибка при сохранении:', error);
				alert('Произошла ошибка при сохранении изменений');
			});
		}).catch(function(error) {
			console.error('Ошибка при получении содержимого:', error);
			alert('Произошла ошибка при получении содержимого страницы');
		});
	}
});
// </nowiki>
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya