// ==UserScript== // @name MZ - Training Report Checker // @namespace douglaskampl // @version 2.1 // @description Checks training report status and visually indicate readiness on a daily basis (except for saturdays) // @author Douglas // @match https://www.managerzone.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=managerzone.com // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const CONFIG = { START_HOUR: 19, START_MINUTE: 1, END_HOUR: 23, END_MINUTE: 59, CHECK_INTERVAL: 300000, // 5 minutes in milliseconds TIMEZONE_OFFSET: -3 // Brazil timezone (can be adjusted) }; const DAY_MAP = { 0: 1, // Sunday 1: 2, // Monday 2: 3, // Tuesday 3: 4, // Wednesday 4: 5, // Thursday 5: 6, // Friday 6: null // Saturday }; class TrainingReportChecker { constructor() { this.linkId = 'shortcut_link_trainingreport'; } getBrazilianDate() { const date = new Date(); const utc = date.getTime() + (date.getTimezoneOffset() * 60000); const brazilTime = new Date(utc + (3600000 * CONFIG.TIMEZONE_OFFSET)); return brazilTime.toISOString().slice(0, 10); } getBrazilianTime() { const date = new Date(); const utc = date.getTime() + (date.getTimezoneOffset() * 60000); return new Date(utc + (3600000 * CONFIG.TIMEZONE_OFFSET)); } isWithinCheckWindow() { const now = this.getBrazilianTime(); const hour = now.getHours(); const minute = now.getMinutes(); const startTime = hour * 60 + minute; const checkStartTime = CONFIG.START_HOUR * 60 + CONFIG.START_MINUTE; const checkEndTime = CONFIG.END_HOUR * 60 + CONFIG.END_MINUTE; return startTime >= checkStartTime && startTime <= checkEndTime; } addTrainingReportLink() { const targetDiv = document.getElementById('pt-wrapper'); if (!targetDiv) { console.log('Target div not found.'); return; } const link = document.createElement('a'); link.id = this.linkId; link.title = 'Training Report'; link.href = '/?p=training_report'; link.innerHTML = '| '; targetDiv.appendChild(link); } isReportReady(table) { return Array.from(table.querySelectorAll('tr')) .some(row => row.querySelector('img[src*="training_camp.png"]')); } markReportAsChecked() { const today = this.getBrazilianDate(); localStorage.setItem('reportCheckedDate', today); document.getElementById(this.linkId).style.color = 'green'; } hasReportBeenCheckedToday() { const today = this.getBrazilianDate(); return localStorage.getItem('reportCheckedDate') === today; } async checkTrainingReport() { const today = new Date(); const dayIndex = DAY_MAP[today.getDay()]; if (!dayIndex) { console.log('No check needed: It is Saturday.'); return; } if (!this.isWithinCheckWindow()) { console.log('Outside check window (19:01-23:59).'); return; } if (this.hasReportBeenCheckedToday()) { console.log('Training report already checked today.'); document.getElementById(this.linkId).style.color = 'green'; return; } try { const response = await fetch( `https://www.managerzone.com/ajax.php?p=trainingReport&sub=daily&sport=soccer&day=${dayIndex}&sort_order=desc&sort_key=modification&player_sort=all` ); const text = await response.text(); const parser = new DOMParser(); const doc = parser.parseFromString(text, "text/html"); const table = doc.querySelector("body > table:nth-child(3)"); if (table && this.isReportReady(table)) { console.log('Report is ready.'); this.markReportAsChecked(); } else if (this.isWithinCheckWindow()) { console.log('No report yet. Will check again in 5 minutes.'); setTimeout(() => this.checkTrainingReport(), CONFIG.CHECK_INTERVAL); } } catch (error) { console.error('Error fetching training report:', error); } } init() { const sport = new URL(document.querySelector("#shortcut_link_thezone").href) .searchParams.get("sport"); if (sport !== "soccer") { console.log('Script not running: sport is not soccer.'); return; } this.addTrainingReportLink(); this.checkTrainingReport(); } } const checker = new TrainingReportChecker(); checker.init(); })();