Usuário:Eduardo Gottert/common.js
Nota: Depois de publicar, poderá ter de contornar a cache do seu navegador para ver as alterações.
- Firefox / Safari: Pressione Shift enquanto clica Recarregar, ou pressione Ctrl-F5 ou Ctrl-R (⌘-R no Mac)
- Google Chrome: Pressione Ctrl-Shift-R (⌘-Shift-R no Mac)
- Edge: Pressione Ctrl enquanto clica Recarregar, ou pressione Ctrl-F5.
// eu espero nunca mais precisar usar esse inferno de linguagem na vida.
// ja fiz isso tudo no chatgpt, eu odeio javascript.
// terminado isso, alô a quem tá patrulhando <3, e eu espero que isso não dê erro e eu precise abrir o common.js dnv
function getEdits() {
let edits;
let todayEdits;
let weekEdits;
let monthEdits;
const menuList = document.querySelector('.vector-menu-content-list');
function fetchEdits(date) {
const apiUrl = `https://xtools.wmcloud.org/api/user/simple_editcount/pt.wikipedia.org/Eduardo Gottert/all/${date}/${date}`;
return fetch(apiUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
return data.live_edit_count + data.deleted_edit_count; // Return the total edit count
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
}
function fetchWeeklyEdits(startDate, endDate) {
const apiUrl = `https://xtools.wmcloud.org/api/user/simple_editcount/pt.wikipedia.org/Eduardo Gottert/all/${startDate}/${endDate}`;
return fetch(apiUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
return data.live_edit_count + data.deleted_edit_count; // Return the total weekly edit count
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
}
function fetchMonthlyEdits(startDate, endDate) {
const apiUrl = `https://xtools.wmcloud.org/api/user/simple_editcount/pt.wikipedia.org/Eduardo Gottert/all/${startDate}/${endDate}`;
return fetch(apiUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
return data.live_edit_count + data.deleted_edit_count; // Return the total monthly edit count
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
}
function getToday() {
const today = new Date();
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0');
const day = String(today.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
}
function getWeekStartDate() {
const today = new Date();
today.setDate(today.getDate() - 6);
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0');
const day = String(today.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // Format as yyyy-mm-dd
}
function getLast30DaysStartDate() {
const today = new Date();
today.setDate(today.getDate() - 30); // Set to 30 days ago
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0');
const day = String(today.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // Format as yyyy-mm-dd
}
if (menuList && menuList.firstChild) {
const newMenuItem = document.createElement('li');
const newLink = document.createElement('a');
const dropdown = document.createElement('div');
// Set up dropdown menu
dropdown.classList.add('dropdown');
dropdown.style.display = 'none'; // Initially hidden
dropdown.style.boxShadow = '0px 4px 8px rgba(0, 0, 0, 0.1)';
fetch('https://xtools.wmcloud.org/api/user/simple_editcount/pt.wikipedia.org/Eduardo Gottert/all/2000-01-01/2035-01-31')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json(); // Parse the JSON from the response
})
.then(data => {
edits = data.live_edit_count + data.deleted_edit_count;
// Fetch today's edits
const todayPromise = fetchEdits(getToday());
// Fetch weekly edits
const weekPromise = fetchWeeklyEdits(getWeekStartDate(), getToday());
// Fetch monthly edits
const monthPromise = fetchMonthlyEdits(getLast30DaysStartDate(), getToday());
return Promise.all([todayPromise, weekPromise, monthPromise]);
})
.then(results => {
todayEdits = results[0];
weekEdits = results[1];
monthEdits = results[2];
const newText = `Edits: ${edits} (${todayEdits})`;
newLink.textContent = newText;
newLink.href = "https://pt.wikipedia.org/w/index.php?title=Especial:Contribuições/Eduardo Gottert&target=Eduardo Gottert&offset=&limit=100";
const dailyDate = getToday();
const weeklyDate = getWeekStartDate();
const monthlyDate = getLast30DaysStartDate();
const dailyUrl = `https://pt.wikipedia.org/w/index.php?title=Especial%3AContribuições&target=Eduardo Gottert&namespace=all&tagfilter=&start=${dailyDate}&end=${getToday()}&limit=100`;
const weeklyUrl = `https://pt.wikipedia.org/w/index.php?title=Especial%3AContribuições&target=Eduardo Gottert&namespace=all&tagfilter=&start=${weeklyDate}&end=${getToday()}&limit=100`;
const monthlyUrl = `https://pt.wikipedia.org/w/index.php?title=Especial%3AContribuições&target=Eduardo Gottert&namespace=all&tagfilter=&start=${monthlyDate}&end=${getToday()}&limit=100`;
const totalUrl = `https://pt.wikipedia.org/w/index.php?title=Especial:Contribuições/Eduardo Gottert&target=Eduardo Gottert&offset=&limit=100`;
// Create dropdown content
dropdown.innerHTML = `
<a href="${dailyUrl}">Daily Edits: ${todayEdits}</a>
<a href="${weeklyUrl}">Weekly Edits: ${weekEdits}</a>
<a href="${monthlyUrl}">Monthly Edits: ${monthEdits}</a>
<a href="${totalUrl}">Total Edits: ${edits}</a>
`;
// Append link and dropdown to the menu item
newMenuItem.appendChild(newLink);
newMenuItem.appendChild(dropdown);
const itemToRemove = document.getElementById('pt-mycontris');
if (itemToRemove) {
itemToRemove.remove(); // Remove the item from the DOM
}
menuList.insertBefore(newMenuItem, menuList.children[1]);
// Show dropdown on hover
newMenuItem.addEventListener('mouseenter', () => {
dropdown.style.display = 'block'; // Show dropdown
});
newMenuItem.addEventListener('mouseleave', () => {
dropdown.style.display = 'none'; // Hide dropdown
});
// Seleciona o <span> dentro do <a> que está dentro do <li> com id "pt-userpage"
const spanElement = document.querySelector('#pt-userpage a span');
// Verifica se o spanElement existe antes de tentar alterar seu conteúdo
if (spanElement) {
spanElement.innerHTML = `
<span style="color:#4444F2;font-family:Palatino Linotype">
<b><u>Eduardo <span style="color:#000000">G.</span></u></b>
`;
}
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
}
}
function setUserDropdownMenu() {
const dropdown = document.createElement('div');
const user = document.getElementById('pt-userpage');
dropdown.classList.add('dropdown');
dropdown.style.display = 'none';
dropdown.style.boxShadow = '0px 4px 8px rgba(0, 0, 0, 0.1)';
dropdown.innerHTML = `
<a href="https://pt.wikipedia.org/wiki/Usuário Discussão:Eduardo Gottert">Discussão</a>
<a href="https://pt.wikipedia.org/w/index.php?title=Especial:Contribuições/Eduardo Gottert&target=Eduardo Gottert&offset=&limit=100">Contribuições</a>
<a href="https://xtools.wmcloud.org/ec/pt.wikipedia.org/Eduardo Gottert">XTools Edits</a>
<a href="https://pt.wikipedia.org/wiki/Usuário:Eduardo Gottert/Testes">Pág. Testes</a>
<a href="https://pt.wikipedia.org/wiki/Especial:P%C3%A1ginas_vigiadas?hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&limit=50&days=30&enhanced=1&urlversion=2">Watchlist</a>`;
user.appendChild(dropdown);
user.addEventListener('mouseenter', () => {
dropdown.style.display = 'block'; // Show dropdown
});
user.addEventListener('mouseleave', () => {
dropdown.style.display = 'none'; // Hide dropdown
});
}
function removeTestsFromNavbar() {
const itemToRemove = document.getElementById('pt-sandbox');
if (itemToRemove) {
itemToRemove.remove(); // Remove the item from the DOM
}
}
function beautifyNavbar() {
const itemsToRemove = ['pt-preferences', 'pt-betafeatures', 'pt-darkmode', 'pt-mytalk', 'pt-watchlist', 'pt-logout'];
for (let item of itemsToRemove) {
const _item = document.getElementById(item);
if (_item) {
_item.remove();
}
}
const menuList = document.querySelector('.vector-menu-content-list');
// Create an image element as the menu icon
const img = document.createElement('img');
img.src = 'https://cdn-icons-png.flaticon.com/512/2893/2893421.png';
img.alt = 'Configurações';
img.width = 24;
img.height = 24;
img.style.cursor = 'pointer';
img.style.paddingBottom = '6px';
// Create a new list item to hold the dropdown menu
const newMenuItem = document.createElement('li');
newMenuItem.style.position = 'relative'; // Ensure dropdown is positioned relative to this element
// Create the dropdown container
const dropdown = document.createElement('div');
dropdown.classList.add('dropdown');
dropdown.style.display = 'none'; // Initially hidden
dropdown.style.top = '32px'; // Position below the icon (24px height + some padding)
dropdown.style.right = '0'; // Align dropdown to the right edge of newMenuItem to open leftwards
dropdown.style.boxShadow = '0px 4px 8px rgba(0, 0, 0, 0.1)';
dropdown.innerHTML = `
<ul style="list-style-type: none; margin: 0; padding: 0; font-size: 16px; background-color: #f9f9f9; text-align: center">
<li id="pt-preferences"><a href="https://pt.wikipedia.org/wiki/Especial:Preferências">Preferências</a></li>
<li id="pt-betafeatures"><a href="https://pt.wikipedia.org/wiki/Especial:Preferências#mw-prefsection-betafeatures">Beta</a></li>
<li> ⠀ ⠀ ⠀ ⠀ ⠀</li>
<li id="pt-logout"><a href="https://pt.wikipedia.org/w/index.php?title=Especial:Sair&returnto=Usu%C3%A1rio%3AEduardo Gottert%2Fcommon.js&returntoquery=action%3Dedit">Sair</a></li></ul>`;
// Append the dropdown and image to the new menu item
newMenuItem.appendChild(img);
newMenuItem.appendChild(dropdown);
// Toggle dropdown visibility on click
img.addEventListener('mouseenter', function(event) {
event.stopPropagation(); // Prevent click from affecting other elements
dropdown.style.display = dropdown.style.display === 'block' ? 'none' : 'block';
});
// Hide dropdown when mouse leaves the img or dropdown
const handleMouseLeave = function() {
dropdown.style.display = 'none';
};
newMenuItem.addEventListener('mouseleave', handleMouseLeave);
dropdown.addEventListener('mouseleave', handleMouseLeave);
// Append the new menu item to the menu list
menuList.appendChild(newMenuItem);
}
function openModal() {
const modalHtml = `
<div id="incidentModal" style="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.2); display: flex; justify-content: center; align-items: center; z-index: 1000;">
<div style="background-color: white; padding: 10px; border: 1px solid #a2a9b1; border-radius: 3px; width: 600px; max-width: 90%; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); background:#fefefe; margin-right:10px;">
<h3 style="margin-top: 0; font-size: 16px; font-weight: normal; color: #222222; border:1px solid gray; border-radius:10px; text-align:center; background:#d8d8d8">Notificar Incidente</h3>
<label for="name" style="font-size: 14px; color: #555; display: block; margin-bottom: 5px;">Nome:</label>
<input type="text" id="name" placeholder="Nome" style="width: 100%; margin-bottom: 10px; padding: 5px; font-size: 14px; border: 1px solid #a2a9b1; border-radius: 3px;">
<label for="reason" style="font-size: 14px; color: #555; display: block; margin-bottom: 5px;">Razão:</label>
<textarea id="reason" placeholder="Razão" style="width: 100%; margin-bottom: 10px; padding: 5px; font-size: 14px; border: 1px solid #a2a9b1; border-radius: 3px; height: 240px;"></textarea>
<label for="vandal" style="font-size: 14px; color: #555; display: block; margin-bottom: 5px; float:left">Vandalismo: </label>
<input type="checkbox" id="vandal" style="margin-bottom: 10px; padding: 5px; font-size: 16px; border: 1px solid #a2a9b1; border-radius: 3px; text-align:center">
<div style="text-align: right; margin-top: 15px;">
<button onclick="submitIncident()" style="background-color: #f0f0f0; color: #222; border: 1px solid #a2a9b1; padding: 5px 10px; border-radius: 3px; cursor: pointer; font-size: 14px; margin-right: 5px;">Enviar</button>
<button onclick="closeModal()" style="background-color: #f0f0f0; color: #222; border: 1px solid #a2a9b1; padding: 5px 10px; border-radius: 3px; cursor: pointer; font-size: 14px;">Fechar</button>
</div>
</div>
</div>
<style>
/* Fixing the focus border color for input */
#incidentModal input[type="text"]:focus, #incidentModal textarea:focus {
border-color: #005a9c;
outline: none;
}
/* Adding padding and box-sizing to avoid inputs touching the edges */
#incidentModal input[type="text"], #incidentModal textarea {
box-sizing: border-box; /* Ensures padding is included in the width calculation */
}
/* Hover effect for buttons */
#incidentModal button:hover {
background-color: #e5e5e5;
}
</style>
`;
document.body.insertAdjacentHTML('beforeend', modalHtml);
}
// Function to submit the incident and open the link
function submitIncident() {
const name = document.getElementById('name').value;
const reason = document.getElementById('reason').value;
const checkbox = document.getElementById('vandal');
const type = checkbox.checked ? "NV" : "NI";
let url = '';
if (name && reason) {
if (type == "NV") {
url = `https://pt.wikipedia.org/w/index.php?title=Wikipédia:Pedidos/Notificações_de_vandalismo&action=edit§ion=new&preload=Usuário:Eduardo_Gottert/NI&preloadparams%5b%5d=${encodeURIComponent(name)}&preloadparams%5b%5d=${encodeURIComponent(reason)}&preloadparams%5b%5d=%7e%7e%7e%7e`;
} else {
url = `https://pt.wikipedia.org/w/index.php?title=Wikipédia:Pedidos/Notificação_de_incidentes&action=edit§ion=new&preload=Usuário:Eduardo_Gottert/NI&preloadparams%5b%5d=${encodeURIComponent(name)}&preloadparams%5b%5d=${encodeURIComponent(reason)}&preloadparams%5b%5d=%7e%7e%7e%7e`;
}
window.open(url, '_blank'); // Open the URL in a new tab
closeModal(); // Close the modal
} else {
alert("Por favor, preencha todos os campos.");
}
}
// Function to close the modal
function closeModal() {
const modal = document.getElementById('incidentModal');
if (modal) {
modal.remove();
}
}
// Function to create the button and dropdown
function createCommunityButton() {
const menuList = document.querySelector('.vector-menu-content-list');
// Create an image element as the menu icon
const img = document.createElement('img');
img.src = 'https://www.freeiconspng.com/thumbs/community-icon/community-icon-6.png';
img.alt = 'Comunidade & Votações';
img.width = 24;
img.height = 24;
img.style.cursor = 'pointer';
img.style.paddingBottom = '6px';
// Create a new list item to hold the dropdown menu
const newMenuItem = document.createElement('li');
newMenuItem.style.position = 'relative'; // Ensure dropdown is positioned relative to this element
// Create the dropdown container
const dropdown = document.createElement('div');
dropdown.classList.add('dropdown');
dropdown.style.display = 'none'; // Initially hidden
dropdown.style.top = '32px'; // Position below the icon (24px height + some padding)
dropdown.style.right = '0'; // Align dropdown to the right edge of newMenuItem to open leftwards
dropdown.style.boxShadow = '0px 4px 8px rgba(0, 0, 0, 0.1)';
dropdown.style.width = '150px';
dropdown.innerHTML = `
<ul style="list-style-type: none; margin: 0; padding: 0; font-size: 16px; background-color: #f9f9f9; text-align: center">
<li>
<a href="https://pt.wikipedia.org/wiki/Wikipédia:Esplanada" alt="Clique para acessar WP:E">Esplanada</a>
<a style="font-size:11px" href="https://pt.wikipedia.org/wiki/Wikipédia:Esplanada/geral" alt="Clique para acessar WP:E/geral">(ger)</a>
<a style="font-size:11px" href="https://pt.wikipedia.org/wiki/Wikipédia:Esplanada/propostas" alt="Clique para acessar WP:E/propostas">(prop)</a>
<li></li>
<li><a href="https://pt.wikipedia.org/wiki/Categoria:!Itens_propostos_para_eliminação" alt="Clique aqui">Propostas de Eliminação</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Especial:Categorias_de_rastreamento" alt="Clique aqui">Cat. Rastreamento</a></li>
<li><a href="https://pt.wikipedia.org/wiki/Wikipédia:Pedidos_a_administradores/Discussão_de_bloqueio" alt="Clque para acessar as DBL">Disc. Bloqueios</a></li>
<li>
<a href="https://pt.wikipedia.org/wiki/Wikipédia:Pedidos/Notificação_de_incidentes" alt="Clique aqui">Notif. Incidentes</a>
<span>/</span>
<a href="https://pt.wikipedia.org/wiki/Wikipédia:Pedidos/Notificações_de_vandalismo" alt="Clique aqui">NV</a>
<a href="#" onclick="openModal()" alt="Clique para adicionar um incidente">(+)</a>
</li>
<li><a href="https://pt.wikipedia.org/wiki/Ajuda:Tire_suas_dúvidas" alt="Clique aqui">Tire suas Dúvidas</a></li>
<li><a href="https://pt.wikipedia.org/w/index.php?title=Especial:Registro_de_abusos" alt="Clique aqui">Registros do Filtro</a></li>
<li>
<a href="https://pt.wikipedia.org/wiki/WP:CS">Adm</a>
<a href="https://pt.wikipedia.org/wiki/WP:CE">Elim</a>
<a href="https://pt.wikipedia.org/wiki/WP:CP">Prog</a>
</li>
<li>
<a href="https://pt.wikipedia.org/wiki/WP:CC">Cat</a>
<a href="https://pt.wikipedia.org/wiki/WP:CT">Trad</a>
<a href="https://pt.wikipedia.org/wiki/WP:CB">Buro</a>
</li>
</ul>`;
// Append the dropdown and image to the new menu item
newMenuItem.appendChild(img);
newMenuItem.appendChild(dropdown);
// Toggle dropdown visibility on click
img.addEventListener('mouseenter', function(event) {
event.stopPropagation(); // Prevent click from affecting other elements
dropdown.style.display = dropdown.style.display === 'block' ? 'none' : 'block';
});
// Hide dropdown when mouse leaves the img or dropdown
const handleMouseLeave = function() {
dropdown.style.display = 'none';
};
newMenuItem.addEventListener('mouseleave', handleMouseLeave);
dropdown.addEventListener('mouseleave', handleMouseLeave);
// Insert the new menu item as the penultimate item
const lastMenuItem = menuList.lastElementChild;
menuList.insertBefore(newMenuItem, lastMenuItem);
}
getEdits();
setUserDropdownMenu();
removeTestsFromNavbar();
beautifyNavbar();
createCommunityButton();
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
// Check for added nodes
mutation.addedNodes.forEach((node) => {
if (node.id === 'pt-darkmode') {
// If the dark mode button is added, remove it
node.remove();
}
});
});
});
// Start observing the document body for child list changes
observer.observe(document.body, {
childList: true,
subtree: true
});