aether-garden / ui /pulse.py
kavyabhand's picture
Deploy Aether Garden application
781b9f7 verified
Raw
History Blame Contribute Delete
2.43 kB
"""Live Realm Pulse — surfaces what the simulation is doing right now."""
from __future__ import annotations
from world.book_of_ages import get_entries
from world.database import get_world_state
from world.events import get_active_world_event, get_recent_interactions
def render_realm_pulse(limit: int = 8) -> str:
"""Ticker of recent world activity — encounters, events, arrivals."""
state = get_world_state()
day = state.get("current_day", 1)
items: list[tuple[str, str, str]] = [] # (kind, headline, detail)
event = get_active_world_event()
if event:
items.append((
"event",
event.get("title", "Something stirs"),
event.get("description", "")[:160],
))
for ix in get_recent_interactions(limit=4):
a = ix.get("entity_a_name", "Someone")
b = ix.get("entity_b_name", "someone else")
loc = (ix.get("location_name") or "").replace("The ", "")
items.append((
"encounter",
f"{a} met {b}",
ix.get("book_of_ages_entry") or ix.get("description", "")[:140],
))
if loc:
items[-1] = (items[-1][0], f"{items[-1][1]} · {loc}", items[-1][2])
for entry in get_entries(limit=3, entry_type="arrival"):
items.append(("arrival", "A new soul arrived", entry.get("content", "")[:140]))
if not items:
return """
<div class="realm-pulse">
<div class="pulse-header">
<span class="live-dot"></span>
<span class="pulse-title">Realm Pulse</span>
</div>
<p class="pulse-quiet">The world breathes quietly. Summon something — the Garden will remember.</p>
</div>
"""
cards = []
for kind, headline, detail in items[:limit]:
cards.append(f"""
<div class="pulse-card pulse-{kind}">
<span class="pulse-kind">{kind}</span>
<p class="pulse-headline">{headline}</p>
<p class="pulse-detail">{detail}</p>
<span class="pulse-day">Day {day}</span>
</div>
""")
return f"""
<div class="realm-pulse">
<div class="pulse-header">
<span class="live-dot"></span>
<span class="pulse-title">Realm Pulse</span>
<span class="pulse-sub">What happened while you were away</span>
</div>
<div class="pulse-track">{"".join(cards)}</div>
</div>
"""