diff --git a/src/server/scripts/trump-backfill.ts b/src/server/scripts/trump-backfill.ts index 32c1e0b..9899292 100644 --- a/src/server/scripts/trump-backfill.ts +++ b/src/server/scripts/trump-backfill.ts @@ -12,11 +12,13 @@ const { values: args } = parseArgs({ options: { 'from-block': { type: 'string', default: '20600000' }, // ≈ Sep 2024, vor den ersten WLFI-Treasury-Käufen 'truth-pages': { type: 'string', default: '300' }, + 'skip-onchain': { type: 'boolean', default: false }, // für Re-Runs nach Truth-Abbruch (Inserts sind idempotent) }, }); // ── On-chain ── const fromBlock = Number(args['from-block']); +if (!args['skip-onchain']) { const head = await getBlockNumber(); console.log(`On-chain-Scan Block ${fromBlock} → ${head} (${head - fromBlock} Blöcke, ~${Math.ceil((head - fromBlock) / 5000)} Requests)`); let onchainCount = 0; @@ -43,6 +45,7 @@ for (let from = fromBlock; from <= head; from += STEP) { await Bun.sleep(150); } console.log(`On-chain: ${onchainCount} Events`); +} // ── Truth (best effort, letzte N Archiv-Seiten à 10 Posts) ── // Markup verifiziert 2026-06-12: Seite hat 10 Posts, je ein
(exakt). @@ -68,10 +71,23 @@ function parseEasternTime(s: string): number { const offsetH = m ? Number(m[1]) : -5; return utcGuess - offsetH * 3600_000; // ET 9:49 PM = UTC 9:49 PM − (−4h) = 01:49 nächster Tag } +/** Seiten-Fetch mit 3 Versuchen (Timeouts/Netzfehler dürfen den Scan nicht crashen). */ +async function fetchPage(p: number): Promise { + for (let attempt = 1; attempt <= 3; attempt++) { + try { + const res = await fetch(`https://trumpstruth.org/?page=${p}`, { signal: AbortSignal.timeout(20_000) }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + return await res.text(); + } catch (err) { + console.warn(`Seite ${p}, Versuch ${attempt}/3 fehlgeschlagen:`, err instanceof Error ? err.message : err); + await Bun.sleep(2000 * attempt); + } + } + return null; +} for (let p = 1; p <= pages; p++) { - const res = await fetch(`https://trumpstruth.org/?page=${p}`, { signal: AbortSignal.timeout(20_000) }); - if (!res.ok) { console.warn(`Seite ${p}: HTTP ${res.status} — Truth-Scan endet hier`); break; } - const html = await res.text(); + const html = await fetchPage(p); + if (html === null) { console.warn(`Seite ${p}: dauerhaft nicht erreichbar — Truth-Scan endet hier (best effort)`); break; } // Split auf exaktes class="status" (nicht \b) — gibt genau 10 Post-Blöcke je Seite. // Vorsicht: class="status\b würde auch status__header, status__body etc. treffen (138 statt 10). const blocks = html.split(/class="status"/).slice(1);