//<nowiki>
/******/ (() => { // webpackBootstrap
/******/ "use strict";
;// CONCATENATED MODULE: ./src/utils/utils.ts
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
const api = new mw.Api();
const currentPageName = mw.config.get('wgPageName');
const currentPageNameNoUnderscores = currentPageName.replace(/_/g, ' ');
const currentUser = mw.config.get('wgUserName');
const relevantUserName = mw.config.get("wgRelevantUserName");
const currentNamespace = mw.config.get('wgNamespaceNumber');
const currentAction = mw.config.get('wgAction');
const currentSkin = mw.config.get('skin');
const diffNewId = mw.config.get('wgDiffNewId');
const userFlags = mw.config.get('wgUserGroups');
const isCurrentUserSysop = userFlags.includes('sysop');
const abbreviatedMonths = {
ene: 1,
feb: 2,
mar: 3,
abr: 4,
may: 5,
jun: 6,
jul: 7,
ago: 8,
sep: 9,
oct: 10,
nov: 11,
dic: 12
};
function getTalkPage(mainPageName) {
const namespaces = {
"Plantilla:": "Plantilla_discusión:",
"Anexo:": "Anexo_discusión:",
"Wikipedia:": "Wikipedia_discusión:",
"Ayuda:": "Ayuda_discusión:",
"Wikiproyecto:": "Wikiproyecto_discusión:"
};
for (const namespace in namespaces) {
if (mainPageName.startsWith(namespace)) {
return mainPageName.replace(namespace, namespaces);
}
}
return "Discusión:" + mainPageName;
}
function getPageNamespace(pageName) {
return __awaiter(this, void 0, void 0, function* () {
const params = {
action: 'query',
format: 'json',
titles: pageName,
prop: 'info',
};
const data = yield api.get(params);
const pages = data.query.pages;
for (let p in pages) {
const namespace = pages.ns;
return namespace;
}
return null;
});
}
function stripTalkPagePrefix(pageName) {
if (pageName.startsWith("Discusión:")) {
return pageName.substring("Discusión:".length);
}
return pageName;
}
function createStatusWindow(window) {
window.setTitle('Procesando acciones');
let statusdiv = document.createElement('div');
statusdiv.style.padding = '15px';
window.setContent(statusdiv);
Morebits.status.init(statusdiv);
window.display();
}
function getCreator() {
return __awaiter(this, void 0, void 0, function* () {
const params = {
action: 'query',
prop: 'revisions',
titles: currentPageName,
rvprop: 'user',
rvdir: 'newer',
format: 'json',
rvlimit: 1,
};
const response = yield api.get(params);
const pages = response.query.pages;
for (let p in pages) {
return pages.revisions.user;
}
return null;
});
}
function getPageCreationInfo(pagename) {
return __awaiter(this, void 0, void 0, function* () {
const firstEditInfo = yield getFirstPageEdit(pagename);
if (firstEditInfo) {
const obj = {
author: firstEditInfo.revisions.user,
timestamp: firstEditInfo.revisions.timestamp
};
return obj;
}
else {
return null;
}
});
}
function getFirstPageEdit(pageName) {
return __awaiter(this, void 0, void 0, function* () {
const params = {
action: 'query',
prop: 'revisions',
titles: pageName,
rvdir: 'newer',
format: 'json',
rvlimit: 1
};
const response = yield api.get(params);
const pages = response.query.pages;
for (let p in pages) {
return pages;
}
return null;
});
}
function isPageMissing(title) {
return __awaiter(this, void 0, void 0, function* () {
const params = {
action: 'query',
titles: title,
prop: 'pageprops',
format: 'json'
};
const apiPromise = api.get(params);
const data = yield apiPromise;
const result = data.query.pages;
return Object.prototype.hasOwnProperty.call(result, "-1");
});
}
function getProtectionStatus(pageName) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const interfaceExtensions = ;
if (currentNamespace == 8 || interfaceExtensions.some(ext => pageName.endsWith(ext))) {
return {
level: 'solo administradores de interfaz',
expiry: ''
};
}
const params = {
action: 'query',
prop: 'info',
inprop: 'protection',
titles: pageName,
format: 'json',
};
const apiPromise = api.get(params);
const data = yield apiPromise;
const pages = data.query.pages;
let object = {
level: 'sin protección',
expiry: ''
};
for (let p in pages) {
for (let info of pages.protection) {
if ((info === null || info === void 0 ? void 0 : info.type) == 'move') {
continue;
}
else {
const protectionLevel = info === null || info === void 0 ? void 0 : info.level;
switch (protectionLevel) {
case 'sysop':
object.level = 'solo bibliotecarios';
break;
case 'autoconfirmed':
object.level = 'solo usuarios autoconfirmados';
break;
case 'templateeditor':
object.level = 'solo editores de plantillas';
break;
}
if (info === null || info === void 0 ? void 0 : info.expiry) {
const expiryTimeStamp = (_a = pages.protection) === null || _a === void 0 ? void 0 : _a.expiry;
object.expiry = expiryTimeStamp;
}
}
}
}
return object;
});
}
function getContent(pageName) {
return __awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f, _g;
const params = {
action: 'query',
prop: 'revisions',
titles: pageName,
rvprop: 'content',
rvslots: 'main',
formatversion: '2',
format: 'json'
};
const apiPromise = api.get(params);
try {
const data = yield apiPromise;
if ((_b = (_a = data.query) === null || _a === void 0 ? void 0 : _a.pages) === null || _b === void 0 ? void 0 : _b.missing) {
return null;
}
return (_g = (_f = (_e = (_d = (_c = data.query) === null || _c === void 0 ? void 0 : _c.pages) === null || _d === void 0 ? void 0 : _d.revisions) === null || _e === void 0 ? void 0 : _e.slots) === null || _f === void 0 ? void 0 : _f.main) === null || _g === void 0 ? void 0 : _g.content;
}
catch (error) {
console.error('Error fetching page content:', error);
throw error;
}
});
}
function deletePage(pageName, deleteTalk, reason) {
return __awaiter(this, void 0, void 0, function* () {
let params = {
action: 'delete',
title: pageName,
format: 'json',
deletetalk: deleteTalk
};
if (reason !== undefined) {
params.reason = reason;
}
try {
const responseData = yield api.postWithToken('csrf', params);
}
catch (error) {
console.error('Error deleting the page:', error);
throw error;
}
});
}
function todayAsTimestamp() {
const today = new Date();
const timestamp = today.getTime().toString();
return timestamp;
}
function parseTimestamp(timeStamp) {
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
};
const date = new Date(timeStamp);
return date.toLocaleDateString('es-ES', options);
}
const today = parseTimestamp(todayAsTimestamp());
function convertDateToISO(date) {
return date.toISOString();
}
function calculateTimeDifferenceBetweenISO(olderISO, newerISO) {
const olderTimestamp = new Date(olderISO).getTime();
const newerTimestamp = new Date(newerISO).getTime();
const differenceInMilliseconds = newerTimestamp - olderTimestamp;
const millisecondsInADay = 24 * 60 * 60 * 1000;
const millisecondsInAnHour = 60 * 60 * 1000;
const days = Math.floor(differenceInMilliseconds / millisecondsInADay);
const remainingMillisecondsAfterDays = differenceInMilliseconds % millisecondsInADay;
const hours = Math.floor(remainingMillisecondsAfterDays / millisecondsInAnHour);
return { days, hours };
}
function finishMorebitsStatus(window, statusWindow, status, refresh) {
let statusState, statusMessage, statusType;
switch (status) {
case 'finished':
statusState = '✔️ Finalizado';
statusMessage = refresh ? 'actualizando página...' : 'cerrando ventana...';
statusType = 'status';
break;
case 'error':
statusState = '❌ Se ha producido un error';
statusMessage = 'Comprueba las ediciones realizadas';
statusType = 'error';
break;
}
new Morebits.status(statusState, statusMessage, statusType);
if (refresh) {
setTimeout(() => {
location.reload();
}, 2500);
}
else if (!refresh && status !== 'error') {
setTimeout(() => {
statusWindow.close();
window.close();
}, 2500);
}
}
function checkIfOpenDR(pagename) {
return __awaiter(this, void 0, void 0, function* () {
const content = yield getContent(pagename);
if (content) {
return !content.includes('{{cierracdb-arr}}');
}
});
}
function getBlockInfo(username) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const params = {
action: "query",
list: "blocks",
bkusers: username,
bklimit: 1,
bkprop: .join('|'),
format: "json"
};
const response = yield api.get(params);
const blocks = (_a = response === null || response === void 0 ? void 0 : response.query) === null || _a === void 0 ? void 0 : _a.blocks;
if (blocks.length) {
return {
blockStart: blocks.timestamp,
blockEnd: blocks.expiry,
reason: blocks.reason,
};
}
else {
return null;
}
});
}
function getConfigPage() {
return __awaiter(this, void 0, void 0, function* () {
const localStorageSettings = localStorage.getItem("TwinkleLiteUserSettings");
if (localStorageSettings) {
return JSON.parse(localStorageSettings);
}
else {
try {
const onWikiSettings = yield getContent(`Usuario:${currentUser}/twinkle-lite-settings.json`);
if (onWikiSettings) {
return JSON.parse(onWikiSettings);
}
}
catch (error) {
console.error("Hubo un error cargando las preferencias", error);
return null;
}
}
return null;
});
}
;// CONCATENATED MODULE: ./src/modules/deletionrequestmaker.ts
var deletionrequestmaker_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let Window;
const deletionRequestCategoryOptions = [
{ code: 'B', name: 'Biografías' },
{ code: 'CAT', name: 'Categorías' },
{ code: 'D', name: 'Deportes y juegos' },
{ code: 'F', name: 'Ficción y artes' },
{ code: 'I', name: 'Inclasificables' },
{ code: 'L', name: 'Lugares y transportes' },
{ code: 'M', name: 'Música y medios de comunicación' },
{ code: 'N', name: 'Consultas sin clasificar todavía' },
{ code: 'O', name: 'Organizaciones, empresas y productos' },
{ code: 'P', name: 'Plantillas y userboxes' },
{ code: 'S', name: 'Sociedad' },
{ code: 'T', name: 'Ciencia y tecnología' },
{ code: 'W', name: 'Web e internet' }
];
function getCategoryOptions() {
let categoryOptions = ;
for (let category of deletionRequestCategoryOptions) {
let option = { type: 'option', value: category.code, label: category.name };
categoryOptions.push(option);
}
return categoryOptions;
}
function buildDeletionTemplate(category, reason) {
return `{{sust:cdb2|pg={{sust:SUBPAGENAME}}|cat=${category}|texto=${reason}|{{sust:CURRENTDAY}}|{{sust:CURRENTMONTHNAME}}}} ~~~~`;
}
function createDeletionRequestPage(category, reason) {
return deletionrequestmaker_awaiter(this, void 0, void 0, function* () {
const missingPage = yield isPageMissing(`Wikipedia:Consultas de borrado/${currentPageName}`);
if (missingPage) {
return new mw.Api().create(`Wikipedia:Consultas de borrado/${currentPageName}`, { summary: `Creando página de discusión para el borrado de ] mediante ]` }, buildDeletionTemplate(category, reason));
}
else {
const content = yield getContent(`Wikipedia:Consultas de borrado/${currentPageName}`);
if (content && (content.includes('{{archivo borrar cabecera') || content.includes('{{cierracdb-arr}}'))) {
const confirmMessage = `Parece que ya se había creado una consulta de borrado para ${currentPageNameNoUnderscores} cuyo resultado fue MANTENER. ¿Quieres abrir una segunda consulta?`;
if (confirm(confirmMessage)) {
return new mw.Api().create(`Wikipedia:Consultas de borrado/${currentPageName}_(segunda_consulta)`, { summary: `Creando página de discusión para el borrado de ] mediante ]` }, buildDeletionTemplate(category, reason));
}
else {
new Morebits.status("Proceso interrumpido", "acción abortada por el usuario... actualizando página", "error");
setTimeout(() => { location.reload(); }, 4000);
}
}
else {
alert('Parece que ya existe una consulta en curso');
new Morebits.status("Proceso interrumpido", "ya existe una consulta en curso", "error");
setTimeout(() => { location.reload(); }, 4000);
}
}
});
}
function buildEditOnNominatedPage(revision) {
return {
text: '{{sust:cdb}}\n' + revision.content,
summary: `Nominada para su borrado, véase ] mediante ]`,
minor: false
};
}
function makeEditOnOtherNominatedPages(article) {
return deletionrequestmaker_awaiter(this, void 0, void 0, function* () {
yield new mw.Api().edit(article, (revision) => {
return {
text: `{{sust:cdb|${currentPageName}}}\n` + revision.content,
summary: `Nominada para su borrado, véase ] mediante ]`,
minor: false
};
});
});
}
function postsMessage(creator) {
return deletionrequestmaker_awaiter(this, void 0, void 0, function* () {
if (creator) {
const mustCreateNewTalkPage = yield isPageMissing(`Usuario_discusión:${creator}`);
if (mustCreateNewTalkPage) {
return new mw.Api().create(`Usuario_discusión:${creator}`, { summary: 'Aviso al usuario de la apertura de una CDB mediante ]' }, `{{sust:Aviso cdb|${currentPageNameNoUnderscores}}} ~~~~`);
}
else {
return new mw.Api().edit(`Usuario_discusión:${creator}`, (revision) => {
return {
text: revision.content + `\n{{sust:Aviso cdb|${currentPageNameNoUnderscores}}} ~~~~`,
summary: 'Aviso al usuario de la apertura de una CDB mediante ]',
minor: false
};
});
}
}
});
}
function submitMessage(e) {
let form = e.target;
let input = Morebits.quickForm.getInputData(form);
if (input.reason === ``) {
alert("No se ha establecido un motivo.");
}
else {
if (window.confirm(`Esto creará una consulta de borrado para el artículo ${currentPageNameNoUnderscores}, ¿estás seguro?`)) {
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", "comprobando disponibilidad y creando la página de discusión de la consulta de borrado...", "info");
createDeletionRequestPage(input.category, input.reason)
.then(function () {
new Morebits.status("Paso 2", "colocando plantilla en la(s) página(s) nominada(s)...", "info");
return new mw.Api().edit(currentPageName, buildEditOnNominatedPage);
})
.then(function () {
if (input.otherArticleFieldBox) {
const otherArticleArray = Array.from(document.querySelectorAll('input'));
const mappedArray = otherArticleArray.map((o) => o.value);
for (let article of mappedArray) {
makeEditOnOtherNominatedPages(article);
}
}
})
.then(function () {
return deletionrequestmaker_awaiter(this, void 0, void 0, function* () {
if (!input.notify)
return;
new Morebits.status("Paso 3", "publicando un mensaje en la página de discusión del creador...", "info");
const creator = yield getCreator();
return postsMessage(creator);
});
})
.then(function () {
new Morebits.status("✔️ Finalizado", "actualizando página...", "status");
setTimeout(() => { location.reload(); }, 2000);
})
.catch(function (error) {
new Morebits.status("❌ Se ha producido un error", "Comprueba las ediciones realizadas", "error");
console.log(`Error: ${error}`);
});
}
}
}
function createDeletionRequestMarkerFormWindow() {
Window = new Morebits.simpleWindow(620, 530);
Window.setScriptName('Twinkle Lite');
Window.setTitle('Consulta de borrado');
Window.addFooterLink('Política de consultas de borrado', 'Wikipedia:Consultas de borrado mediante argumentación');
const form = new Morebits.quickForm(submitMessage);
form.append({
type: 'textarea',
name: 'reason',
label: 'Describe el motivo:',
tooltip: 'Puedes usar wikicódigo en tu descripción, tu firma se añadirá automáticamente.'
});
const categoryField = form.append({
type: 'field',
label: 'Categorías:',
});
categoryField.append({
type: 'select',
name: 'category',
label: 'Selecciona la categoría de la página:',
list: getCategoryOptions()
});
form.append({
type: 'checkbox',
list: [{
name: "notify",
value: "notify",
label: "Notificar al creador de la página",
checked: true,
tooltip: "Marca esta casilla para que Twinkle Lite deje un mensaje automático en la página de discusión del creador advirtiéndole del posible borrado de su artículo"
}],
style: "padding-left: 1em;"
});
form.append({
type: 'checkbox',
list: [{
name: "otherArticles",
value: "otherArticles",
label: "Aplicar la CDB a más artículos",
checked: false,
}],
style: "padding-left: 1em; padding-bottom:0.5em;",
event: (e) => {
const checked = e.target.checked;
const box = document.getElementById('otherArticleFieldBox');
if (box) {
if (checked) {
box.style.display = '';
const boxAddButton = document.querySelector('input');
if (boxAddButton) {
boxAddButton.value = "añadir";
boxAddButton.style.marginTop = '0.3em';
boxAddButton.addEventListener('click', () => {
const boxRemoveButton = document.querySelector('input');
if (boxRemoveButton) {
boxRemoveButton.value = "eliminar";
boxRemoveButton.style.marginLeft = '0.3em';
}
});
}
}
else {
box.style.display = 'none';
}
}
}
});
form.append({
type: 'dyninput',
label: 'Otros artículos a los que aplicar la consulta:',
sublabel: 'Artículo:',
name: 'otherArticleFieldBox',
style: "display: none;",
id: 'otherArticleFieldBox',
tooltip: 'Escribe el nombre del artículo sin ningún tipo de wikicódigo'
});
form.append({
type: 'submit',
label: 'Aceptar'
});
const result = form.render();
Window.setContent(result);
Window.display();
}
;// CONCATENATED MODULE: ./src/modules/blockappeals.ts
var blockappeals_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let blockappeals_Window;
let blockInfoObject;
const resolutionOptions = ;
function getResolutionOptions() {
return resolutionOptions.map((e) => {
return { type: 'option', value: e, label: e };
});
}
function fetchAndShowBlockStatus() {
return blockappeals_awaiter(this, void 0, void 0, function* () {
blockInfoObject = yield getBlockInfo(relevantUserName);
const blockStatusDiv = document.querySelector("#blockStatus");
if (blockStatusDiv) {
if (blockInfoObject) {
if (blockInfoObject.blockEnd == 'infinity') {
blockStatusDiv.innerHTML = 'El usuario está bloqueado para siempre';
}
else {
const currentTimeInISO = convertDateToISO(new Date());
const timeUntilUnblock = calculateTimeDifferenceBetweenISO(currentTimeInISO, blockInfoObject.blockEnd);
blockStatusDiv.innerHTML = `El bloqueo acabará en ${timeUntilUnblock.days} días y ${timeUntilUnblock.hours} horas.`;
}
}
else {
blockStatusDiv.innerHTML = 'El usuario no está bloqueado o su bloqueo es de rango de IP';
}
}
});
}
function modifyFooterLink() {
const element = document.querySelector('span.morebits-dialog-footerlinks> a');
element.href = `https://es.wikipedia.org/w/index.php?title=Especial:Registro&page=${relevantUserName}&type=block`;
}
function fetchAppeal(pageContent) {
const desbloquearStartPattern = /{{\s*desbloquear\s*\|/i;
const match = desbloquearStartPattern.exec(pageContent);
if (!match) {
return null;
}
const startIndex = match.index + match.length;
let braceCount = 1;
let result = '';
let i = startIndex;
while (i < pageContent.length) {
const char = pageContent;
const nextTwoChars = pageContent.slice(i, i + 2);
if (nextTwoChars === '{{') {
braceCount++;
result += '{{';
i += 2;
}
else if (nextTwoChars === '}}') {
braceCount--;
if (braceCount === 0) {
i += 2;
break;
}
result += '}}';
i += 2;
}
else {
result += char;
i++;
}
}
result = result.trim();
if (result.startsWith('1=')) {
result = result.slice(2).trim();
}
return result || null;
}
function prepareAppealResolutionTemplate(appeal, explanation, resolution) {
return `{{Desbloqueo revisado|${appeal}|${explanation} ~~~~|${resolution.toLowerCase()}}}`;
}
function substitutePageContent(text, newTemplate) {
const desbloquearStartPattern = /{{\s*desbloquear\s*\|/i;
const match = desbloquearStartPattern.exec(text);
if (!match) {
return text;
}
const startIndex = match.index;
let braceCount = 1;
let i = match.index + match.length;
while (i < text.length) {
const nextTwoChars = text.slice(i, i + 2);
if (nextTwoChars === '{{') {
braceCount++;
i += 2;
}
else if (nextTwoChars === '}}') {
braceCount--;
i += 2;
if (braceCount === 0) {
break;
}
}
else {
i++;
}
}
const beforeTemplate = text.slice(0, startIndex);
const afterTemplate = text.slice(i);
return beforeTemplate + newTemplate + afterTemplate;
}
function makeEdit(pageContent, newTemplate, resolution) {
return blockappeals_awaiter(this, void 0, void 0, function* () {
new Morebits.status("Paso 1", "cerrando la petición de desbloqueo...", "info");
yield api.edit(currentPageName, (revision) => ({
text: substitutePageContent(pageContent, newTemplate),
summary: `Cierro petición de desbloqueo con resultado: ${resolution.toLowerCase()} mediante ]`,
minor: false
}));
});
}
function blockappeals_submitMessage(e) {
return blockappeals_awaiter(this, void 0, void 0, function* () {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
const content = yield getContent(currentPageName);
if (content) {
const appeal = fetchAppeal(content);
if (appeal) {
const filledTemplate = prepareAppealResolutionTemplate(appeal, input.reason, input.resolution);
try {
yield makeEdit(content, filledTemplate, input.resolution);
finishMorebitsStatus(blockappeals_Window, statusWindow, 'finished', true);
}
catch (error) {
finishMorebitsStatus(blockappeals_Window, statusWindow, 'error');
console.error(error);
}
}
}
});
}
function createBlockAppealsWindow() {
blockappeals_Window = new Morebits.simpleWindow(620, 530);
blockappeals_Window.setScriptName('Twinkle Lite');
blockappeals_Window.setTitle('Revisar apelación de bloqueo');
blockappeals_Window.addFooterLink('Historial de bloqueos del usuario', '');
modifyFooterLink();
const form = new Morebits.quickForm(blockappeals_submitMessage);
form.append({
type: 'div',
id: 'blockStatus',
label: '⌛️ Cargando estado de bloqueo del usuario...'
});
const resolutionDiv = form.append({
type: 'field',
name: 'appealDiv',
label: 'Resolución:'
});
resolutionDiv.append({
type: 'select',
id: 'resolutionSelect',
name: 'resolution',
label: 'Selecciona el resultado de la resolución:',
list: getResolutionOptions()
});
resolutionDiv.append({
type: 'textarea',
id: 'reasonTextArea',
name: 'reason',
label: 'Describe detalladamente la resolución:',
tooltip: 'Puedes usar Wikicódigo, pero no es necesario que añades la firma, esta aparecerá de forma automática.',
required: true
});
form.append({
type: 'submit',
label: 'Aceptar',
});
const result = form.render();
blockappeals_Window.setContent(result);
blockappeals_Window.display();
fetchAndShowBlockStatus();
}
;// CONCATENATED MODULE: ./src/modules/deletionrequestcloser.ts
var deletionrequestcloser_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let deletionrequestcloser_Window;
let nominatedPage;
let DROpeningDate;
const closureOptions = ;
let timeElapsed;
const DRC = {
closedDR: {
top: (veredict, comment) => {
return `{{cierracdb-arr}} '''${veredict.toUpperCase()}'''. ${comment ? comment + ' ' : ''}~~~~`;
},
bottom: '{{cierracdb-ab}}'
},
talkPage: (veredict) => deletionrequestcloser_awaiter(void 0, void 0, void 0, function* () {
if (!DROpeningDate) {
const creationInfo = yield getPageCreationInfo(currentPageName);
if (creationInfo) {
DROpeningDate = parseTimestamp(creationInfo === null || creationInfo === void 0 ? void 0 : creationInfo.timestamp);
}
}
return `{{cdbpasada|página=${currentPageName}|fecha=${DROpeningDate}|resultado='''${veredict}'''}}`;
}),
articlePage: {
removeTemplate: (content) => {
const pattern = /<!-- Por favor, no retires este mensaje hasta que se resuelva el proceso -->*?<!-- Fin del mensaje de la consulta, puedes editar bajo esta línea -->/g;
return content.replace(pattern, '');
}
}
};
function getClosureOptions() {
return closureOptions.map((e) => {
return { type: 'option', value: e, label: e };
});
}
function changeSubmitButtonName(checked) {
const button = document.querySelector('button.submitButtonProxy');
if (button) {
button.innerHTML = checked ? 'Prorrogar CDB' : 'Cerrar CDB';
}
}
function changeSelectMenuStatus(checked) {
const selectMenu = document.getElementById('CDBResultSelectMenu');
if (selectMenu) {
selectMenu.disabled = checked;
}
}
function showPostponeCheckbox() {
const box = document.getElementById('DRMPostponeBox');
if (box) {
box.style.display = 'block';
}
}
function findLastPostponementDate(text) {
const prorrogarRegex = /'''Prorrogada para generar más discusión.*?(\d{1,2})\s*(\w+)\s*(\d{4}) \(UTC\)/gi;
let match;
let lastDate = null;
while ((match = prorrogarRegex.exec(text)) !== null) {
const = , match.toLowerCase(), match];
const month = abbreviatedMonths;
if (!month)
continue;
const currentDate = new Date(parseInt(year), month - 1, parseInt(day));
if (!lastDate || currentDate > lastDate) {
lastDate = currentDate;
}
}
return lastDate ? lastDate.toISOString() : null;
}
function showCreationDateAndTimeElapsed(creationDateAsTimestamp, prorroga) {
const span = document.querySelector("div > span.quickformDescription");
if (span) {
timeElapsed = calculateTimeDifferenceBetweenISO(creationDateAsTimestamp, convertDateToISO(new Date()));
const format = {
emoji: timeElapsed.days >= 14 ? '✔️' : '❌',
color: timeElapsed.days >= 14 ? 'var(--color-destructive--focus);' : 'var(--color-destructive);',
};
span.innerHTML = `${format.emoji} CDB ${prorroga ? 'prorrogada' : 'abierta'} el ${parseTimestamp(creationDateAsTimestamp)}: <span style="font-weight: bold; color: ${format.color};">hace ${timeElapsed.days} días y ${timeElapsed.hours} horas</span>`;
}
if (timeElapsed.days >= 14) {
showPostponeCheckbox();
}
}
function fetchCreationOrProrrogationDate() {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
const pageContent = yield getContent(currentPageName);
if (pageContent) {
const lastPostponement = findLastPostponementDate(pageContent);
if (lastPostponement) {
showCreationDateAndTimeElapsed(lastPostponement, true);
}
else {
const creationInfo = yield getPageCreationInfo(currentPageName);
if (creationInfo) {
DROpeningDate = creationInfo.timestamp;
showCreationDateAndTimeElapsed(creationInfo.timestamp, false);
}
}
}
});
}
function manageOtherInputField(selectedOption) {
const field = document.getElementById('otherField');
const fieldParent = field === null || field === void 0 ? void 0 : field.parentElement;
if (fieldParent) {
switch (selectedOption) {
case 'Otro':
fieldParent.style.display = 'flex';
fieldParent.style.marginBlock = '5px';
field.style.display = 'block';
if (!document.getElementById('otherFieldLabel')) {
const label = document.createElement('label');
label.id = 'otherFieldLabel';
label.innerText = 'Escribe el resultado de la consulta: ';
fieldParent.prepend(label);
}
break;
default:
fieldParent.style.display = 'none';
}
}
}
function replaceDRTemplate(input, replacement) {
const templateRegex = /\{\{RETIRA ESTA PLANTILLA CUANDO CIERRES ESTA CONSULTA\|+\}\}/;
return input.replace(templateRegex, replacement);
}
function extractPageTitleFromWikicode(input) {
const match = input.match(/=+\s*\\]\s*=+/);
return match ? match : null;
}
function editRequestPage(decision, comment) {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
new Morebits.status("Paso 1", "cerrando la página de la consulta...", "info");
yield api.edit(currentPageName, (revision) => ({
text: replaceDRTemplate(revision.content, DRC.closedDR.top(decision, comment)) + '\n' + DRC.closedDR.bottom,
summary: `Cierro ] con resultado ${decision.toUpperCase()}, mediante ]`,
minor: false
}));
});
}
function editArticle(decision) {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
const content = yield getContent(currentPageName);
if (content) {
const page = extractPageTitleFromWikicode(content);
if (page) {
nominatedPage = page;
if (decision == 'Borrar') {
new Morebits.status("Paso 2", "borrando la página original...", "info");
const reason = `Según resultado de CDB: ]`;
yield deletePage(page, true, reason);
}
else {
new Morebits.status("Paso 2", "editando la página original...", "info");
yield api.edit(page, (revision) => ({
text: DRC.articlePage.removeTemplate(revision.content),
summary: `Elimino plantilla según el resultado de ]: ${decision.toUpperCase()}; mediante ]`,
minor: false
}));
}
}
}
});
}
function addPostponeTemplate() {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
new Morebits.status("Paso 1", "añadiendo plantilla para posponer la consulta...", "info");
yield api.edit(currentPageName, (revision) => ({
text: revision.content + "\n\n{{sust:prorrogar}}",
summary: "Prorrogando CDB mediante ]",
minor: false
}));
});
}
function editArticleTalkPage(decision) {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
if (decision == 'Borrar')
return;
const talkPage = getTalkPage(nominatedPage);
new Morebits.status("Paso 3", 'editando la página de discusión...', "info");
const template = yield DRC.talkPage(decision);
if (yield isPageMissing(talkPage)) {
yield api.create(talkPage, { summary: `Creando página de discusión tras cierre de ] mediante ]` }, template);
}
else {
yield api.edit(talkPage, (revision) => ({
text: template + '\n' + revision.content,
summary: `Editando página de discusión tras cierre de ] mediante ]`,
minor: false
}));
}
});
}
function confirmIfLessThan14Days() {
if (timeElapsed.days <= 14) {
return confirm(`Han pasado solo ${timeElapsed.days} días desde que se abrió la CDB. La política (]) especifica que los debates de las consultas de borrado deben durar 14 días, y su cierre solo se puede producir después de pasado este tiempo. ¿Seguro que quieres cerrarla antes del tiempo establecido?`);
}
return true;
}
function deletionrequestcloser_submitMessage(e) {
return deletionrequestcloser_awaiter(this, void 0, void 0, function* () {
if (!confirmIfLessThan14Days())
return;
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
const decision = input.result !== 'Otro' ? input.result : input.otherField;
const comment = input.reason ? input.reason : null;
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
if (input.postpone) {
try {
yield addPostponeTemplate();
finishMorebitsStatus(deletionrequestcloser_Window, statusWindow, 'finished', true);
}
catch (error) {
finishMorebitsStatus(deletionrequestcloser_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
}
}
else {
try {
yield editRequestPage(decision, comment);
yield editArticle(decision);
yield editArticleTalkPage(decision);
finishMorebitsStatus(deletionrequestcloser_Window, statusWindow, 'finished', true);
}
catch (error) {
finishMorebitsStatus(deletionrequestcloser_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
}
}
});
}
function createDRCFormWindow() {
deletionrequestcloser_Window = new Morebits.simpleWindow(620, 530);
deletionrequestcloser_Window.setScriptName('Twinkle Lite');
deletionrequestcloser_Window.setTitle('Cerrar consulta de borrado');
deletionrequestcloser_Window.addFooterLink('Política de consultas de borrado', 'Wikipedia:Consultas de borrado mediante argumentación');
const form = new Morebits.quickForm(deletionrequestcloser_submitMessage);
const timeElapsedField = form.append({
type: 'field',
label: 'Estado de la consulta:'
});
timeElapsedField.append({
type: 'div',
name: 'timeElapsedFromDRCreation',
label: '⌛️ Cargando...'
});
timeElapsedField.append({
type: 'checkbox',
id: 'DRMPostponeBox',
list: [{
name: "postpone",
value: "postpone",
label: "Prorrogar CDB",
checked: false,
tooltip: "Marca esta casilla para prorrogar la CDB durante otros 14 días",
event: (e) => {
changeSubmitButtonName(e.target.checked);
changeSelectMenuStatus(e.target.checked);
}
}],
style: 'display: none;'
});
form.append({
type: 'select',
id: 'CDBResultSelectMenu',
name: 'result',
label: 'Selecciona el resultado de la consulta:',
list: getClosureOptions(),
event: (e) => manageOtherInputField(e.target.value)
});
form.append({
type: 'input',
name: 'otherField',
id: 'otherField',
style: 'margin-left: 3px; display: none;'
});
form.append({
type: 'textarea',
name: 'reason',
label: 'Añade un comentario (opcional)',
tooltip: 'Añade un comentario aclaratorio que complemente a la decisión tomada. Este aparecerá anexo a la decisión. Puedes usar wikicódigo y no es necesario firmarlo.'
});
form.append({
type: 'submit',
label: 'Cerrar CBD',
});
const result = form.render();
deletionrequestcloser_Window.setContent(result);
deletionrequestcloser_Window.display();
fetchCreationOrProrrogationDate();
}
;// CONCATENATED MODULE: ./src/utils/DOMutils.ts
function createHideButton(callbackFn) {
var _a;
if (!document.querySelector('.TL-hide-button')) {
const parentElement = (_a = document.querySelector('.mw-diff-undo')) === null || _a === void 0 ? void 0 : _a.parentElement;
if (parentElement) {
const hideButton = document.createElement('span');
const tooltip = "Solicita que esta edición se oculte en el TAB";
hideButton.innerHTML = ` (<a class="TL-hide-button" title="${tooltip}">ocultar</a>)`;
parentElement.appendChild(hideButton);
const hideLink = document.querySelector('.TL-hide-button');
hideLink === null || hideLink === void 0 ? void 0 : hideLink.addEventListener('click', () => {
callbackFn(diffNewId);
});
}
}
}
function createButton(buttonId, buttonText, buttonColor, callbackFn) {
const usersNodeList = document.querySelectorAll('a.mw-usertoollinks-talk');
if (usersNodeList) {
usersNodeList.forEach((element) => {
if (element) {
const firstParentElement = element.parentElement;
if (firstParentElement) {
if (firstParentElement.querySelector('a.extiw')) {
return;
}
const newElement = document.createElement('span');
newElement.textContent = ' · ';
const elementChild = document.createElement('a');
elementChild.id = buttonId;
elementChild.textContent = buttonText;
elementChild.style.color = buttonColor;
elementChild.addEventListener('click', () => {
let username;
if (currentPageName === "Especial:PáginasNuevas") {
username = firstParentElement.parentElement.querySelector('bdi').innerText;
}
else {
username = firstParentElement.parentElement.parentElement.querySelector('bdi').innerText;
}
callbackFn(username);
});
newElement.append(elementChild);
const firstParentNode = element.parentNode;
if (firstParentNode) {
firstParentNode.insertBefore(newElement, element.nextSibling);
}
}
}
});
}
}
function oouiButton(label, onclickFn) {
const button = new OO.ui.ButtonWidget({
label: label,
flags: [
'primary',
'progressive'
]
});
button.on('click', onclickFn);
return button;
}
function createBlockAppealsButton(appealBox) {
const container = document.createElement('div');
container.style.textAlign = 'center';
mw.loader.using().done(() => {
const button = oouiButton('Resolver apelación de bloqueo', createBlockAppealsWindow);
container.append(button.$element);
appealBox.prepend(container);
});
}
function createDRCButton(textBox) {
const container = document.createElement('div');
container.style.textAlign = 'center';
container.style.marginBlock = '0.5em';
mw.loader.using().done(() => {
const button = oouiButton('Cerrar consulta de borrado', createDRCFormWindow);
container.append(button.$element);
textBox.prepend(container);
});
}
;// CONCATENATED MODULE: ./src/modules/speedydeletion.ts
var speedydeletion_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let speedydeletion_Window;
let deletionTemplateExists;
let criteriaLists = {
general: [
{ code: "g1", name: "G1. Vandalismo" },
{ code: "g2", name: "G2. Faltas de etiqueta" },
{ code: "g3", name: "G3. Páginas promocionales" },
{ code: "g4", name: "G4. Páginas de pruebas de edición" },
{ code: "g5", name: "G5. Bulos, fraudes" },
{ code: "g6", name: "G6. Violaciones de derechos de autor" },
{ code: "g7", name: "G7. Páginas de discusión huérfanas" },
{ code: "g8", name: "G8. Borrado de una página para dejar sitio" },
{ code: "g9", name: "G9. Recreación de material borrado" },
{ code: "g10", name: "G10. Para mantenimiento elemental" },
{ code: "g11", name: "G11. A petición del único autor" }
], articles: [
{
code: "a1", name: "A1. Viola «lo que Wikipedia no es»", subgroup: {
type: 'checkbox',
name: 'subA',
list: [
{ value: "a1.1", label: "A1.1 Artículos que solo incluyen enlaces" },
{ value: "a1.2", label: "A1.2 Definiciones de diccionario o recetas" },
{ value: "a1.3", label: "A1.3 Fuente primaria" },
{ value: "a1.4", label: "A1.4 Ensayos de opinión" }
]
},
},
{ code: "a2", name: "A2. Infraesbozo" },
{ code: "a3", name: "A3. Páginas sin traducir o traducciones automáticas" },
{ code: "a4", name: "A4. Contenido no enciclopédico o sin relevancia" },
{
code: "a5", name: "A5. Artículo duplicado", subgroup: {
type: "input",
name: "originalArticleName",
label: "Nombre del artículo original: ",
tooltip: "Escribe el nombre del artículo sin utilizar wikicódigo. Ej.: «Granada (fruta)», «Ensalada» o «Plantilla:Atajos»",
required: true
}
}
], redirects: [
{ code: "r1", name: "R1. Redirecciones a páginas inexistentes" },
{ code: "r2", name: "R2. Redirecciones de un espacio de nombres a otro" },
{ code: "r3", name: "R3. Redirecciones automáticas innecesarias" },
{ code: "r4", name: "R4. Redirecciones incorrectas o innecesarias" },
], categories: [
{ code: "c1", name: "C1. Categorías vacías" },
{ code: "c2", name: "C2. Categorías trasladadas o renombradas" },
{ code: "c3", name: "C3. Categorías que violan la política de categorías" }
], userpages: [
{ code: "u1", name: "U1. A petición del propio usuario" },
{ code: "u2", name: "U2. Usuario inexistente" },
{ code: "u3", name: "U3. Violación de la política de páginas de usuario" }
], templates: [
{ code: "p1", name: "P1. Violación de la política de plantillas de navegación" },
{ code: "p2", name: "P2. Subpágina de documentación huérfana" },
{ code: "p3", name: "P3. Plantillas de un solo uso" }
], other: [
{
code: "other", name: "Otra razón", subgroup: {
type: "input",
name: "otherreason",
label: "Establece la razón: ",
tooltip: "Puedes utilizar wikicódigo en tu respuesta",
required: true
}
}
]
};
function getOptions(criteriaType) {
let options = ;
for (let chosenType of criteriaLists) {
let option = { value: chosenType.code, label: chosenType.name, checked: chosenType.default, subgroup: chosenType.subgroup };
options.push(option);
}
return options;
}
function createSpeedyDeletionFormWindow() {
return speedydeletion_awaiter(this, void 0, void 0, function* () {
speedydeletion_Window = new Morebits.simpleWindow(620, 530);
speedydeletion_Window.setScriptName('Twinkle Lite');
speedydeletion_Window.setTitle('Solicitar borrado rápido');
speedydeletion_Window.addFooterLink('Criterios para el borrado rápido', 'Wikipedia:Criterios para el borrado rápido');
const form = new Morebits.quickForm(speedydeletion_submitMessage);
form.append({
type: 'checkbox',
list: [{
name: "notify",
value: "notify",
label: "Notificar al creador de la página",
checked: true,
tooltip: "Marca esta casilla para que Twinkle Lite deje un mensaje automático en la página de discusión del creador advirtiéndole del posible borrado de su artículo"
}],
style: "padding-left: 1em; padding-top:0.5em;"
});
let gField = form.append({
type: 'field',
label: 'Criterios generales:',
});
gField.append({
type: 'checkbox',
name: 'general',
list: getOptions("general")
});
if (currentNamespace == 0 || currentNamespace == 104 && !mw.config.get('wgIsRedirect')) {
const aField = form.append({
type: 'field',
label: 'Criterios para artículos y anexos:',
});
aField.append({
type: 'checkbox',
name: 'article',
list: getOptions("articles")
});
}
if (mw.config.get('wgIsRedirect')) {
const rField = form.append({
type: 'field',
label: 'Criterios para páginas de redirección:',
});
rField.append({
type: 'checkbox',
name: 'redirect',
list: getOptions("redirects")
});
}
if (currentNamespace == 14) {
const cField = form.append({
type: 'field',
label: 'Criterios para categorías:',
});
cField.append({
type: 'checkbox',
name: 'categories',
list: getOptions("categories")
});
}
if (currentNamespace == 2) {
const uField = form.append({
type: 'field',
label: 'Criterios para páginas de usuario:',
});
uField.append({
type: 'checkbox',
name: 'userpages',
list: getOptions("userpages")
});
}
if (currentNamespace == 10) {
const tField = form.append({
type: 'field',
label: 'Criterios para plantillas:',
});
tField.append({
type: 'checkbox',
name: 'templates',
list: getOptions("templates")
});
}
form.append({
type: 'checkbox',
name: 'other',
list: getOptions("other"),
style: "padding-left: 1em; padding-bottom: 0.5em"
});
form.append({
type: 'submit',
label: 'Aceptar'
});
let result = form.render();
speedydeletion_Window.setContent(result);
speedydeletion_Window.display();
deletionTemplateExists = yield checkExistingDeletionTemplate();
});
}
function speedydeletion_submitMessage(e) {
let form = e.target;
let input = Morebits.quickForm.getInputData(form);
if (input === null || input === void 0 ? void 0 : input.subA) {
if (Array.isArray(input.subA) && input.subA.length > 0) {
if (Array.isArray(input.article)) {
input.article.shift();
}
}
}
if (deletionTemplateExists) {
if (!confirm('Parece que ya existe una plantilla de borrado en el artículo, ¿deseas colocar la plantilla igualmente?')) {
return;
}
}
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", `generando plantilla de borrado...`, "info");
new mw.Api().edit(currentPageName, editBuilder(input))
.then(function () {
return getCreator().then(speedydeletion_postsMessage(input));
})
.then(function () {
finishMorebitsStatus(speedydeletion_Window, statusWindow, 'finished', true);
})
.catch(function (error) {
finishMorebitsStatus(speedydeletion_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
});
}
function checkExistingDeletionTemplate() {
return speedydeletion_awaiter(this, void 0, void 0, function* () {
const regex = /{{(?:sust:)?(?:destruir|d|db-ul|db-user|speedy|borrar|db|delete|eliminar|aviso\sborrar)\|.+?}}/i;
const content = yield getContent(currentPageName);
if (content && content.match(regex)) {
return true;
}
return false;
});
}
function editBuilder(data) {
let template;
if (currentNamespace == 10) {
template = `<noinclude>{{destruir|${allCriteria(data)}}} \n</noinclude>`;
}
else {
template = `{{destruir|${allCriteria(data)}}} \n`;
}
return (revision) => {
return {
text: template + revision.content,
summary: `Añadiendo plantilla de borrado mediante ]${(data === null || data === void 0 ? void 0 : data.originalArticleName) ? `. Artículo existente de mayor calidad: ]` : ''}`,
minor: false
};
};
}
function allCriteria(data) {
var _a;
let fields = ;
for (let criteriaType in data) {
if (criteriaType !== "other" && Array.isArray(data)) {
fields.push(...data);
}
}
const reasonString = (_a = data === null || data === void 0 ? void 0 : data.otherreason) !== null && _a !== void 0 ? _a : '';
if (reasonString != '') {
fields.push(reasonString);
}
return fields.join('|');
}
function speedydeletion_postsMessage(input) {
if (!input.notify)
return;
return (creator) => {
if (creator == currentUser) {
return;
}
else {
new Morebits.status("Paso 2", "publicando un mensaje en la página de discusión del creador...", "info");
return isPageMissing(`Usuario_discusión:${creator}`)
.then(function (mustCreateNewTalkPage) {
if (mustCreateNewTalkPage) {
return new mw.Api().create(`Usuario_discusión:${creator}`, { summary: `Aviso al usuario del posible borrado de ] mediante ]` }, `{{subst:Aviso destruir|${currentPageNameNoUnderscores}|${allCriteria(input)}}} ~~~~`);
}
else {
return new mw.Api().edit(`Usuario_discusión:${creator}`, function (revision) {
return {
text: revision.content + `\n{{subst:Aviso destruir|${currentPageNameNoUnderscores}|${allCriteria(input)}}} ~~~~`,
summary: `Aviso al usuario del posible borrado de ] mediante ]`,
minor: false
};
});
}
});
}
};
}
;// CONCATENATED MODULE: ./src/modules/pageprotection.ts
var pageprotection_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let pageprotection_Window;
const radioProtectionOptions = [
{
type: 'option',
value: "protección",
label: "Solicitar protección",
checked: true
},
{
type: 'option',
value: "desprotección",
label: "Solicitar desprotección"
}
];
const listMotiveOptions = [
{ name: "Vandalismo" },
{ name: "SPAM" },
{ name: "Información falsa o especulativa" },
{ name: "Guerra de ediciones" },
{ name: "Otro" }
];
function adaptMotiveOptions() {
let dropDownOptions = ;
for (let motive of listMotiveOptions) {
let option = { type: 'option', value: motive.name, label: motive.name };
dropDownOptions.push(option);
}
return dropDownOptions;
}
function protectionStatusTextBuilder(protectionExpiry) {
switch (protectionExpiry) {
case '':
return '';
case 'infinity':
return '(protegido para siempre)';
default:
return `(hasta el ${parseTimestamp(protectionExpiry)})`;
}
}
function buildEditOnNoticeboard(input) {
let title = `== ${input.protection == "desprotección" ? 'Solicitud de desprotección de ' : ''}] ==`;
return (revision) => {
const editParams = {
text: revision.content + `\n
${title}
;Artículo(s)
* {{a|${currentPageNameNoUnderscores}}}
;Causa
${input.reason ? input.reason : input.motive}
; Usuario que lo solicita
* ~~~~
;Respuesta
(a rellenar por un bibliotecario)`,
summary: `Solicitando ${input.protection} de ] mediante ]`,
minor: false
};
return editParams;
};
}
function fetchAndShowProtectionStatus() {
return pageprotection_awaiter(this, void 0, void 0, function* () {
var _a;
const protection = yield getProtectionStatus(currentPageName);
const showProtection = document.querySelector("div > span.quickformDescription");
if (showProtection) {
showProtection.innerHTML = `Nivel actual de protección:<span style="color:royalblue; font-weight: bold;"> ${protection.level} <span style="font-weight: normal;">${protectionStatusTextBuilder(protection.expiry)}</span>`;
if (protection.level == 'sin protección') {
let unprotectDiv = (_a = document.getElementById('protect')) === null || _a === void 0 ? void 0 : _a.children;
if (unprotectDiv && unprotectDiv.firstChild instanceof HTMLElement) {
unprotectDiv.firstChild.setAttribute('disabled', '');
}
}
}
});
}
function createPageProtectionFormWindow() {
pageprotection_Window = new Morebits.simpleWindow(620, 530);
pageprotection_Window.setScriptName('Twinkle Lite');
pageprotection_Window.setTitle('Solicitar protección de la página');
pageprotection_Window.addFooterLink('Política de protección', 'Wikipedia:Política de protección');
const form = new Morebits.quickForm(pageprotection_submitMessage);
const radioField = form.append({
type: 'field',
label: 'Tipo:',
});
radioField.append({
type: 'radio',
name: 'protection',
id: 'protect',
event: function (e) {
let nameToModify = document.querySelector("select");
if (nameToModify) {
if (e.target.value !== "protección") {
nameToModify.setAttribute('disabled', "");
}
else {
nameToModify.removeAttribute('disabled');
}
}
},
list: radioProtectionOptions
});
form.append({
type: 'div',
name: 'currentProtection',
label: `Nivel actual de protección: `,
});
const textAreaAndReasonField = form.append({
type: 'field',
label: 'Opciones:',
});
textAreaAndReasonField.append({
type: 'select',
name: 'motive',
label: 'Selecciona el motivo:',
list: adaptMotiveOptions(),
disabled: false
});
textAreaAndReasonField.append({
type: 'textarea',
name: 'reason',
label: 'Desarrolla la razón:',
tooltip: 'Si no se rellena este campo, se utilizará como razón la seleccionada en la lista de motivos (si no se ha seleccionado «otro»). Puedes usar wikicódigo en tu descripción, tu firma se añadirá automáticamente.'
});
form.append({
type: 'submit',
label: 'Aceptar'
});
let result = form.render();
pageprotection_Window.setContent(result);
pageprotection_Window.display();
fetchAndShowProtectionStatus();
}
function pageprotection_submitMessage(e) {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
if (input.motive == 'Otro' && !input.reason) {
alert("Se ha seleccionado «Otro» como motivo pero no se ha establecido un motivo.");
}
else {
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", `solicitando la ${input.protection} de la página...`, "info");
new mw.Api().edit("Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Protección_de_artículos/Actual", buildEditOnNoticeboard(input))
.then(function () {
finishMorebitsStatus(pageprotection_Window, statusWindow, 'finished', false);
})
.catch(function (error) {
finishMorebitsStatus(pageprotection_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
});
}
}
;// CONCATENATED MODULE: ./src/modules/tags.ts
var tags_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let tags_Window;
const relevantPageName = stripTalkPagePrefix(currentPageName);
const relevantPageNameNoUnderscores = relevantPageName.replace(/_/g, ' ');
const tagTemplateDict = {
"artículo bueno": {
description: "para etiquetar artículos que han obtenido la calificación de AB",
},
"autotrad": {
warning: "aviso autotrad",
description: "uso de automatismo en traducciones de nula calidad",
sust: true
},
"bulo": {
warning: "aviso destruir|2=bulo",
description: "páginas falsas que constituyen bulos o hoax"
},
"categorizar": {
warning: "aviso categorizar",
description: "artículos sin categorías"
},
"CDI": {
warning: "aviso conflicto de interés",
description: "escrita bajo conflicto de interés"
},
"contextualizar": {
warning: "aviso contextualizar",
description: "el tema o ámbito no está claramente redactado. Plantilla de 30 días.",
sust: true
},
"complejo": {
description: "textos difíciles de entender",
subgroup: [
{
type: 'input',
name: '_param-complejo-1',
label: 'Explica por qué es complejo',
tooltip: 'Desarrolla brevemente por qué consideras que el artículo posee una elevada complejidad'
}
],
groupable: true,
sust: true
},
"copyedit": {
warning: "aviso copyedit",
description: "necesita una revisión de ortografía y gramática",
groupable: true
},
"curiosidades": {
description: "textos con sección de curiosidades"
},
"desactualizado": {
description: "página con información obsoleta",
groupable: true,
sust: true
},
"en desarrollo": {
description: "páginas en construcción o siendo editadas activamente",
subgroup: [
{
type: 'input',
name: '_param-en desarrollo-1',
label: 'Nombre del editor',
tooltip: 'Escribe el nombre del usuario que está desarrollando el artículo, no utilices ningún tipo de Wikicódigo'
}
],
sust: true
},
"evento actual": {
description: "artículos de actualidad cuya información es susceptible a cambiar"
},
"excesivamente detallado": {
description: "demasiada información sobre temas triviales",
sust: true
},
"experto": {
description: "artículos muy técnicos con deficiencias de contenido solo corregibles por un experto",
groupable: true,
},
"ficticio": {
description: "sin enfoque desde un punto de vista real",
groupable: true,
sust: true
},
"formato de referencias": {
warning: "aviso formato de referencias",
description: "referencias incorrectas o mal construidas",
groupable: true,
sust: true
},
"fuente primaria": {
warning: "aviso fuente primaria",
description: "información no verificable. Plantilla de 30 días.",
sust: true
},
"fuentes no fiables": {
description: "referencias que no siguen la política de fuentes fiables",
warning: "aviso fuentes no fiables",
sust: true
},
"fusionar": {
description: "sugerir una fusión",
subgroup: [
{
type: 'input',
name: '_param-fusionar-1',
label: 'Artículo objetivo',
tooltip: 'Escribe el nombre del artículo con el que quieres fusionar esta página. No uses Wikicódigo.'
}
],
sust: true
},
"globalizar": {
warning: "aviso globalizar",
description: "existe sesgo territorial",
subgroup: [
{
type: 'input',
name: '_param-globalizar-1',
label: 'Cultura o territorio del sesgo'
}
],
groupable: true,
sust: true
},
"infraesbozo": {
warning: "aviso infraesbozo",
description: "contenido insuficiente como para constituir un esbozo de artículo o anexo válido. Plantilla de 30 días",
sust: true
},
"largo": {
description: "artículos excesivamente largos que deberían subdividirse en varios",
groupable: true
},
"mal traducido": {
warning: "aviso mal traducido",
description: "escasa calidad de una traducción de otro idioma",
groupable: true
},
"mejorar redacción": {
description: "redacciones que no siguen el manual de estilo",
groupable: true,
sust: true
},
"no es un foro": {
description: "páginas de discusión que han recibido grandes cantidades de conversación irrelevante",
talkPage: true
},
"no neutralidad": {
warning: "aviso no neutralidad",
description: "artículos sesgados o claramente decantados en una dirección",
subgroup: [
{
type: 'input',
name: `_param-no neutralidad-motivo`,
label: 'Razón del sesgo',
tooltip: 'Describe brevemente la razón del sesgo. Es importante, también, desarrollarla más exhaustivamente en la PD',
required: true
}
],
groupable: true
},
"plagio": {
warning: "aviso destruir|2=plagio",
description: "artículos copiados, que violan derechos de autor",
subgroup: [
{
type: 'input',
name: '_param-plagio-1',
label: 'URL origen del plagio',
tooltip: 'Copia y pega aquí la URL de la página externa en la que se halla el texto original',
required: true
}
],
sust: true
},
"polémico": {
description: "temas susceptibles a guerras de edición o vandalismo",
talkPage: true
},
"pr": {
description: "para atribuir el artículo a un wikiproyecto",
subgroup: [
{
type: 'input',
name: '_param-pr-1',
label: 'Nombre del wikiproyecto',
tooltip: 'Escribe aquí el nombre del Wikiproyecto (esta plantilla se coloca en la PD automáticamente)',
required: true
}
],
talkPage: true
},
"promocional": {
warning: "aviso promocional",
description: "texto con marcado carácter publicitario, no neutral. Plantilla de 30 días",
subgroup: [
{
type: 'input',
name: '_param-promocional-motivo',
label: 'Motivo (opcional)',
tooltip: 'Rellena este campo para especificar el motivo por el que se ha colocado la plantilla',
required: false
}
],
sust: true
},
"publicidad": {
description: "contenido comercial que defiende proselitismos o propaganda",
groupable: true,
sust: true
},
"pvfan": {
warning: "aviso no neutralidad|2=PVfan",
description: "escritos poco neutrales, con punto de vista fanático",
groupable: true,
sust: true
},
"referencias": {
warning: "aviso referencias",
description: "artículos sin una sola referencia",
groupable: true,
sust: true
},
"referencias adicionales": {
warning: "aviso referencias",
description: "artículos con falta de referencias",
groupable: true,
sust: true
},
"renombrar": {
description: "para proponer un renombrado de una página",
subgroup: [
{
type: 'input',
name: '_param-renombrar-1',
label: 'Nuevo nombre sugerido',
required: true
}
],
sust: true
},
"revisar traducción": {
description: "texto traducido legible pero necesita un repaso lingüístico"
},
"sin relevancia": {
warning: "aviso sin relevancia",
description: "artículos que no superan umbral de relevancia. Plantilla de 30 días",
sust: true
},
"traducción": {
description: "artículos que se están traduciendo desde otro idioma",
subgroup: [
{
type: 'input',
name: '_param-traducción-ci',
label: 'Código ISO del idioma (opcional)',
tooltip: 'Añade el código ISO del idioma del que procede la traducción. Ejemplo: «en» para artículos que proceden de la Wikipedia en inglés o «fr» si vienen de frwiki',
required: false
}
]
},
"traducción incompleta": {
warning: "aviso traducción incompleta",
description: "artículos que han sido traducidos solo parcialmente",
groupable: true,
sust: true
},
"wikificar": {
warning: "aviso wikificar",
description: "textos con mal formato o que no cumplen el manual de estilo",
groupable: true,
sust: true
}
};
function linkBuilder(link) {
let fullLink = `https://es.wikipedia.orghttps://wikifreehand.com/es/Plantilla:${link}`;
return `<a href="${fullLink}" target="_blank">(+)</a>`;
}
function listBuilder() {
var _a, _b;
let finalList = ;
for (let item in tagTemplateDict) {
let template = {
name: item,
value: item,
label: `{{${item}}} · ${tagTemplateDict.description} ${linkBuilder(item)}`,
subgroup: (_b = (_a = tagTemplateDict) === null || _a === void 0 ? void 0 : _a.subgroup) !== null && _b !== void 0 ? _b : ''
};
finalList.push(template);
}
return finalList;
}
function groupTemplates(templateList) {
var _a;
if (templateList.length > 1) {
let newList = ;
let groupedTemplates = 'problemas artículo';
let groupedTemplatesNumber = 0;
for (let template of templateList) {
if ((_a = tagTemplateDict) === null || _a === void 0 ? void 0 : _a.groupable) {
groupedTemplatesNumber++;
groupedTemplates += `|${template}`;
}
else {
newList.push(template);
}
}
if (groupedTemplatesNumber > 1) {
newList.push(groupedTemplates);
return newList;
}
else {
return templateList;
}
}
return templateList;
}
function createGroupedWarning(templateList) {
const groupedTemplate = templateList.find(element => element.includes("problemas artículo|"));
if (groupedTemplate) {
const groupedWwarning = groupedTemplate.replace("problemas artículo", `aviso PA|${relevantPageNameNoUnderscores}`);
return groupedWwarning;
}
return false;
}
function templateBuilder(templateObj) {
var _a, _b, _c;
let finalString = '';
for (const element in templateObj) {
let needsSust = ((_a = tagTemplateDict) === null || _a === void 0 ? void 0 : _a.sust) ? true : false;
if (element.includes('problemas artículo|')) {
needsSust = true;
}
const parameter = ((_b = templateObj) === null || _b === void 0 ? void 0 : _b.param) ? `|${templateObj.param}=` : '';
const parameterValue = ((_c = templateObj) === null || _c === void 0 ? void 0 : _c.paramValue) || '';
finalString += `{{${needsSust ? 'sust:' : ''}${element}${parameter}${parameterValue}}}\n`;
}
return finalString;
}
function tags_makeEdit(templates, input, pagename) {
return tags_awaiter(this, void 0, void 0, function* () {
return yield new mw.Api().edit(pagename, (revision) => {
return {
text: templateBuilder(templates) + revision.content,
summary: `Añadiendo plantilla mediante ]` + `${input.reason ? `. ${input.reason}` : ''}`,
minor: false
};
});
});
}
function paramAssigner(paramList, input) {
const templatesWithParams = {};
for (const element of paramList) {
templatesWithParams = {};
for (const of Object.entries(input)) {
if (key.includes('_param') && key.includes(element)) {
templatesWithParams = {
"param": key.split('-').pop(),
"paramValue": value
};
}
}
}
return templatesWithParams;
}
function makeAllEdits(templateList, templateTalkPageList, input) {
return tags_awaiter(this, void 0, void 0, function* () {
if (templateList.length > 0) {
const templateObj = paramAssigner(templateList, input);
yield tags_makeEdit(templateObj, input, relevantPageName);
}
if (templateTalkPageList.length > 0) {
const talkPage = currentNamespace == 104 || currentNamespace == 105 ? `Anexo_discusión:${relevantPageName.substring(6)}` : `Discusión:${relevantPageName}`;
const templateTalkPageObj = paramAssigner(templateTalkPageList, input);
return isPageMissing(talkPage)
.then(function (mustCreateNewTalkPage) {
if (mustCreateNewTalkPage) {
return new mw.Api().create(talkPage, { summary: `Añadiendo plantilla mediante ]` + `${input.reason ? `. ${input.reason}` : ''}` }, templateBuilder(templateTalkPageObj));
}
else {
return tags_makeEdit(templateTalkPageObj, input, talkPage);
}
});
}
});
}
function createTagsFormWindow() {
tags_Window = new Morebits.simpleWindow(620, 530);
tags_Window.setScriptName('Twinkle Lite');
tags_Window.setTitle('Añadir plantilla');
tags_Window.addFooterLink('Portal de mantenimiento', 'Portal:Mantenimiento');
const form = new Morebits.quickForm(tags_submitMessage);
form.append({
type: 'input',
value: '',
name: 'search',
label: 'Búsqueda:',
id: 'search',
size: '30',
event: function quickFilter() {
const searchInput = document.getElementById("search");
const allCheckboxDivs = document.querySelectorAll("#checkboxContainer > div");
if (this.value) {
function flushList(callback) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
const div = allCheckboxDivs;
div.style.display = 'none';
}
callback();
}
function updateList(searchString) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
let checkboxText = allCheckboxDivs.childNodes.textContent;
if (checkboxText.includes(searchString.toLowerCase()) || checkboxText.includes(searchString.toUpperCase())) {
const div = allCheckboxDivs;
div.style.display = '';
}
}
}
flushList(() => updateList(searchInput.value));
}
if (!this.value) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
const div = allCheckboxDivs;
div.style.display = '';
}
}
}
});
const optionBox = form.append({
type: 'div',
id: 'tagWorkArea',
className: 'morebits-scrollbox',
style: 'max-height: 28em; min-height: 0.5em'
});
optionBox.append({
type: 'checkbox',
id: 'checkboxContainer',
list: listBuilder(),
label: 'checkOption'
});
const optionsField = form.append({
type: 'field',
label: 'Opciones:'
});
optionsField.append({
type: 'checkbox',
list: [{
name: "notify",
value: "notify",
label: "Notificar al creador de la página si es posible",
checked: false,
tooltip: "Marca esta casilla para que Twinkle Lite deje un mensaje automático en la página de discusión del creador del artículo advertiéndole de la colocación de la plantilla"
}],
});
optionsField.append({
type: 'input',
name: 'reason',
label: 'Razón:',
tooltip: '(Opcional) Escribe aquí el resumen de edición explicando la razón por la que se ha añadido la plantilla',
style: 'width: 80%; margin-top: 0.5em;'
});
form.append({
type: 'submit',
label: 'Aceptar'
});
const result = form.render();
tags_Window.setContent(result);
tags_Window.display();
}
function extractParamsFromInput(input) {
var _a;
let temporaryTemplateList = ;
let temporaryTemplateTalkPageList = ;
for (const of Object.entries(input)) {
if (value && !key.includes('_param') && key != 'notify' && key != 'reason' && key != 'search') {
if ((_a = tagTemplateDict) === null || _a === void 0 ? void 0 : _a.talkPage) {
temporaryTemplateTalkPageList.push(key);
}
else {
temporaryTemplateList.push(key);
}
}
}
return {
templatelist: temporaryTemplateList,
templateTalkPageList: temporaryTemplateTalkPageList
};
}
function joinAllWarnings(list, groupedWarning) {
var _a;
let finalString = groupedWarning ? `{{sust:${groupedWarning}}} ~~~~\n` : '';
for (let template of list) {
if ((_a = tagTemplateDict) === null || _a === void 0 ? void 0 : _a.warning) {
finalString += `{{sust:${tagTemplateDict.warning}|${relevantPageNameNoUnderscores}}} ~~~~\n`;
}
}
return finalString;
}
function tags_postsMessage(templateList, groupedWarning, creator) {
return tags_awaiter(this, void 0, void 0, function* () {
if (creator && creator == currentUser) {
return;
}
else {
new Morebits.status("Paso 2", "publicando un mensaje de aviso en la página de discusión del creador (si es posible)...", "info");
const mustCreateNewTalkPage = yield isPageMissing(`Usuario_discusión:${creator}`);
const warningTemplates = joinAllWarnings(templateList, groupedWarning);
if (!warningTemplates) {
return;
}
if (mustCreateNewTalkPage) {
return new mw.Api().create(`Usuario_discusión:${creator}`, { summary: `Aviso al usuario de la colocación de una plantilla en ] mediante ]` }, `${warningTemplates}`);
}
else {
return new mw.Api().edit(`Usuario_discusión:${creator}`, function (revision) {
return {
text: revision.content + `\n${warningTemplates}`,
summary: `Aviso al usuario de la colocación de una plantilla en ] mediante ]`,
minor: false
};
});
}
}
});
}
function tags_submitMessage(e) {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
let templates = extractParamsFromInput(input);
if (templates.templatelist.length < 1 && templates.templateTalkPageList.length < 1) {
return alert('No se ha seleccionado ninguna plantilla');
}
templates.templatelist = groupTemplates(templates.templatelist);
const groupedTemplateWarning = createGroupedWarning(templates.templatelist);
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", `generando plantilla(s)...`, "info");
makeAllEdits(templates.templatelist, templates.templateTalkPageList, input)
.then(() => tags_awaiter(this, void 0, void 0, function* () {
if (!input.notify)
return;
const pageCreator = yield getCreator();
tags_postsMessage(templates.templatelist, groupedTemplateWarning, pageCreator);
}))
.then(() => {
finishMorebitsStatus(tags_Window, statusWindow, "finished", true);
})
.catch((error) => {
finishMorebitsStatus(tags_Window, statusWindow, "error");
console.error(`Error: ${error}`);
});
}
;// CONCATENATED MODULE: ./src/modules/reports.ts
var reports_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let reportedUser;
let reports_Window;
let reportMotiveDict = {
"CPP": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Nombres_inapropiados_y_vandalismo_persistente/Actual",
"usersSubtitle": 'Lista de usuarios',
"optionalReason": false
},
"Cuenta creada para vandalizar": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Nombres_inapropiados_y_vandalismo_persistente/Actual",
"usersSubtitle": 'Lista de usuarios',
"optionalReason": true
},
"Evasión de bloqueo": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Nombres_inapropiados_y_vandalismo_persistente/Actual",
"usersSubtitle": 'Lista de usuarios',
"optionalReason": false
},
"Guerra de ediciones": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/3RR/Actual",
"usersSubtitle": 'Usuarios implicados',
"optionalReason": false
},
"Nombre inapropiado": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Nombres_inapropiados_y_vandalismo_persistente/Actual",
"usersSubtitle": 'Lista de usuarios',
"optionalReason": true
},
"Violación de etiqueta": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Violaciones_de_etiqueta/Actual",
"usersSubtitle": 'Usuarios implicados',
"optionalReason": false
},
"Vandalismo en curso": {
"link": "Wikipedia:Vandalismo_en_curso",
"optionalReason": false
},
"Vandalismo persistente": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Nombres_inapropiados_y_vandalismo_persistente/Actual",
"usersSubtitle": 'Lista de usuarios',
"optionalReason": true
},
"Otro": {
"link": "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Miscelánea/Actual",
"usersSubtitle": 'Usuarios implicados',
"optionalReason": false
}
};
function getMotiveOptions() {
let dropdownOptions = ;
for (let motive in reportMotiveDict) {
let option = {
value: motive,
label: motive,
};
dropdownOptions.push(option);
}
return dropdownOptions;
}
function changeButtonNames() {
const moreBox = document.querySelector('input');
if (moreBox) {
moreBox.value = "añadir";
moreBox.style.marginTop = '0.3em';
moreBox.addEventListener("click", () => {
const removeBox = document.querySelector('input');
removeBox.value = "eliminar";
removeBox.style.marginLeft = '0.3em';
});
}
}
function adjustMotiveOptions(selectedOption) {
const reasonTextAreaNode = document.querySelector("label");
const articleFieldNode = document.getElementById('articlefieldnode');
const otherReasonNode = document.getElementById('otherreasonnode');
if (reasonTextAreaNode && articleFieldNode && otherReasonNode) {
reasonTextAreaNode.textContent = `Desarrolla la razón${reportMotiveDict.optionalReason ? ' (opcional)' : ''}:`;
articleFieldNode.setAttribute('style', 'display:none');
otherReasonNode.setAttribute('style', 'display:none');
switch (selectedOption) {
case 'Guerra de ediciones':
articleFieldNode.removeAttribute('style');
changeButtonNames();
break;
case 'Violación de etiqueta':
reasonTextAreaNode.textContent = 'Ediciones que constituyen una violación de etiqueta:';
break;
case 'Otro':
otherReasonNode.removeAttribute('style');
break;
}
}
}
function setReportedUserName() {
const usernameField = document.querySelector('input');
usernameField.value = reportedUser;
}
function listWords(wordArray, templateLetter) {
let bulletedWords = '';
for (let word of wordArray) {
bulletedWords += `* {{${templateLetter}|${word}}} \n`;
}
return bulletedWords;
}
function VECReportBuilder(usernames, input) {
let finalText = '';
for (let user of usernames) {
const templateWord = mw.util.isIPAddress(user, true) ? 'VándaloIP' : 'Vándalo';
finalText += `=== ${user} ===` + '\n' + '\n' +
`* Posible vándalo: {{${templateWord}|${user}}}` + '\n' +
`* Motivo del reporte: ${input.reason}` + '\n' +
'* Usuario que reporta: ~~~~' + '\n' +
'* Acción administrativa: (a rellenar por un bibliotecario)' + '\n';
}
return finalText;
}
function buildRegex(reportTitle) {
const regExpString = String.raw `==\s*${reportTitle}\s*==`;
return new RegExp(regExpString, 'g');
}
function createHash(board, reportTitle) {
return reports_awaiter(this, void 0, void 0, function* () {
const boardContent = yield getContent(board);
if (boardContent) {
const regex = buildRegex(reportTitle);
const otherOccurrences = boardContent.match(regex);
if (otherOccurrences && otherOccurrences.length > 1) {
return `${reportTitle}_${otherOccurrences.length}`;
}
return reportTitle;
}
return alert("Ha habido un error, inténtalo de nuevo maś tarde");
});
}
function reports_buildEditOnNoticeboard(input, usernames, articles) {
const motive = input.motive;
if (motive == "Vandalismo en curso") {
return (revision) => {
const summaryUser = usernames.length > 1 ? 'usuarios' : `}|usuario]]`;
return {
text: revision.content + '\n' + '\n' + VECReportBuilder(usernames, input),
summary: `Creando denuncia de ${summaryUser} mediante ]`,
minor: false
};
};
}
else {
let title = motive == "Otro" ? input.otherreason : motive;
let bulletedUserList = listWords(usernames, 'u');
let bulletedArticleList = listWords(articles, 'a');
let reasonTitle = motive == "Guerra de ediciones" ? `; Comentario` : `; Motivo`;
let articleListIfEditWar = motive == "Guerra de ediciones" ? `\n; Artículos en los que se lleva a cabo \n${bulletedArticleList} \n` : '\n';
return (revision) => {
return {
text: revision.content + '\n' + '\n' +
`== ${title} ==` + '\n' +
`; ${reportMotiveDict.usersSubtitle}` + '\n' +
`${bulletedUserList}` +
articleListIfEditWar +
(reportMotiveDict.optionalReason && !input.reason ? '' : `${reasonTitle}\n${input.reason}\n`) +
'; Usuario que lo solicita' + '\n' +
'* ~~~~' + '\n' +
'; Respuesta' + '\n' +
'(a rellenar por un bibliotecario)',
summary: `Creando denuncia de usuario mediante ]`,
minor: false
};
};
}
}
function reports_postsMessage(input) {
if (!input.notify)
return;
new Morebits.status("Paso 3", `avisando al usuario reportado...`, "info");
return isPageMissing(`Usuario_discusión:${input.usernamefield}`)
.then(function (mustCreateNewTalkPage) {
return reports_awaiter(this, void 0, void 0, function* () {
const title = (input.motive == "Otro" ? input.otherreason : input.motive);
const motive = input.motive;
const hash = yield createHash(reportMotiveDict.link, title);
const notificationString = `Hola. Te informo de que he creado una denuncia —por la razón mencionada en el título— que te concierne. Puedes consultarla en el tablón correspondiente a través de '''.link}#${motive == "Vandalismo en curso" ? reportedUser : hash}|este enlace]]'''. Un ] se encargará de analizar el caso y emitirá una resolución al respecto próximamente. Un saludo. ~~~~`;
if (mustCreateNewTalkPage) {
return new mw.Api().create(`Usuario_discusión:${input.usernamefield}`, { summary: `Aviso al usuario de su denuncia por .link}|${title.toLowerCase()}]] mediante ]` }, `\n== ${title} ==\n` +
notificationString);
}
else {
return new mw.Api().edit(`Usuario_discusión:${input.usernamefield}`, function (revision) {
return {
text: revision.content + `\n== ${title} ==\n` + notificationString,
summary: `Aviso al usuario de su denuncia por .link}|${title.toLowerCase()}]] mediante ]`,
minor: false
};
});
}
});
});
}
function reports_submitMessage(e) {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
const chosenMotive = input.motive;
if (!input.reason && !reportMotiveDict.optionalReason) {
alert("No se ha establecido un motivo.");
}
else if (input.motive == 'Otro' && input.otherreason == '') {
alert("No se ha establecido un título para la denuncia");
}
else if (input.usernamefield == '') {
alert("No se ha establecido un usuario");
}
else {
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", `obteniendo datos del formulario...`, "info");
const usernameElements = Array.from(document.querySelectorAll('input'));
const usernames = usernameElements.map((o) => o.value);
const articleElements = Array.from(document.querySelectorAll('input'));
const articles = articleElements.map((o) => o.value);
new Morebits.status("Paso 2", "creando denuncia en el tablón...", "info");
new mw.Api().edit(reportMotiveDict.link, reports_buildEditOnNoticeboard(input, usernames, articles))
.then(() => {
return reports_postsMessage(input);
})
.then(() => {
if (currentPageName.includes(`_discusión:${reportedUser}`)) {
finishMorebitsStatus(reports_Window, statusWindow, 'finished', true);
}
else {
finishMorebitsStatus(reports_Window, statusWindow, 'finished', false);
}
})
.catch((error) => {
finishMorebitsStatus(reports_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
});
}
}
function createReportsFormWindow(reportedUserFromDOM) {
if (typeof reportedUserFromDOM == 'string') {
reportedUser = reportedUserFromDOM;
}
else {
reportedUser = relevantUserName;
}
reports_Window = new Morebits.simpleWindow(620, 530);
reports_Window.setScriptName('Twinkle Lite');
reports_Window.setTitle('Denunciar usuario');
reports_Window.addFooterLink('Tablón de anuncios de los bibliotecarios', 'Wikipedia:Tablón de anuncios de los bibliotecarios');
const form = new Morebits.quickForm(reports_submitMessage);
const reportTypeField = form.append({
type: 'field',
label: 'Opciones:',
});
reportTypeField.append({
type: 'select',
label: 'Selecciona el motivo:',
name: 'motive',
list: getMotiveOptions(),
event: function (e) {
var _a;
if ((_a = e === null || e === void 0 ? void 0 : e.target) === null || _a === void 0 ? void 0 : _a.value) {
const selectedOption = e.target.value;
adjustMotiveOptions(selectedOption);
}
}
});
form.append({
type: 'checkbox',
list: [{
name: "notify",
value: "notify",
label: "Notificar al usuario denunciado",
checked: false,
tooltip: "Marca esta casilla para que Twinkle Lite deje un mensaje automático en la página de discusión del usuario reportado avisándole de la denuncia"
}],
style: "padding-left: 1em;"
});
const reportInfoField = form.append({
type: 'field',
label: 'Información:'
});
reportInfoField.append({
type: 'dyninput',
label: 'Usuarios denunciados:',
sublabel: 'Usuario:',
name: 'usernamefield',
value: "",
tooltip: 'Escribe el nombre del usuario denunciado sin ningún tipo de wikicódigo'
});
reportInfoField.append({
type: 'dyninput',
label: 'Artículos involucrados:',
sublabel: 'Artículo:',
name: 'articlefieldbox',
style: "display: none;",
id: 'articlefieldnode',
tooltip: 'Escribe el nombre del artículo sin ningún tipo de wikicódigo'
});
reportInfoField.append({
type: "input",
name: "otherreason",
id: "otherreasonnode",
style: "display: none;",
placeholder: "Título de la denuncia",
});
reportInfoField.append({
type: 'textarea',
label: 'Desarrolla la razón:',
name: 'reason',
tooltip: 'Incluye diffs si es necesario. Puedes usar wikicódigo. La firma se añadirá de forma automática.',
id: 'reasontextareanode'
});
form.append({
type: 'submit',
label: 'Aceptar'
});
const result = form.render();
reports_Window.setContent(result);
reports_Window.display();
setReportedUserName();
changeButtonNames();
}
;// CONCATENATED MODULE: ./src/modules/warnings.ts
let warnings_Window;
let warnedUser;
const templateDict = {
"aviso autopromoción": {
description: "usuarios creadores de páginas promocionales o de publicidad",
subgroup: [
{
type: 'input',
name: '_param-aviso autopromoción-1',
label: 'Artículo promocional en cuestión',
tooltip: 'Escribe el nombre del artículo considerado promocional o publicitario. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso blanqueo": {
description: "usuarios que han blanqueado total o parcialmente páginas en general o de discusión asociada",
subgroup: [
{
type: 'input',
name: '_param-aviso blanqueo-1',
label: 'Artículo en el que se realizó el blanqueo',
tooltip: 'Escribe el nombre del artículo en el que se realizó el blanqueo parcial o total. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso blanqueo discusión": {
description: "usuarios que han blanqueado total o parcialmente su página de discusión o la de otros usuarios",
},
"aviso categorizar": {
description: "usuarios que han olvidado categorizar artículos",
subgroup: [
{
type: 'input',
name: '_param-aviso categorizar-1',
label: 'Artículo en cuestión',
tooltip: 'Escribe el nombre del artículo que no ha sido categorizado por el usuario. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso conflicto de interés": {
description: "usuarios que editan bajo conflicto de interés o que constituyen CPP y no respetan PVN"
},
"aviso copyvio": {
description: "usuarios que han creado artículos que vulneran derechos de autor",
subgroup: [
{
type: 'input',
name: '_param-aviso copyvio-1',
label: 'Artículo en el que hay copyvio',
tooltip: 'Escribe el nombre del artículo en el que se han vulnerado derechos de autor. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso etiqueta": {
description: "usuarios que han faltado a la etiqueta, realizando ediciones o creando comentarios o páginas que pueden resultar ofensivas",
subgroup: [
{
type: 'input',
name: '_param-aviso etiqueta-1',
label: 'Nombre del artículo donde se ha producido la falta de etiqueta',
tooltip: 'Escribe el nombre de la página donde se ha producido la falta de etiqueta. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso firma": {
description: "usuarios que han firmado artículos",
subgroup: [
{
type: 'input',
name: '_param-aviso firma-1',
label: 'Nombre del artículo donde se ha firmado erróneamente',
tooltip: 'Escribe el nombre del artículo donde se ha añadido una firma. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso guerra de ediciones": {
description: "usuario que puede desconocer R3R y se encuentre en guerra o conflicto de ediciones",
subgroup: [
{
type: 'input',
name: '_param-aviso guerra de ediciones-1',
label: 'Nombre de la página en la que se ha dado la guerra de ediciones',
tooltip: 'Escribe el nombre de la página en la que el usuario avisado ha participado en una guerra de ediciones. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso imagen": {
description: "autores que han subido imágenes que no deberían estar en Commons",
subgroup: [
{
type: 'input',
name: '_param-aviso imagen-1',
label: 'Nombre del archivo en Commons',
tooltip: 'Escribe el nombre del archivo en Commons, incluyendo su extensión. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso noesunforo2": {
description: "usuarios que forean en páginas de discusión",
subgroup: [
{
type: 'input',
name: '_param-aviso noesunforo2-1',
label: 'Artículo en el que se realizó la edición',
tooltip: 'Escribe el nombre del artículo en el que se cometió la prueba de edición. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso nombre inapropiado": {
description: "nombres de usuario que van contra la política de nombres de usuario"
},
"aviso prueba1": {
description: "usuarios que han realizado ediciones no apropiadas",
subgroup: [
{
type: 'input',
name: '_param-aviso prueba1-1',
label: 'Artículo en el que se realizó la edición',
tooltip: 'Escribe el nombre del artículo en el que se cometió la prueba de edición. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso prueba2": {
description: "usuarios que han realizado ediciones vandálicas",
subgroup: [
{
type: 'input',
name: '_param-aviso prueba2-1',
label: 'Artículo en el que se realizó el vandalismo',
tooltip: 'Escribe el nombre del artículo en el que se cometió el vandalismo. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso prueba3": {
description: "usuarios que han realizado más de una edición vandálica",
subgroup: [
{
type: 'input',
name: '_param-aviso prueba3-1',
label: 'Artículo en el que se llevó a cabo el vandalismo',
tooltip: 'Escribe el nombre del artículo en elviso noesunforo1 que se cometió el vandalismo. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso prueba4": {
description: "ultimo aviso a usuarios vandálicos antes de denunciarlo en TAB",
subgroup: [
{
type: 'input',
name: '_param-aviso prueba4-1',
label: 'Artículo en el que se llevó a cabo el vandalismo',
tooltip: 'Escribe el nombre del artículo en el que se cometió el vandalismo. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"aviso sin sentido": {
description: "usuarios que crean páginas sin sentido o bulos",
subgroup: [
{
type: 'input',
name: '_param-aviso sin sentido-1',
label: 'Artículo en el que se llevó a cabo la edición',
tooltip: 'Escribe el nombre del artículo en el que se llevó a cabo la edición sin sentido o bulo. No uses corchetes, el enlace se añadirá automáticamente',
required: true
}
]
},
"aviso topónimos de España": {
description: "usuarios que no han tenido en cuenta WP:TOES",
subgroup: [
{
type: 'input',
name: '_param-aviso topónimos de España-1',
label: 'Artículo en cuestión',
tooltip: 'Escribe el nombre de la página en la que se ha violado la política de WP:TOES. No uses corchetes, el enlace se añadirá automáticamente',
}
]
},
"aviso tradref": {
description: "usuarios que han traducido un artículo pero no han agregado la atribución o referencias a copyright correspondientes",
subgroup: [
{
type: 'input',
name: '_param-aviso tradref-1',
label: 'Nombre del artículo',
tooltip: 'Escribe el nombre del artículo en el que no se ha añadido la atribución correcta, sin usar corchetes',
}
]
},
"aviso traslado al taller": {
description: "usuarios que han creado una página no apta para el espacio principal",
subgroup: [
{
type: 'input',
name: '_param-aviso traslado al taller-1',
label: 'Página (del taller) en la que se encuentra el artículo trasladado',
tooltip: 'Escribe el nombre de la página en la que se encuentra ahora el artículo (Ej.: si pones «EjemploDePágina», el enlace llevará a «Usuario:Ejemplo/Taller/EjemploDePágina»). No uses corchetes, el enlace se añadirá automáticamente',
}
]
},
"aviso votonulo": {
description: "usuarios que han intentado votar sin cumplir los requisitos"
},
"no amenaces con acciones legales": {
description: "usuarios que han amenazado con denunciar o llevar a juicio a Wikipedia/otros usuarios",
subgroup: [
{
type: 'input',
name: '_param-no amenaces con acciones legales-1',
label: 'Página en la que se llevó a cabo la amenaza',
tooltip: '(Opcional) Escribe el nombre de la página en la que se llevó a cabo la amenaza. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"no retires plantillas de mantenimiento crítico": {
description: "usuarios que han retirado plantillas de mantenimiento crítico sin consenso en PD",
subgroup: [
{
type: 'input',
name: '_param-no retires plantillas de mantenimiento crítico-1',
label: 'Artículo en el que se retiró la plantilla',
tooltip: 'Escribe el nombre del artículo en el que se encontraba la plantilla retirada. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"planvand": {
description: "usuarios que han realizado ediciones perjudiciales o que van más allá del vandalismo",
subgroup: [
{
type: 'input',
name: '_param-planvand-1',
label: 'Artículo en el que se llevó a cabo el vandalismo',
tooltip: 'Escribe el nombre del artículo en el que se cometió el vandalismo. No uses corchetes, el enlace se añadirá automáticamente'
}
]
},
"ten precaución en la retirada de plantillas de mantenimiento no crítico": {
description: "usuarios que han retirado plantillas de mantenimiento no crítico sin explicaciones",
subgroup: [
{
type: 'input',
name: '_param-ten precaución en la retirada de plantillas de mantenimiento no crítico-1',
label: 'Artículo del que se retiró la plantilla',
tooltip: 'Escribe el nombre del artículo en el que se produjo la retirada indebida de la plantilla de mantenimiento no crítico. No uses corchetes, el enlace se añadirá automáticamente'
}
]
}
};
function descriptionLinkBuilder(link) {
const fullLink = `https://es.wikipedia.orghttps://wikifreehand.com/es/Plantilla:${link}`;
return `<a href="${fullLink}" target="_blank">(+)</a>`;
}
function warnings_listBuilder(list) {
var _a;
let finalList = ;
for (let item in list) {
const template = {
name: item,
value: item,
label: `{{${item}}} · ${list.description} ${descriptionLinkBuilder(item)}`,
subgroup: ((_a = list) === null || _a === void 0 ? void 0 : _a.subgroup) ? list.subgroup : null
};
finalList.push(template);
}
return finalList;
}
function warnings_templateBuilder(paramObj) {
var _a, _b;
let finalString = '';
for (const element in paramObj) {
const parameter = ((_a = paramObj) === null || _a === void 0 ? void 0 : _a.param) ? `|${paramObj.param}=` : '';
const parameterValue = ((_b = paramObj) === null || _b === void 0 ? void 0 : _b.paramValue) || '';
finalString += `{{sust:${element}${parameter}${parameterValue}}}\n`;
}
return finalString;
}
function warnings_extractParamsFromInput(input) {
let temporaryTemplateList = ;
for (const of Object.entries(input)) {
if (value && !key.includes('_param') && key != 'notify' && key != 'reason' && key != 'search') {
temporaryTemplateList.push(key);
}
}
return temporaryTemplateList;
}
function warnings_paramAssigner(paramList, input) {
let finalObj = {};
for (const element of paramList) {
finalObj = {};
for (const of Object.entries(input)) {
if (key.includes('_param') && key.includes(element)) {
finalObj = {
"param": key.split('-').pop(),
"paramValue": value
};
}
}
}
return finalObj;
}
function createWarningsFormWindow(warnedUserFromDOM) {
if (typeof warnedUserFromDOM == 'string') {
warnedUser = warnedUserFromDOM;
}
else {
warnedUser = relevantUserName;
}
warnings_Window = new Morebits.simpleWindow(620, 530);
warnings_Window.setScriptName('Twinkle Lite');
warnings_Window.setTitle('Avisar al usuario');
warnings_Window.addFooterLink('Plantillas de aviso a usuario', 'Wikipedia:Plantillas de aviso a usuario');
const form = new Morebits.quickForm(warnings_submitMessage);
form.append({
type: 'input',
value: '',
name: 'search',
label: 'Búsqueda:',
id: 'search',
size: 30,
event: function quickFilter() {
const searchInput = document.getElementById("search");
if (searchInput) {
const allCheckboxDivs = document.querySelectorAll("#checkboxContainer > div");
if (this.value) {
function flushList(callback) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
const div = allCheckboxDivs;
div.style.display = 'none';
}
callback();
}
function updateList(searchString) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
const checkboxText = allCheckboxDivs.childNodes.textContent;
if (checkboxText) {
if (checkboxText.includes(searchString.toLowerCase()) || checkboxText.includes(searchString.toUpperCase())) {
const div = allCheckboxDivs;
div.style.display = '';
}
}
}
}
flushList(() => updateList(searchInput.value));
}
if (this.value && this.value.length == 0) {
for (let i = 0; i < allCheckboxDivs.length; i++) {
const div = allCheckboxDivs;
div.style.display = '';
}
}
}
}
});
const optionBox = form.append({
type: 'div',
id: 'tagWorkArea',
className: 'morebits-scrollbox',
style: 'max-height: 28em; min-height: 0.5em;'
});
optionBox.append({
type: 'checkbox',
id: 'checkboxContainer',
list: warnings_listBuilder(templateDict)
});
const optionsField = form.append({
type: 'field',
label: 'Opciones:'
});
optionsField.append({
type: 'input',
name: 'reason',
label: 'Razón:',
tooltip: '(Opcional) Escribe aquí el resumen de edición explicando la razón por la que se ha añadido la plantilla',
style: 'width: 80%; margin-top: 0.5em;'
});
form.append({
type: 'submit',
label: 'Aceptar'
});
const result = form.render();
warnings_Window.setContent(result);
warnings_Window.display();
}
function warnings_submitMessage(e) {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
let templateList = warnings_extractParamsFromInput(input);
let templateParams = warnings_paramAssigner(templateList, input);
if (warnedUser == currentUser) {
alert("No puedes dejarte un aviso a ti mismo");
return;
}
else {
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", 'generando plantilla...', 'info');
warnings_postsMessage(templateParams, input)
.then(function () {
if (currentPageName.includes(`_discusión:${warnedUser}`)) {
finishMorebitsStatus(warnings_Window, statusWindow, 'finished', true);
}
else {
finishMorebitsStatus(warnings_Window, statusWindow, 'finished', false);
}
})
.catch(function (error) {
finishMorebitsStatus(warnings_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
});
}
}
function warnings_postsMessage(templateParams, input) {
new Morebits.status("Paso 2", "publicando aviso en la página de discusión del usuario", "info");
return isPageMissing(`Usuario_discusión:${warnedUser}`)
.then(function (mustCreateNewTalkPage) {
if (mustCreateNewTalkPage) {
return new mw.Api().create(`Usuario_discusión:${warnedUser}`, { summary: `Añadiendo aviso de usuario mediante ]` + `${input.reason ? `. ${input.reason}` : ''}` }, `${warnings_templateBuilder(templateParams)}~~~~`);
}
else {
return new mw.Api().edit(`Usuario_discusión:${warnedUser}`, function (revision) {
return {
text: revision.content + `\n${warnings_templateBuilder(templateParams)}~~~~`,
summary: `Añadiendo aviso de usuario mediante ]` + `${input.reason ? `. ${input.reason}` : ''}`,
minor: false
};
});
}
});
}
;// CONCATENATED MODULE: ./src/modules/hide.ts
let diffID;
let hide_Window;
function updateLabel(checkstatus = false) {
const label = document.querySelector('label');
if (label) {
if (checkstatus) {
label.style.display = '';
}
else {
label.style.display = 'none';
}
}
}
function createHideFormWindow(diff) {
diffID = diff;
hide_Window = new Morebits.simpleWindow(620, 530);
hide_Window.setScriptName('Twinkle Lite');
hide_Window.setTitle('Solicitar ocultado de edición');
hide_Window.addFooterLink('Política de supresores', 'Wikipedia:Supresores');
const form = new Morebits.quickForm(hide_submitMessage);
form.append({
type: 'textarea',
name: 'reason',
label: 'Describe el motivo (opcional)',
tooltip: 'Puedes usar wikicódigo en tu descripción, tu firma se añadirá automáticamente'
});
const optionsField = form.append({
type: 'field',
label: 'Opciones: ',
});
optionsField.append({
type: 'checkbox',
list: [{
name: 'moreDIffs',
label: 'Incluir más diffs en la solicitud',
checked: false,
}],
name: 'moreDiffsCheckbox',
event: (e) => {
const checked = e.target.checked;
const inputField = document.getElementById('moreDiffsInputField');
if (checked) {
inputField.style.display = '';
}
else {
inputField.style.display = 'none';
}
updateLabel(checked);
}
});
optionsField.append({
type: 'input',
label: 'Escribe el ID de otros diffs que quieras incluir, separados por comas:<br> <i>Ejemplo: «159710180, 159635315»</i><br>',
tooltip: 'El ID es el número de nueve cifras que aparece al final de la URL en una página de diff después de «oldid=»',
name: 'moreDiffsString',
style: "display: none;",
id: 'moreDiffsInputField',
});
form.append({
type: 'submit',
label: 'Aceptar'
});
const result = form.render();
hide_Window.setContent(result);
hide_Window.display();
updateLabel();
}
function makeDiffList(diffIDs) {
let processedDiffList = diffIDs.replace(/+/g, "");
let processedDiffListArray = processedDiffList.split(',');
processedDiffListArray.unshift(diffID);
return processedDiffListArray;
}
function makeDiffMessage(inputList) {
let iterations = inputList.length;
let message = '';
for (let diff of inputList) {
iterations--;
message += `* ]${iterations ? '\n' : ''}`;
}
return message;
}
function buildMessage(moreDiffs, reason) {
let diffList = ;
if (moreDiffs) {
diffList = makeDiffList(moreDiffs);
}
else {
diffList.push(diffID);
}
const boardMessage = `\n== Ocultar ${moreDiffs ? "ediciones" : "edición"} ==
; Asunto
${makeDiffMessage(diffList)}
${reason ? `; Motivo\n${reason}` : ''}
; Usuario que lo solicita
* ~~~~
; Respuesta
(a rellenar por un bibliotecario)
`;
return boardMessage;
}
function hide_submitMessage(e) {
const board = "Wikipedia:Tablón_de_anuncios_de_los_bibliotecarios/Portal/Archivo/Miscelánea/Actual";
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("Paso 1", `Solicitando el ocultado de ${input.moreDiffs ? 'las ediciones' : 'la edición'}...`, "info");
new mw.Api().edit(board, (revision) => {
const editParams = {
text: revision.content + buildMessage(input.moreDiffsString, input.reason),
summary: `Solicitando ocultado de ${input.moreDiffs ? 'ediciones' : 'una edición'} mediante ]`,
minor: false
};
return editParams;
}).then(() => {
finishMorebitsStatus(hide_Window, statusWindow, 'finished', false);
})
.catch(function (error) {
finishMorebitsStatus(hide_Window, statusWindow, 'error');
console.error(`Error: ${error}`);
});
}
;// CONCATENATED MODULE: ./src/modules/fastblocker.ts
let username;
const fastblocker_listMotiveOptions = [
{ name: 'Vandalismo de páginas', value: ']' },
{ name: 'Cuenta creada para vandalizar', value: ']' },
{ name: 'Vandalismo impedido por el filtro antiabusos', value: ']' },
{ name: 'CPP', value: ']' },
{ name: 'Nombre de usuario inapropiado', value: ']' },
{ name: 'Usuario títere', value: ']' },
{ name: 'LTA', value: ']' },
{ name: 'Spam', value: ']' },
{ name: 'Proxy abierto', value: '], ] o ]' }
];
const listDurationOptions = [
{ name: 'para siempre', value: 'never' },
{ name: '31 horas', value: '31 hours', default: true },
{ name: '3 días', value: '3 days' },
{ name: '1 semana', value: '1 week' },
{ name: '2 semanas', value: '2 weeks' },
{ name: '1 mes', value: '1 month' },
{ name: '2 meses', value: '2 months' },
{ name: '3 meses', value: '3 months' },
{ name: '6 meses', value: '6 months' },
{ name: '1 año', value: '1 year' },
{ name: '2 años', value: '2 years' }
];
const timeDictionary = {
second: 'segundo',
seconds: 'segundos',
minute: 'minuto',
minutes: 'minutos',
h: 'horas',
hour: 'hora',
hours: 'horas',
day: 'día',
days: 'días',
week: 'semana',
weeks: 'semanas',
month: 'mes',
months: 'meses',
year: 'año',
years: 'años',
decade: 'década',
decades: 'décadas',
};
function translateDuration(duration) {
if (/(indefinite|infinity|forever|infinite|never)/.test(duration)) {
return 'para siempre';
}
if (/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/.test(duration)) {
return 'hasta el ' + fastblocker_parseTimestamp(duration);
}
let durationArray = duration.split(' ');
for (let word in durationArray) {
if (/\d+/.test(durationArray)) {
continue;
}
if (timeDictionary]) {
durationArray = timeDictionary];
}
return 'por ' + durationArray.join(' ');
}
}
function fastblocker_parseTimestamp(timestamp) {
let date = new Date(timestamp);
return date.toLocaleDateString('es-ES') + ' ' + date.toLocaleTimeString('es-ES');
}
function translateBlockLog(timestamp, action, user, duration) {
let marcaDeTiempo, duracion;
marcaDeTiempo = fastblocker_parseTimestamp(timestamp);
if (action === 'unblock') {
return `${marcaDeTiempo}: Fue desbloqueado por ${user}. `;
}
duracion = translateDuration(duration);
return `${marcaDeTiempo}: Fue bloqueado por ${user} ${duracion}. `;
}
function getLastBlocks(username) {
let params = {
action: 'query',
format: 'json',
list: 'logevents',
letype: 'block',
letitle: `User:${username}`,
lelimit: "3"
};
let api = new mw.Api().get(params);
let blockInfo = api.then(function (data) {
let logevents = data.query.logevents;
if (logevents.length === 0) {
return 'No constan bloqueos.';
}
let newList = document.createElement('ul');
for (let l in logevents) {
let li = document.createElement('li');
let logTextWithoutMotive = translateBlockLog(logevents.timestamp, logevents.action, logevents.user, logevents.params.duration);
let logText = logTextWithoutMotive + '(' + logevents.comment + ')';
li.appendChild(document.createTextNode(logText));
newList.appendChild(li);
}
return newList.innerHTML;
});
return blockInfo;
}
function fastblocker_getOptions(list) {
let dropDownOptions = ;
for (let a of list) {
let option = { type: 'option', value: a.value, label: a.name, selected: a.default };
dropDownOptions.push(option);
}
return dropDownOptions;
}
function fastblocker_modifyFooterLink() {
const anchor = document.querySelector('span.morebits-dialog-footerlinks>a');
anchor.href = `https://es.wikipedia.org/w/index.php?title=Especial:Registro&page=${username}&type=block`;
}
function createFormWindow() {
let Window = new Morebits.simpleWindow(620, 530);
Window.setScriptName('FastBlocker');
Window.setTitle(`Bloquear a ${username}`);
Window.addFooterLink('Registro completo de bloqueos del usuario', '');
fastblocker_modifyFooterLink();
let form = new Morebits.quickForm(submitBlock);
let lastBlocks = form.append({
type: 'field',
label: 'Últimos bloqueos:'
});
lastBlocks.append({
type: 'div',
name: 'lastBlocks',
label: 'Cargando...',
style: 'margin-left: 1em'
});
let blockOptions = form.append({
type: 'field',
label: 'Opciones:'
});
blockOptions.append({
type: 'select',
name: 'motive',
label: 'Motivo:',
list: fastblocker_getOptions(fastblocker_listMotiveOptions),
disabled: false
});
blockOptions.append({
type: 'select',
name: 'time',
label: 'Duración:',
list: fastblocker_getOptions(listDurationOptions),
disabled: false
});
if (/^(?:{1,4}:){7}{1,4}$/.test(username)) {
blockOptions.append({
type: 'checkbox',
list: [{
name: 'sixtyfour',
label: 'Bloquear /64',
checked: true
}],
});
}
form.append({
type: 'submit',
label: 'Aceptar'
});
let result = form.render();
Window.setContent(result);
Window.display();
getLastBlocks(username).then(function (apiLastBlocks) {
let showLastBlocks = document.querySelector("div > span.quickformDescription");
if (!apiLastBlocks) {
showLastBlocks.innerHTML = '<span style="font-weight: bold;">Sin bloqueos.</span>';
}
else {
showLastBlocks.innerHTML = `${apiLastBlocks}`;
}
});
}
function submitBlock(e) {
let form = e.target;
let input = Morebits.quickForm.getInputData(form);
if (input.sixtyfour === true) {
username = Morebits.ip.get64(username);
}
new mw.Api().postWithToken('csrf', {
action: 'block',
user: username,
expiry: input.time,
reason: input.motive,
nocreate: true,
autoblock: true,
allowusertalk: true,
anononly: true,
reblock: true
}).then(function () {
mw.notify(`${username} ha sido bloqueado.`);
});
}
function createFastBlockerButton() {
mw.hook('wikipage.content').add(function (obj) {
obj.find('a.mw-usertoollinks-block').each(function (element) {
const newElement = document.createElement('span');
newElement.textContent = ' · ';
newElement.className = 'fast-blocker';
const elementChild = document.createElement('a');
elementChild.id = 'block-button';
elementChild.style.color = 'red';
elementChild.textContent = 'bloqueo rápido';
elementChild.addEventListener('click', () => {
username = element.title.substring(18);
createFormWindow();
});
newElement.append(elementChild);
element.parentNode.insertBefore(newElement, element.nextSibling);
});
});
}
;// CONCATENATED MODULE: ./src/modules/config.ts
var config_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
let config_Window;
let config = null;
function createConfigPage(settings) {
return config_awaiter(this, void 0, void 0, function* () {
yield new mw.Api().create(`Usuario:${currentUser}/twinkle-lite-settings.json`, { summary: `Creando página de configuración de ]` }, JSON.stringify(settings));
});
}
function editConfigPage(settings) {
return config_awaiter(this, void 0, void 0, function* () {
yield new mw.Api().edit(`Usuario:${currentUser}/twinkle-lite-settings.json`, () => {
return {
text: JSON.stringify(settings),
summary: `Editando página de configuración de ]`,
minor: false
};
});
});
}
function saveSettingsToLocalStorage(settings) {
try {
const serializedSettings = JSON.stringify(settings);
localStorage.setItem("TwinkleLiteUserSettings", serializedSettings);
}
catch (error) {
console.error("Hubo un error guardando las preferencias de configuración en el localStorage:", error);
}
}
function config_submitMessage(e) {
return config_awaiter(this, void 0, void 0, function* () {
const form = e.target;
const input = Morebits.quickForm.getInputData(form);
const statusWindow = new Morebits.simpleWindow(400, 350);
createStatusWindow(statusWindow);
new Morebits.status("⌛", "Actualizando configuración...", "info");
try {
const configPageMissing = yield isPageMissing(`Usuario:${currentUser}/twinkle-lite-settings.json`);
if (configPageMissing) {
yield createConfigPage(input);
}
else {
yield editConfigPage(input);
}
saveSettingsToLocalStorage(input);
finishMorebitsStatus(config_Window, statusWindow, 'finished', true);
}
catch (error) {
console.error(error);
finishMorebitsStatus(config_Window, statusWindow, 'error');
}
});
}
function createConfigWindow(settings) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
config_Window = new Morebits.simpleWindow(620, 530);
config_Window.setScriptName('Twinkle Lite');
config_Window.setTitle('Configuración de Twinkle Lite');
config_Window.addFooterLink('Documentación de Twinkle Lite', 'WP:TL');
const form = new Morebits.quickForm(config_submitMessage);
const tagsField = form.append({
type: 'field',
label: 'Módulo de plantillado de artículos',
id: 'tags-box'
});
tagsField.append({
type: 'checkbox',
name: 'tagsMenu',
list: [{
value: 'tags',
label: 'Activa la opción «Añadir plantilla» en el menú de acciones',
name: 'tagsActionsMenuCheckbox',
checked: (_a = settings === null || settings === void 0 ? void 0 : settings.tagsActionsMenuCheckbox) !== null && _a !== void 0 ? _a : true
}]
});
const DRMField = form.append({
type: 'field',
label: 'Módulo de apertura de consultas de borrado',
id: 'drm-box'
});
DRMField.append({
type: 'checkbox',
name: 'drmMenu',
list: [{
value: 'DRM',
label: 'Activa la opción «Abrir CDB» en el menú de acciones',
name: 'DRMActionsMenuCheckbox',
checked: (_b = settings === null || settings === void 0 ? void 0 : settings.DRMActionsMenuCheckbox) !== null && _b !== void 0 ? _b : true
}]
});
const hideField = form.append({
type: 'field',
label: 'Módulo de ocultado de ediciones'
});
hideField.append({
type: 'checkbox',
name: 'hideMenu',
list: [{
value: 'hide',
label: 'Activa la opción de ocultar ediciones en páginas de diffs',
name: 'HideDiffPageCheckbox',
checked: (_c = settings === null || settings === void 0 ? void 0 : settings.HideDiffPageCheckbox) !== null && _c !== void 0 ? _c : true
}]
});
const pageProtectionField = form.append({
type: 'field',
label: 'Módulo de solicitud de protección de páginas',
});
pageProtectionField.append({
type: 'checkbox',
name: 'PPMenu',
list: [{
value: 'PP',
label: 'Activa la opción «Pedir protección» en el menú de acciones',
name: 'PPActionMenuCheckbox',
checked: (_d = settings === null || settings === void 0 ? void 0 : settings.PPActionMenuCheckbox) !== null && _d !== void 0 ? _d : true
}]
});
const speedyDeletionField = form.append({
type: 'field',
label: 'Módulo de solicitud de borrado rápido'
});
speedyDeletionField.append({
type: 'checkbox',
name: 'speedyDeletionMenu',
list: [{
value: 'speedy-actions',
label: 'Activa la opción «Borrado rápido» en el menú de acciones',
name: 'SDActionsMenuCheckbox',
checked: (_e = settings === null || settings === void 0 ? void 0 : settings.SDActionsMenuCheckbox) !== null && _e !== void 0 ? _e : true
}]
});
const reportsField = form.append({
type: 'field',
label: 'Módulo de denuncias'
});
reportsField.append({
type: 'checkbox',
name: 'reportsMenu',
list: [
{
value: 'reports-actions',
label: 'Activa la opción «Denunciar usuario» en el menú de acciones en páginas de usuario',
name: 'ReportsActionsMenuCheckbox',
checked: (_f = settings === null || settings === void 0 ? void 0 : settings.ReportsActionsMenuCheckbox) !== null && _f !== void 0 ? _f : true
},
{
value: 'reports-usertoollinks',
label: 'Activa la opción «denunciar» en la lista de diffs en páginas de historial, cambios recientes y similares',
name: 'ReportsUserToolLinksMenuCheckbox',
checked: (_g = settings === null || settings === void 0 ? void 0 : settings.ReportsUserToolLinksMenuCheckbox) !== null && _g !== void 0 ? _g : true
}
]
});
const warningsModuleField = form.append({
type: 'field',
label: 'Módulo de advertencias'
});
warningsModuleField.append({
type: 'checkbox',
name: 'warningsMenu',
list: [
{
value: 'warnings-actions',
label: 'Activa la opción «Avisar usuario» en el menú de acciones',
name: 'WarningsActionsMenuCheckbox',
checked: (_h = settings === null || settings === void 0 ? void 0 : settings.WarningsActionsMenuCheckbox) !== null && _h !== void 0 ? _h : true
},
{
value: 'warnings-usertoollinks',
label: 'Activa la opción «denunciar» en en la lista de diffs en páginas de historial, cambios recientes y similares',
name: 'WarningsUserToolLinksMenuCheckbox',
checked: (_j = settings === null || settings === void 0 ? void 0 : settings.WarningsUserToolLinksMenuCheckbox) !== null && _j !== void 0 ? _j : true
}
]
});
const fastBlockerField = form.append({
type: 'field',
label: 'Módulo de bloqueado rápido (solo bibliotecarios)'
});
fastBlockerField.append({
type: 'checkbox',
name: 'fbMenu',
list: [{
value: 'fast-blocker',
label: 'Activa el botón «bloqueo rápido» en historiales y la lista de seguimiento',
name: 'FBButtonMenuCheckbox',
disabled: !isCurrentUserSysop,
checked: (_k = settings === null || settings === void 0 ? void 0 : settings.FBButtonMenuCheckbox) !== null && _k !== void 0 ? _k : true
}]
});
const DRCField = form.append({
type: 'field',
label: 'Módulo de cerrado de consultas de borrado (solo bibliotecarios)',
id: 'drc-box'
});
DRCField.append({
type: 'checkbox',
name: 'drcMenu',
list: [
{
value: 'tags-option',
label: 'Muestra un botón «Cerrar CDB» en páginas en las de consultas de borrado',
name: 'DRCPageMenuCheckbox',
disabled: !isCurrentUserSysop,
checked: (_l = settings === null || settings === void 0 ? void 0 : settings.DRCPageMenuCheckbox) !== null && _l !== void 0 ? _l : true
},
{
value: 'tags-actions',
label: 'Muestra la opción «Cerrar CDB» en el menú de acciones en las de consultas de borrado',
name: 'DRCActionsMenuCheckbox',
disabled: !isCurrentUserSysop,
checked: (_m = settings === null || settings === void 0 ? void 0 : settings.DRCActionsMenuCheckbox) !== null && _m !== void 0 ? _m : true
},
]
});
const blockAppealsField = form.append({
type: 'field',
label: 'Módulo de resolución de peticiones de desbloqueo (solo bibliotecarios)'
});
blockAppealsField.append({
type: 'checkbox',
name: 'baMenu',
list: [{
value: 'block-appeals',
label: 'Muestra un botón en las páginas de usuario en las que se encuentra una solicitud de desbloqueo',
name: 'BAButtonMenuCheckbox',
disabled: !isCurrentUserSysop,
checked: (_o = settings === null || settings === void 0 ? void 0 : settings.BAButtonMenuCheckbox) !== null && _o !== void 0 ? _o : true
}]
});
form.append({
type: 'submit',
label: 'Aplicar configuración',
});
const result = form.render();
config_Window.setContent(result);
config_Window.display();
}
;// CONCATENATED MODULE: ./src/index.ts
var src_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator(value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || )).next());
});
};
if (!window.IS_TWINKLE_LITE_LOADED) {
window.IS_TWINKLE_LITE_LOADED = true;
const loadDependencies = (callback) => {
mw.loader.using();
callback();
};
const loadMorebits = (callback) => {
mw.loader.load('https://en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-morebits.js&action=raw&ctype=text/javascript', 'text/javascript');
mw.loader.load('https://en.wikipedia.org/w/index.php?title=MediaWiki:Gadget-morebits.css&action=raw&ctype=text/css', 'text/css');
callback();
};
const initializeTwinkleLite = () => src_awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
const settings = yield getConfigPage();
if (+currentNamespace >= 0 || mw.config.get('wgArticleId')) {
if ((_a = settings === null || settings === void 0 ? void 0 : settings.DRMActionsMenuCheckbox) !== null && _a !== void 0 ? _a : true) {
const DRMportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Abrir CDB', 'TL-button', 'Abre una consulta de borrado para esta página');
if (DRMportletLink) {
DRMportletLink.onclick = createDeletionRequestMarkerFormWindow;
}
}
if ((_b = settings === null || settings === void 0 ? void 0 : settings.SDActionsMenuCheckbox) !== null && _b !== void 0 ? _b : true) {
const SDportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Borrado rápido', 'TL-button', 'Solicita el borrado rápido de la página');
if (SDportletLink) {
SDportletLink.onclick = createSpeedyDeletionFormWindow;
}
}
if ((_c = settings === null || settings === void 0 ? void 0 : settings.PPActionMenuCheckbox) !== null && _c !== void 0 ? _c : true) {
const PPportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Pedir protección', 'TL-button', 'Solicita que esta página sea protegida');
if (PPportletLink) {
PPportletLink.onclick = createPageProtectionFormWindow;
}
}
}
if (currentNamespace === 0 || currentNamespace === 1 || currentNamespace === 104 || currentNamespace === 105) {
if ((_d = settings === null || settings === void 0 ? void 0 : settings.tagsActionsMenuCheckbox) !== null && _d !== void 0 ? _d : true) {
const TportleltLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Añadir plantilla', 'TL-button', 'Añade una plantilla a la página');
if (TportleltLink) {
TportleltLink.onclick = createTagsFormWindow;
}
}
}
if (currentNamespace === 2 || currentNamespace === 3 || (mw.config.get('wgPageName').indexOf("Especial:Contribuciones") > -1)) {
if ((_e = settings === null || settings === void 0 ? void 0 : settings.ReportsActionsMenuCheckbox) !== null && _e !== void 0 ? _e : true) {
const RportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Denunciar usuario', 'TL-button', 'Informa de un problema en relación con el usuario');
if (RportletLink) {
RportletLink.onclick = createReportsFormWindow;
}
}
if ((_f = settings === null || settings === void 0 ? void 0 : settings.WarningsActionsMenuCheckbox) !== null && _f !== void 0 ? _f : true) {
const WportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Avisar al usuario', 'TL-button', 'Deja una plantilla de aviso al usuario en su página de discusión');
if (WportletLink) {
WportletLink.onclick = createWarningsFormWindow;
}
}
if ((_g = settings === null || settings === void 0 ? void 0 : settings.BAButtonMenuCheckbox) !== null && _g !== void 0 ? _g : true) {
if (isCurrentUserSysop && currentNamespace === 3 || currentNamespace === 2) {
const appealRequest = document.querySelector('.block-appeal');
if (appealRequest) {
createBlockAppealsButton(appealRequest);
}
}
}
}
if (isCurrentUserSysop && currentNamespace == 4 && currentPageName.startsWith('Wikipedia:Consultas_de_borrado/')) {
const openDeletionRequest = yield checkIfOpenDR(currentPageName);
if (openDeletionRequest) {
if ((_h = settings === null || settings === void 0 ? void 0 : settings.DRCActionsMenuCheckbox) !== null && _h !== void 0 ? _h : true) {
const DRCportletLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Cerrar CDB', 'TL-button', 'Cierra esta consulta de borrado');
if (DRCportletLink) {
DRCportletLink.onclick = createDRCFormWindow;
}
}
if ((_j = settings === null || settings === void 0 ? void 0 : settings.DRCPageMenuCheckbox) !== null && _j !== void 0 ? _j : true) {
const mwContentElement = document.querySelector('.mw-content-ltr');
if (mwContentElement) {
createDRCButton(mwContentElement);
}
}
}
}
if (isCurrentUserSysop) {
if ((_k = settings === null || settings === void 0 ? void 0 : settings.FBButtonMenuCheckbox) !== null && _k !== void 0 ? _k : true) {
createFastBlockerButton();
}
}
if (currentAction == 'history' ||
currentPageName == "Especial:Seguimiento" ||
currentPageName == "Especial:CambiosRecientes" ||
currentPageName == "Especial:PáginasNuevas" ||
diffNewId) {
mw.hook('wikipage.content').add(() => {
var _a, _b;
if (document.querySelectorAll('a.mw-userlink').length > 0 && !document.getElementById('report-button')) {
if ((_a = settings === null || settings === void 0 ? void 0 : settings.ReportsUserToolLinksMenuCheckbox) !== null && _a !== void 0 ? _a : true) {
createButton('report-button', 'denunciar', '#924141', createReportsFormWindow);
}
if ((_b = settings === null || settings === void 0 ? void 0 : settings.WarningsUserToolLinksMenuCheckbox) !== null && _b !== void 0 ? _b : true) {
createButton('warning-button', 'aviso', 'teal', createWarningsFormWindow);
}
}
});
}
if (diffNewId && !document.querySelector('.TL-hide-button')) {
mw.hook('wikipage.content').add(() => {
var _a;
if ((_a = settings === null || settings === void 0 ? void 0 : settings.HideDiffPageCheckbox) !== null && _a !== void 0 ? _a : true) {
createHideButton(createHideFormWindow);
}
});
}
if (currentNamespace == 2 && currentPageName.endsWith(currentUser)) {
const configLink = mw.util.addPortletLink('p-cactions', 'javascript:void(0)', 'Configuración de TL', 'TL-button', 'Configuración de Twinkle Lite');
if (configLink) {
configLink.onclick = () => createConfigWindow(settings);
}
}
});
const loadTwinkleLite = () => {
loadDependencies(() => {
loadMorebits(() => {
initializeTwinkleLite();
console.log("Twinkle Lite cargado");
});
});
};
loadTwinkleLite();
}
else {
console.warn('Parece que Twinkle Lite se ha intentado cargar dos veces. Comprueba la configuración para evitar la doble importación del script.');
}
/******/ })()
;
//</nowiki>