From f1edc0b942ea6087e0c7bc0e8b8ba49b719f8acd Mon Sep 17 00:00:00 2001 From: haunter Date: Fri, 8 Aug 2025 18:35:07 +0000 Subject: [PATCH] Add backup/Grepolis_Data_Sender.user.js --- backup/Grepolis_Data_Sender.user.js | 209 ++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 backup/Grepolis_Data_Sender.user.js diff --git a/backup/Grepolis_Data_Sender.user.js b/backup/Grepolis_Data_Sender.user.js new file mode 100644 index 0000000..de6a11e --- /dev/null +++ b/backup/Grepolis_Data_Sender.user.js @@ -0,0 +1,209 @@ +// ==UserScript== +// @name Grepolis Data Sender (Deep Scan v6.7 β€” Toolbar Pause Button + Soft Refresh & Full Stats) +// @namespace http://tampermonkey.net/ +// @version 6.7 +// @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 +// @updateURL https://git.haunter-pets.top/haunter/grepodata/raw/branch/main/Grepolis_Data_Sender.user.js +// @downloadURL https://git.haunter-pets.top/haunter/grepodata/raw/branch/main/Grepolis_Data_Sender.user.js +// ==/UserScript== + +(function () { + 'use strict'; + + console.log("πŸ’° DeepScan v6.7 loaded β€” Soft refresh + Toolbar pause button + full stats"); + + const uw = typeof unsafeWindow !== "undefined" ? unsafeWindow : window; + let latestBasicPayload = null; + let paused = false; + + // 🧠 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"]; + const isSellTabActive = + document.querySelector("#premium_exchange .gp_page_caption.js-page-caption-1.active") && + document.querySelector("#premium_exchange .gp_tab_page.js-page-1.active"); + + if (!isSellTabActive) { + console.warn("🚫 Sell tab not active β€” skipping gold extraction"); + return null; + } + + const blocks = document.querySelectorAll( + "#premium_exchange .gp_tab_page.js-page-1.active .resources_wrapper .resource" + ); + + blocks.forEach((block, i) => { + const type = resourceTypes[i] || `res_${i}`; + const currentEl = block.querySelector(".progressbar_bg .caption span.current"); + const maxEl = block.querySelector(".progressbar_bg .caption span.max"); + + exchange[type] = { + current: currentEl?.textContent.trim() || "0", + max: maxEl?.textContent.trim() || "0" + }; + }); + + console.log("πŸ“Š Gold Market Sell Tab data:", exchange); + return exchange; + } + + // πŸ“€ 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"; + const player_id = uw.Game?.player_id || "unknown"; + + const stats = Object.values(towns).map(town => { + const res = town.resources(); + const buildings = town.buildings()?.attributes ?? {}; + const marketLevel = typeof town.getMarketplaceLevel === "function" + ? town.getMarketplaceLevel() + : buildings.market || null; + + return { + town_id: town.id, + town_name: town.name, + wood: res.wood, + stone: res.stone, + iron: res.iron, + population: res.population, + points: town.getPoints(), + buildings, + market: { level: marketLevel } + }; + }); + + const goldMarket = scrapeGoldMarketExchange(); + const goldTitle = getGoldMarketTitle(); + + latestBasicPayload = { + type: "basic", + timestamp: new Date().toISOString(), + player, + player_id, + towns: stats, + 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" }, + body: JSON.stringify(latestBasicPayload) + }) + .then(res => res.text()) + .then(txt => console.log("βœ… Data sent:", txt)) + .catch(err => console.error("❌ Failed to send:", err)); + } catch (e) { + console.error("πŸ’₯ Error sending stats:", e); + } + } + + // πŸ›οΈ 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("πŸ•’ Data cycle tick β€” soft refresh + send stats"); + refreshGoldWindow(); + setTimeout(sendBasicStats, 3000); + }, 30000); + } + + window.addEventListener("load", () => { + console.log("πŸš€ DeepScan v6.5 booting up..."); + runDataCycle(); + }); +})();