// ==UserScript== // @name jakubryzyk // @namespace http://tampermonkey.net/ // @version 3.2 // @description stake larp // @author ryzu // @match *://*.stake.jp/* // @grant GM_xmlhttpRequest // @connect api.exchangerate-api.com // @run-at document-idle // @license MIT // @downloadURL none // ==/UserScript== (function () { 'use strict'; let plnToArs = 1354.22; let detectedCurrency = 'LTC'; function fetchPlnToArs() { GM_xmlhttpRequest({ method: "GET", url: "https://api.exchangerate-api.com/v4/latest/PLN", onload: function (response) { try { const data = JSON.parse(response.responseText); if (data && data.rates && data.rates.ARS) { plnToArs = data.rates.ARS; console.log(`[LARP] PLN→ARS rate updated: ${plnToArs}`); } } catch (e) { console.error("[LARP] Failed to parse PLN->ARS rate:", e); } }, onerror: function (e) { console.error("[LARP] PLN->ARS fetch error:", e); } }); } setInterval(fetchPlnToArs, 300000); fetchPlnToArs(); const fakePLNsvg = ``; function isPLNsvg(s) { const h = s.outerHTML; if (/PLN/i.test(h)) return true; if (h.includes('m27.8 62.4-1.24-5.08') || h.includes('M53.36 62.4')) return true; if (h.includes('#FFC800') && h.includes('#276304')) return true; const paths = s.querySelectorAll('path'); for (const x of paths) { const d = x.getAttribute('d') || ''; if (d.includes('27.8 62.4') || d.includes('53.36 62.4')) return true; } return false; } function replacePLNtext() { document.querySelectorAll('*:not(script):not(style)').forEach(el => { el.childNodes.forEach(n => { if (n.nodeType === 3 && n.nodeValue.includes('ARS')) { n.nodeValue = n.nodeValue.replace(/ARS/g, 'PLN'); } }); }); } function replacePLNimages() { document.querySelectorAll('img').forEach(i => { if (!i.dataset.larped && /ARS/i.test(i.alt + i.title + i.src)) { i.dataset.larped = '1'; const w = document.createElement('div'); w.innerHTML = fakePLNsvg; i.replaceWith(w.firstChild); } }); } function replacePLNsvgs() { document.querySelectorAll('svg').forEach(s => { if (!s.dataset.larped && isPLNsvg(s)) { s.dataset.larped = '1'; const w = document.createElement('div'); w.innerHTML = fakePLNsvg; const ns = w.firstChild; ns.dataset.larped = '1'; try { if (s.getAttribute('class')) ns.setAttribute('class', s.getAttribute('class')); if (s.style.cssText) ns.style.cssText = s.style.cssText; } catch (e) {} s.replaceWith(ns); } }); } function detectCurrency() { const possibleTexts = []; document.querySelectorAll('button, span, div').forEach(el => { const txt = el.textContent.trim(); if (/^\d+(\.\d+)?\s+(LTC|USDT)$/i.test(txt)) { possibleTexts.push(txt); } }); for (const t of possibleTexts) { if (t.includes('USDT')) return 'USDT'; if (t.includes('LTC')) return 'LTC'; } return 'LTC'; } function modifyCurrencyDisplay() { detectedCurrency = detectCurrency(); const currencyRegex = detectedCurrency === 'LTC' ? /\b(\d*\.?\d+)\s*LTC\b/i : /\b(\d*\.?\d+)\s*USDT\b/i; document.querySelectorAll('*:not(script):not(style)').forEach(el => { if (el.dataset.currencyModified === detectedCurrency) return; let modified = false; el.childNodes.forEach(n => { if (n.nodeType === 3) { const match = currencyRegex.exec(n.nodeValue); if (match) { const oldVal = parseFloat(match[1]); if (!isNaN(oldVal)) { let newText; if (detectedCurrency === 'LTC') { const newVal = (oldVal * plnToArs).toFixed(6); newText = `${newVal} LTC`; } else { newText = `${oldVal.toFixed(2)} USDT`; } n.nodeValue = n.nodeValue.replace(currencyRegex, newText); modified = true; } } } }); if (modified) { el.dataset.currencyModified = detectedCurrency; } }); } function overrideUSDTPreview() { if (detectedCurrency !== 'USDT') return; const betInput = document.querySelector('input[type="number"]'); const previewSpan = document.querySelector('div[data-testid="conversion-amount"]'); if (betInput && previewSpan) { const val = parseFloat(betInput.value); if (!isNaN(val)) { previewSpan.textContent = `${val.toFixed(2)} USDT`; } } } function mainLoop() { try { replacePLNtext(); replacePLNimages(); replacePLNsvgs(); modifyCurrencyDisplay(); overrideUSDTPreview(); } catch (e) { console.error('[LARP] error:', e); } requestAnimationFrame(mainLoop); } requestAnimationFrame(mainLoop); })();