feat: show who reacted, and stop curiosities flooding chat

Reactions only ever showed counts, so with several reactors nobody could
tell who had reacted. Naming everyone on its own line does not scale, so
names now appear in three progressively larger places: a hover tooltip per
button (Java only), a one-line closing summary naming the first
resumo-nomes (3) and collapsing the rest to "+N", and /reacoes for the full
breakdown sent privately.

Reactors' names are captured at react time so the summary survives them
logging off.

Two separate causes of chat flooding:
- every join fired its own curiosity, so a wave of joins produced one each.
  Automatic triggers are now rate-limited by intervalo-minimo-segundos
  (120); a typed /curiosidade still bypasses it.
- a curiosity cost two messages. The button row is now appended to the
  headline instead of being broadcast separately.

Also fixes "1 horas" — CuriosityFactory had its own duration formatting
that missed the earlier plural fix; it now uses Msg.duration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ActvLGJApdxEAd2yfKPwqv
This commit is contained in:
marcos
2026-08-04 21:38:28 +00:00
parent 987ee13d74
commit be6d34f456
8 changed files with 252 additions and 55 deletions
+23 -3
View File
@@ -59,14 +59,34 @@ change. The live numbers appear on three other surfaces instead:
An earlier version only had the boss bar, and it read as broken — the buttons
showed no number at all.
### 2. Clicks arrive late
### 2. Who reacted, without filling the screen
Naming every reactor on its own chat line does not scale — five people
reacting to five reactions is a wall of text. So the names live in three
progressively larger places:
- **hover tooltip** on each button (Java only — Bedrock cannot hover)
- **one-line closing summary** naming the first `resumo-nomes` (default 3) and
collapsing the rest into `+N`
- **`/reacoes`** for the full breakdown, sent privately so chat stays clean
The same cap applies to the mourning line, so a popular death is still one line.
Relatedly, a curiosity costs **one** chat message, not two — the button row is
appended to the headline rather than broadcast separately.
And automatic curiosities are rate-limited by `intervalo-minimo-segundos`
(default 120). Without it, five people joining together produced five
curiosities back to back. A typed `/curiosidade` bypasses the limit.
### 3. Clicks arrive late
People scroll back and click minutes after a message. Reactions therefore keep
counting for `reacao-validade-minutos` (default 15) even after the boss bar is
gone, and the last 8 reaction sets stay in memory for that reason. Silently
dropping a late click looks like a bug to the player.
### 3. Bedrock cannot click, and cannot show emoji
### 4. Bedrock cannot click, and cannot show emoji
Geyser cannot deliver a chat `clickEvent` to a Bedrock client, and most emoji
render as tofu boxes there. So every clickable interaction has a typed
@@ -95,7 +115,7 @@ Changing a `comando` to a new name also requires adding that command to
runtime dependency rather than a compile-time one. `/canalhandia plataformas`
lists who is online and on which platform.
### 4. Names are translated by the client, not by us
### 5. Names are translated by the client, not by us
Block, item and mob names are emitted as **translatable components**
(`Component.translatable(material.translationKey())`), so a pt-BR client renders