您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Calculate and display net cost of padel matches in the header
// ==UserScript== // @name Padel Net Cost Calculator // @namespace http://tampermonkey.net/ // @version 0.1 // @description Calculate and display net cost of padel matches in the header // @author You // @match *://*.ballejaune.com/account* // @license MIT // @grant none // ==/UserScript== (function() { 'use strict'; // Function to calculate net cost from reservation history function calculateNetCost() { const rows = document.querySelectorAll('tr[data-rowid]'); let valid_reservations = 0 let friends_paied_for = 0 rows.forEach(row => { const badge = row.querySelector('div.badge'); const originTd = row.querySelector('td:nth-child(3)'); if (badge && originTd) { const text = badge.textContent.trim(); const match = text.match(/([+-]\s*\d+)/); if (match) { const K_str = match[1].replace(/\s+/g, ''); // e.g., "- 1" -> "-1" const K = parseInt(K_str); if (!isNaN(K) && K !== 100) { // Exclude initial +100 purchase const originText = originTd.innerHTML.trim(); // Reservation for yourself if (originText.includes('Réservation') && K < 0) { valid_reservations++ } // Cancellation else if (originText.includes('Réservation') && K > 0) { valid_reservations-- } // Paying for friends else if (originText.includes('Club')) { friends_paied_for -= K } } } } }); const totalNetCost = valid_reservations * 15 - friends_paied_for * 5 return totalNetCost } // Function to inject net cost into the header function injectNetCost(netCost) { const menu = document.querySelector('ul#widget-menu'); if (menu) { const net_cost_item_refreach = document.querySelector('#widget-netcost span'); if (net_cost_item_refreach){ net_cost_item_refreach.textContent = `Net Cost: ${netCost} dt`; }else{ const netCostItem = document.createElement('li'); netCostItem.className = 'navbar-widget-nav-line'; netCostItem.id = 'widget-netcost'; const netCostLink = document.createElement('a'); netCostLink.className = 'navbar-widget-nav-link'; netCostLink.href = '#'; // Non-clickable link netCostLink.setAttribute('data-container', '#main-tooltips'); netCostLink.setAttribute('data-placement', 'bottom'); netCostLink.setAttribute('data-delay', '500'); netCostLink.setAttribute('title', 'Net Cost'); netCostLink.style.color = '#fff'; // Match navbar text color netCostLink.style.cursor = 'default'; // Indicate non-interactive const netCostText = document.createElement('span'); netCostText.textContent = `Net Cost: ${netCost} dt`; netCostLink.appendChild(netCostText); netCostItem.appendChild(netCostLink); menu.insertBefore(netCostItem, menu.firstChild); } console.log(netCost); } else { console.error('Widget menu not found!'); } } // Wait for the page to fully load window.addEventListener('load', function() { setInterval(()=>{ const netCost = calculateNetCost(); injectNetCost(netCost)}, 5000) }); })();