Phone-run fixes: hash tokens, embed wakes on tab focus, dry faucet leaves drips due (+admin retry), short drip status, claim box wraps; one drip per wallet per mission
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+10
-7
@@ -10,8 +10,9 @@
|
||||
(function () {
|
||||
var API = 'https://polhunter.com';
|
||||
try {
|
||||
var q = new URLSearchParams(location.search), t = q.get('ph');
|
||||
if (t) { sessionStorage.setItem('ph.token', t); q.delete('ph'); history.replaceState(null, '', location.pathname + (q.toString() ? '?' + q : '') + location.hash); }
|
||||
// the token arrives in the hash (#ph=) or, for older links, the query (?ph=); it is kept for this tab
|
||||
var h = new URLSearchParams((location.hash || '').replace(/^#/, '')), q = new URLSearchParams(location.search), t = h.get('ph') || q.get('ph');
|
||||
if (t) { sessionStorage.setItem('ph.token', t); h.delete('ph'); q.delete('ph'); history.replaceState(null, '', location.pathname + (q.toString() ? '?' + q : '') + (h.toString() ? '#' + h : '')); }
|
||||
t = sessionStorage.getItem('ph.token'); if (!t) return;
|
||||
} catch (e) { return; }
|
||||
// slots: explicit [data-ph-slot="i"] elements, or the i-th match of data-selector (e.g. ".video-card"
|
||||
@@ -30,14 +31,16 @@
|
||||
box.innerHTML = '<span style="width:22px;height:22px;border-radius:50%;background:radial-gradient(circle at 35% 35%,#c9a4ff,#8247e5 60%,#4b2a8c);box-shadow:0 0 14px rgba(130,71,229,.9);flex:none"></span><span>PolHunter code <b style="font-family:ui-monospace,Menlo,monospace;font-size:16px;letter-spacing:.14em;color:#f3be43">' + code + '</b></span>';
|
||||
el.appendChild(box);
|
||||
}
|
||||
var tries = 0;
|
||||
var tries = 0, pending = null, done = false;
|
||||
// phones freeze a background tab's timers: when the hunter comes back to this tab, ask right away
|
||||
document.addEventListener('visibilitychange', function () { if (document.visibilityState === 'visible' && !done) { clearTimeout(pending); ask(); } });
|
||||
function ask() {
|
||||
tries++; if (tries > 40) return;
|
||||
tries++; if (tries > 80 || done) return;
|
||||
fetch(API + '/api/embed/code?t=' + encodeURIComponent(t), { mode: 'cors', credentials: 'omit' }).then(function (r) { return r.json(); }).then(function (r) {
|
||||
if (r && r.code) { render(r.code, Number(r.slot) % slots); try { sessionStorage.removeItem('ph.token'); } catch (e) {} return; }
|
||||
if (r && r.wait) { setTimeout(ask, Math.min(r.wait, 10) * 1000); return; }
|
||||
if (r && r.code) { done = true; render(r.code, Number(r.slot) % slots); try { sessionStorage.removeItem('ph.token'); } catch (e) {} return; }
|
||||
if (r && r.wait) { pending = setTimeout(ask, Math.min(r.wait, 5) * 1000); return; }
|
||||
// expired / gone / wrong origin: say nothing
|
||||
}).catch(function () { setTimeout(ask, 8000); });
|
||||
}).catch(function () { pending = setTimeout(ask, 6000); });
|
||||
}
|
||||
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', ask); else ask();
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user