diff --git a/apps/web/public/miners/boomer-heater.svg b/apps/web/public/miners/boomer-heater.svg index 4bb0542..ec62e46 100644 --- a/apps/web/public/miners/boomer-heater.svg +++ b/apps/web/public/miners/boomer-heater.svg @@ -6,7 +6,7 @@ - NO HASHES. JUST GAY. + NO HASHES. JUST GHEI. diff --git a/apps/web/src/components/MinerCard.vue b/apps/web/src/components/MinerCard.vue index 4e68a2f..2592675 100644 --- a/apps/web/src/components/MinerCard.vue +++ b/apps/web/src/components/MinerCard.vue @@ -5,6 +5,8 @@ import { ROASTS, STATUS_LINES, STALE_LINES } from "../strings"; const props = defineProps<{ miner: MinerStat; bestWork: number | undefined }>(); +const isBoomerHeater = computed(() => props.miner.nickname === "Boomer Heater"); + const slug = computed(() => { // Map nickname → roast key const map: Record = { @@ -16,10 +18,15 @@ const slug = computed(() => { return map[props.miner.nickname] ?? "unknown"; }); -const roast = computed(() => ROASTS[slug.value] ?? ROASTS["unknown"]); +const roast = computed(() => + isBoomerHeater.value ? "The dumb shit your fiat friends have." : (ROASTS[slug.value] ?? ROASTS["unknown"]), +); const statusLabel = computed(() => STATUS_LINES[props.miner.status]); +const displayStatusLabel = computed(() => isBoomerHeater.value ? "dead" : statusLabel.value); +const statusMarker = computed(() => isBoomerHeater.value ? "☠" : ""); const statusGlow = computed(() => { + if (isBoomerHeater.value) return "glow-red"; switch (props.miner.status) { case "hashing": return "glow-green"; case "stale": return "glow-amber"; @@ -28,6 +35,7 @@ const statusGlow = computed(() => { }); const lastShareLabel = computed(() => { + if (isBoomerHeater.value) return "Nothing"; const s = props.miner.lastShareAgeS; if (s === null) return "no shares yet"; if (s < 60) return `${s.toFixed(0)}s ago`; @@ -36,10 +44,14 @@ const lastShareLabel = computed(() => { }); const lifetimeShares = computed(() => props.miner.diffAcceptedCount); -const acceptedWork = computed(() => formatBig(props.miner.diffAcceptedSum)); -const bestWork = computed(() => props.bestWork && props.bestWork > 0 ? formatBig(props.bestWork) : "collecting"); +const acceptedWork = computed(() => isBoomerHeater.value ? "Zero. Obviously." : formatBig(props.miner.diffAcceptedSum)); +const bestWork = computed(() => { + if (isBoomerHeater.value) return "Fuck all"; + return props.bestWork && props.bestWork > 0 ? formatBig(props.bestWork) : "collecting"; +}); const staleNote = computed(() => { + if (isBoomerHeater.value) return "warming a room while contributing nothing to civilization."; if (props.miner.status !== "stale") return ""; const idx = Math.floor(Math.random() * STALE_LINES.length); return STALE_LINES[idx]; @@ -59,8 +71,9 @@ function formatBig(n: number): string {
{{ miner.nickname }}
- - {{ statusLabel }} + {{ statusMarker }} + + {{ displayStatusLabel }}
@@ -71,7 +84,7 @@ function formatBig(n: number): string {
hashrate
- {{ miner.hashrateThs.toFixed(2) }} + {{ isBoomerHeater ? "No hashes" : miner.hashrateThs.toFixed(2) }} Th/s
@@ -81,7 +94,7 @@ function formatBig(n: number): string {
tickets bought
-
{{ lifetimeShares.toLocaleString() }}
+
{{ isBoomerHeater ? "None" : lifetimeShares.toLocaleString() }}
best calc
@@ -94,12 +107,12 @@ function formatBig(n: number): string {
reject %
- {{ miner.rejectPct.toFixed(2) }}% + {{ isBoomerHeater ? "not even rejected" : `${miner.rejectPct.toFixed(2)}%` }}
vdiff
-
{{ miner.vdiff.toLocaleString() }}
+
{{ isBoomerHeater ? "Fiat" : miner.vdiff.toLocaleString() }}
@@ -108,7 +121,7 @@ function formatBig(n: number): string { @{{ miner.location }} -
+
{{ staleNote }}
@@ -157,6 +170,11 @@ header { background: currentColor; box-shadow: 0 0 8px currentColor; } +.dead-mark { + font-size: 13px; + line-height: 1; + text-shadow: 0 0 8px currentColor; +} .model { font-size: 12px; color: var(--fg-1);