/* Скрипт для закрытия страниц обсуждений
* Написан с использованием нейросети 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>