news: Pete stops repeating what TwinBee just said in the room

Priority tier is the only thing that makes Pete post a live Matrix beat,
and the only two priority facts gogobee filed - zone_first and death -
are both moments TwinBee narrates in-room as they happen. Every live beat
was an echo. File them as bulletins: still on the site, still in the
daily digest, no second telling to the people who were there.
This commit is contained in:
prosolis
2026-07-12 22:01:09 -07:00
parent e377e0c85c
commit 1cbd68a718
2 changed files with 20 additions and 9 deletions

View File

@@ -579,9 +579,14 @@ func markAdventureDead(userID id.UserID, source, location string) {
emitDeathNews(userID, location) emitDeathNews(userID, location)
} }
// emitDeathNews files a PRIORITY death dispatch to Pete's adventure news. No-op // emitDeathNews files a BULLETIN death dispatch to Pete's adventure news. No-op
// unless the seam is enabled. Uses the character name (never the Matrix handle); // unless the seam is enabled. Uses the character name (never the Matrix handle);
// skips silently if the name is unknown. // skips silently if the name is unknown.
//
// Bulletin, not priority: the room watched the character go down in TwinBee's
// narration, and a priority fact is what makes Pete post a live beat — he'd be
// breaking the news to the people who were there. The site row and the digest
// still carry it.
func emitDeathNews(userID id.UserID, location string) { func emitDeathNews(userID id.UserID, location string) {
// Gate before the char lookups: markAdventureDead fires per-member on a // Gate before the char lookups: markAdventureDead fires per-member on a
// party wipe and in the sim harness, so skip the DB reads when disabled. // party wipe and in the sim harness, so skip the DB reads when disabled.
@@ -597,7 +602,7 @@ func emitDeathNews(userID id.UserID, location string) {
emitFact(peteclient.Fact{ emitFact(peteclient.Fact{
GUID: fmt.Sprintf("death:%s:%d", eventToken(userID, fmt.Sprintf("%d", ts)), ts), GUID: fmt.Sprintf("death:%s:%d", eventToken(userID, fmt.Sprintf("%d", ts)), ts),
EventType: "death", EventType: "death",
Tier: "priority", Tier: "bulletin",
Subject: name, Subject: name,
Zone: location, Zone: location,
Level: lvl, Level: lvl,

View File

@@ -258,10 +258,16 @@ func claimRealmFirst(kind, target string) bool {
} }
// emitZoneClearNews files a zone-clear dispatch (boss down = zone cleared). The // emitZoneClearNews files a zone-clear dispatch (boss down = zone cleared). The
// realm's first clear of a zone is a PRIORITY "zone_first"; later clears are a // realm's first clear of a zone is a "zone_first"; later clears are a
// BULLETIN "zone_clear". The event_type and the GUID prefix track the tier so // "zone_clear". The event_type and the GUID prefix track which, so Pete
// Pete templates and labels a repeat as a repeat, not a first-ever. Character // templates and labels a repeat as a repeat, not a first-ever. Character name
// name only; no-op unless the seam is enabled. // only; no-op unless the seam is enabled.
//
// BULLETIN either way: TwinBee announces the clear in the room as it happens,
// and priority tier is what makes Pete post a live beat — so a priority
// zone_first would just echo TwinBee back at the same people. Bulletin still
// gets the story onto the site and into the daily digest, where it reads as a
// roundup rather than a repeat.
func emitZoneClearNews(userID id.UserID, exp *Expedition) { func emitZoneClearNews(userID id.UserID, exp *Expedition) {
if !peteclient.Enabled() || !newsEmissionOn() { if !peteclient.Enabled() || !newsEmissionOn() {
return return
@@ -270,9 +276,9 @@ func emitZoneClearNews(userID id.UserID, exp *Expedition) {
// genuine first clear still seeds news_realm_firsts. Otherwise the next // genuine first clear still seeds news_realm_firsts. Otherwise the next
// named clearer would claim it and be mis-announced as the first-ever. // named clearer would claim it and be mis-announced as the first-ever.
// Mirrors backfillZoneFirsts, which claims before its own name check. // Mirrors backfillZoneFirsts, which claims before its own name check.
eventType, tier := "zone_clear", "bulletin" eventType := "zone_clear"
if claimRealmFirst("zone", string(exp.ZoneID)) { if claimRealmFirst("zone", string(exp.ZoneID)) {
eventType, tier = "zone_first", "priority" eventType = "zone_first"
} }
name := charName(userID) name := charName(userID)
if name == "" { if name == "" {
@@ -291,7 +297,7 @@ func emitZoneClearNews(userID id.UserID, exp *Expedition) {
emitFact(peteclient.Fact{ emitFact(peteclient.Fact{
GUID: fmt.Sprintf("%s:%s:%s:%d", eventType, eventToken(userID, disc), exp.ZoneID, ts), GUID: fmt.Sprintf("%s:%s:%s:%d", eventType, eventToken(userID, disc), exp.ZoneID, ts),
EventType: eventType, EventType: eventType,
Tier: tier, Tier: "bulletin",
Subject: name, Subject: name,
Zone: zone.Display, Zone: zone.Display,
Region: region, Region: region,