diff --git a/Grepolis_Data_Sender.user.js b/Grepolis_Data_Sender.user.js index 46f3bb8..fbbda0e 100644 --- a/Grepolis_Data_Sender.user.js +++ b/Grepolis_Data_Sender.user.js @@ -1,8 +1,8 @@ // ==UserScript== -// @name Grepolis Data Sender (Deep Scan v5.2 β€” Gold Sell Tab & Town Snapshot) +// @name Grepolis Data Sender (Deep Scan v6.5 β€” Toolbar Pause Button + Soft Refresh & Full Stats) // @namespace http://tampermonkey.net/ -// @version 5.2 -// @description Sends town stats always, and Premium Exchange gold market from "Sell resources for gold" tab only +// @version 6.5 +// @description Sends town stats, extracts Premium Exchange title, and soft-refreshes tab every 30s via Marketplace building click. Includes pause/resume button in top toolbar. // @author Dimitrios // @match https://*.grepolis.com/game/* // @grant unsafeWindow @@ -13,12 +13,57 @@ (function () { 'use strict'; - console.log("πŸ’° DeepScan v5.2 loaded β€” Town stats always, Premium gold tab if active"); + console.log("πŸ’° DeepScan v6.5 loaded β€” Soft refresh + Toolbar pause button + full stats"); const uw = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; let latestBasicPayload = null; + let paused = false; - // πŸ’± Extract data ONLY from "Sell resources for gold" tab + // 🧠 Toolbar button HTML + const deepScanButtonHtml = + '
' + + '
' + + '

DeepScan

' + + '
'; + + // 🧠 Toggle pause/resume + function toggleDeepScanButton() { + paused = !paused; + + const label = document.getElementById('dslabel'); + const btn = document.getElementById('dsbutton'); + + if (paused) { + label.textContent = 'Paused'; + btn.style.filter = 'brightness(70%) sepia(100%) hue-rotate(-50deg) saturate(1000%) contrast(0.8)'; + } else { + label.textContent = 'DeepScan'; + btn.style.filter = 'brightness(294%) sepia(100%) hue-rotate(15deg) saturate(1000%) contrast(0.8)'; + } + + console.log(`πŸ”˜ DeepScan is now ${paused ? 'paused' : 'running'}`); + } + + // 🧠 Inject button into toolbar + setTimeout(() => { + if (!document.getElementById('dsbutton')) { + uw.$('.tb_activities, .toolbar_activities').find('.middle').append(deepScanButtonHtml); + } + }, 4000); + + uw.$(document).on('click', '#dsbutton', toggleDeepScanButton); + + // πŸ“Œ Extract Premium Exchange title + function getGoldMarketTitle() { + const titleEl = document.querySelector( + ".classic_window.market #premium_exchange .game_border_header .title.exchange_title" + ); + const titleText = titleEl?.textContent.trim() || ""; + console.log("πŸ“Œ Gold Market Title:", titleText); + return titleText; + } + + // πŸ“Š Extract gold market data function scrapeGoldMarketExchange() { const exchange = {}; const resourceTypes = ["wood", "stone", "iron"]; @@ -50,8 +95,13 @@ return exchange; } - // πŸ“¦ Send all town stats β€” always + // πŸ“€ Send town + gold data function sendBasicStats() { + if (paused) { + console.log("⏸️ DeepScan is paused β€” skipping data send"); + return; + } + try { const towns = uw.ITowns?.towns || {}; const player = uw.Game?.player_name || "unknown"; @@ -77,7 +127,8 @@ }; }); - const goldMarket = scrapeGoldMarketExchange(); // may return null + const goldMarket = scrapeGoldMarketExchange(); + const goldTitle = getGoldMarketTitle(); latestBasicPayload = { type: "basic", @@ -85,9 +136,12 @@ player, player_id, towns: stats, - gold_market: goldMarket || {} // always include field + gold_market: goldMarket || {}, + gold_market_title: goldTitle || "" }; + console.log("πŸ“€ Sending payload:", latestBasicPayload); + fetch("https://grepo.haunter-pets.top/api/grepolis-data", { method: "POST", headers: { "Content-Type": "application/json" }, @@ -97,20 +151,59 @@ .then(txt => console.log("βœ… Data sent:", txt)) .catch(err => console.error("❌ Failed to send:", err)); } catch (e) { - console.error("πŸ’₯ Error sending data:", e); + console.error("πŸ’₯ Error sending stats:", e); } } - // ⏱️ Timer: always sends town info; adds gold data only if Sell tab active - function runDataSendInterval() { + // πŸ›οΈ Soft refresh: click building and switch tab + function refreshGoldWindow() { + if (paused) { + console.log("⏸️ DeepScan is paused β€” skipping refresh"); + return; + } + + try { + const marketArea = document.querySelector("area#building_main_area_market"); + if (marketArea) { + marketArea.dispatchEvent(new MouseEvent("click", { bubbles: true })); + console.log("πŸ›οΈ Clicked Marketplace area to trigger Premium Exchange"); + + // Wait 1.5s and switch to Sell tab + setTimeout(() => { + const newWin = Array.from(document.querySelectorAll(".classic_window.market")) + .find(win => win.querySelector("#premium_exchange")); + + if (newWin) { + const sellTab = newWin.querySelector(".gp_page_caption.js-page-caption-1"); + if (sellTab) { + sellTab.click(); + console.log("πŸ” Switched to Premium Exchange Sell tab"); + } else { + console.warn("⚠️ Sell tab not found in window"); + } + } else { + console.warn("❌ Premium Exchange window not found after click"); + } + }, 1500); + } else { + console.warn("❌ Marketplace area not found β€” cannot trigger Premium Exchange"); + } + } catch (err) { + console.error("πŸ’₯ Error in refreshGoldWindow:", err); + } + } + + // πŸ” Main loop + function runDataCycle() { setInterval(() => { - console.log("πŸ•’ Snapshot triggered β€” scanning town and gold sell tab..."); - sendBasicStats(); + console.log("πŸ•’ Data cycle tick β€” soft refresh + send stats"); + refreshGoldWindow(); + setTimeout(sendBasicStats, 3000); }, 30000); } window.addEventListener("load", () => { - console.log("πŸš€ Grepolis page ready β€” DeepScan v5.2 booting..."); - runDataSendInterval(); + console.log("πŸš€ DeepScan v6.5 booting up..."); + runDataCycle(); }); })();