/* Load GOA flow stats from bank landing stats.json (CORS on bank). */ (function () { var STATS_URL = "https://bank.hacktivism.ch/intro/stats.json"; var BANK_INTRO = "https://bank.hacktivism.ch/intro/"; function fmtCest(unix, fallback) { var base = ""; if (fallback) { base = String(fallback).replace(/\s*(CEST|CET|UTC|Z)\s*$/i, "").trim(); } else if (unix != null && unix !== "") { try { base = new Intl.DateTimeFormat("de-CH", { timeZone: "Europe/Zurich", year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", hour12: false }).format(new Date(Number(unix) * 1000)); } catch (e) { base = ""; } } return base ? base + " Europe/Zurich" : ""; } function set(id, v) { var el = document.getElementById(id); if (el) el.textContent = v == null || v === "" ? "—" : String(v); } function showFallback(msg) { var box = document.getElementById("stats"); var foot = document.getElementById("st-foot"); if (box) box.hidden = false; if (foot) { foot.hidden = false; foot.className = "stats-foot err"; foot.innerHTML = (msg || "Stats offline") + ' · bank.hacktivism.ch'; } } function loadStats() { var box = document.getElementById("stats"); var foot = document.getElementById("st-foot"); if (!box) return; box.hidden = false; // Same-origin first (bank landing), else public bank URL var urls = []; if (location.hostname.indexOf("bank.hacktivism") !== -1) { urls.push("stats.json"); } urls.push(STATS_URL); function tryNext(i) { if (i >= urls.length) { showFallback("No stats"); return; } fetch(urls[i], { cache: "no-store", mode: "cors" }) .then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); }) .then(function (d) { if (!d || !d.ok) throw new Error("bad stats"); var w = d.withdraws || {}; var h24 = w.last_24h || {}; var h7 = w.last_7d || {}; var ba = d.bank_accounts || {}; var wl = d.wallets || {}; var flow = d.flow || {}; var fin = flow.incoming || {}; var fwd = flow.withdraw || {}; set("st-accounts", ba.total != null ? ba.total : "—"); set("st-wallets", wl.unique_reserves != null ? wl.unique_reserves : "—"); set("st-incoming", fin.amount || flow.total_in || "—"); set("st-withdraw", fwd.amount || w.total_amount || "—"); set("st-24h", h24.amount || "GOA:0"); set("st-7d", h7.amount || "GOA:0"); var list = document.getElementById("st-recent"); if (list) { list.innerHTML = ""; var rows = (d.recent_withdraws || []).slice(0, 3); if (!rows.length) { var empty = document.createElement("li"); empty.className = "meta"; empty.textContent = "—"; list.appendChild(empty); } else { rows.forEach(function (row) { var li = document.createElement("li"); var amt = document.createElement("span"); amt.className = "amt"; amt.textContent = row.amount || "?"; var meta = document.createElement("span"); meta.className = "meta"; meta.textContent = fmtCest(row.at_unix, row.at || row.at_iso) || ""; li.appendChild(amt); li.appendChild(meta); list.appendChild(li); }); } } if (foot) { foot.hidden = false; foot.className = "stats-foot"; foot.innerHTML = 'Source: bank.hacktivism.ch' + (d.generated_at_human ? " · " + d.generated_at_human : ""); } }) .catch(function () { tryNext(i + 1); }); } tryNext(0); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", loadStats); } else { loadStats(); } })();