Scripts, scenes, bridges, bots and more

This commit is contained in:
Jakub Zych
2026-04-26 23:08:48 +02:00
parent a34cd5fab7
commit fb5aaed9e7
32 changed files with 2985 additions and 4382 deletions

View File

@@ -17,7 +17,7 @@
--term-fg-bright: #97f99a;
--term-fg-dim: #2c8d2f;
--term-glow: rgba(80, 220, 100, 0.55);
--term-edge: rgba(80, 220, 100, 0.30);
--term-edge: rgba(80, 220, 100, 0.45);
--mono: 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas', monospace;
--display: 'DejaVu Sans', 'Liberation Sans', 'Helvetica', 'Arial', sans-serif;
@@ -58,16 +58,25 @@ body {
.hud > .group:nth-child(2) { justify-self: center; }
.hud > .group:nth-child(3) { justify-self: end; }
.hud .dim { color: var(--hud-dim); }
.hud .group > span { display: inline-flex; align-items: center; gap: 12px; }
.hud .led {
display: inline-block;
width: 11px; height: 11px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 10px var(--accent);
margin-right: 12px;
vertical-align: middle;
/* Small upward nudge: flex centers on line-box mid, but caps-only text
reads centered around cap-height mid which sits a touch higher. */
margin-top: -0.08em;
animation: rec-blink 1.6s ease-in-out infinite;
}
/* The ▮/▯ glyphs in DejaVu Sans Mono are designed centered on x-height,
not cap-height, so against all-caps SIGNAL their visual middle sits low.
Lift by ~(cap-mid x-mid) ≈ 0.10em to put the glyph center on cap center. */
#signal {
display: inline-block;
transform: translateY(-0.10em);
}
@keyframes rec-blink {
0%, 55% { opacity: 1; }
65%, 100% { opacity: 0.2; }
@@ -81,16 +90,17 @@ body {
}
.terminal {
width: 64vw;
max-width: 1500px;
height: 100%;
min-height: 380px;
width: 60vw;
max-width: 1380px;
height: 58vh;
max-height: 740px;
min-height: 400px;
position: relative;
overflow: hidden;
background: var(--term-bg);
border: 1px solid var(--term-edge);
border: 2px solid var(--term-edge);
border-radius: 6px;
padding: 32px 40px;
padding: 28px 36px;
font-family: var(--mono);
font-size: 26px;
line-height: 1.55;
@@ -158,11 +168,15 @@ body {
}
/* ───────── Big countdown ───────── */
/* text-indent compensates for trailing letter-spacing on the last char,
which would otherwise be included in the centered inline box and shift
visible text left by half the letter-spacing value. */
.countdown { text-align: center; }
.countdown .label {
font-family: var(--mono);
font-size: 22px;
letter-spacing: 0.45em;
text-indent: 0.45em;
color: var(--hud-dim);
margin-bottom: 12px;
}
@@ -171,6 +185,7 @@ body {
font-size: 132px;
font-weight: 900;
letter-spacing: 0.10em;
text-indent: 0.10em;
line-height: 1;
color: var(--ink);
text-shadow: 0 0 22px rgba(79, 210, 255, 0.18);
@@ -181,6 +196,7 @@ body {
font-family: var(--mono);
font-size: 22px;
letter-spacing: 0.45em;
text-indent: 0.45em;
color: var(--hud-dim);
}
@keyframes cd-pulse {
@@ -191,6 +207,7 @@ body {
color: var(--term-fg);
text-shadow: 0 0 32px var(--term-glow);
letter-spacing: 0.18em;
text-indent: 0.18em;
}
.countdown.ready .sub { color: var(--term-fg-bright); }
.countdown.ready .label { color: var(--term-fg-dim); }
@@ -301,9 +318,12 @@ body {
<div class="vignette"></div>
<div class="flicker"></div>
<!-- Manifest data written by loading.sh — script-tag-loaded global to dodge CEF file:// fetch CORS -->
<!-- Rig + hardware telemetry written by scripts/telemetry.sh — exposes window.__TEL.rig
for the "detected rig :: …" terminal line below. Same wrapper trick. -->
<script src="../landing/telemetry.js"></script>
<!-- Manifest data written by scripts/loading.sh — script-tag-loaded global to dodge CEF file:// fetch CORS -->
<script src="loading.js"></script>
<!-- Playlist manifest written by playlist.sh — same wrapper trick. Used here
<!-- Playlist manifest written by scripts/playlist.sh — same wrapper trick. Used here
just for the track count in the terminal output; actual playback runs
in the separate Music Daemon source. -->
<script src="playlist.js"></script>
@@ -356,9 +376,10 @@ body {
const cdMin = data.countdownMin ?? 5;
const PROMPT = 'OPHI-118://> ';
const rigName = (window.__TEL?.rig || 'unknown').toUpperCase();
const lines = [
{ kind: 'cmd', text: 'loadproject --manifest' },
{ kind: 'out', text: 'initializing transmission envelope...' },
{ kind: 'out', text: `detected rig :: ${rigName} - initializing transmission...` },
{ kind: 'gap' },
{ kind: 'out', text: `target :: ${upper(data.game) || '—'}` },
...(data.subtitle ? [{ kind: 'out', text: `mode :: ${upper(data.subtitle)}` }] : []),
@@ -450,7 +471,7 @@ body {
let lastTrackIndex = null;
async function connectMusic() {
if (!window.__OBSWS) {
logBeforeNp('[audio] vendor/obs-config.js missing — run setup.sh', 'term-dim');
logBeforeNp('[audio] vendor/obs-config.js missing — run scripts/setup.sh', 'term-dim');
return;
}
try {
@@ -482,7 +503,7 @@ body {
await typeCommand('mpd --queue ~/playlists/stream-mix');
if (allTracks.length === 0) {
append('> ', '[audio] no tracks queued — run loading/playlist.sh', 'term-dim');
append('> ', '[audio] no tracks queued — run scripts/playlist.sh', 'term-dim');
return;
}