130 lines
4.2 KiB
JavaScript
130 lines
4.2 KiB
JavaScript
/* 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") +
|
|
' · <a href="' + BANK_INTRO + '">bank.hacktivism.ch</a>';
|
|
}
|
|
}
|
|
|
|
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: <a href="' + BANK_INTRO + '">bank.hacktivism.ch</a>' +
|
|
(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();
|
|
}
|
|
})();
|