Skip to content

Announcements and Webhooks

Wonder exposes two outbound event surfaces:

  • in-game announcements from announcements.conf
  • Discord delivery from discord-webhooks.conf

announcements.conf now has two top-level sections:

  • presentations = [...]
  • announcements = [...]

Presentation rules classify Pokemon for announcement formatting and counting.

presentations = [
{
id = "shiny"
label = "Shiny"
color-tag = "<yellow>"
prefix = "<yellow>Shiny</yellow> "
suffix = ""
properties-match = "shiny=true"
}
]

Available fields:

FieldPurpose
idStable identifier used for placeholders like {shinyCount} or {shinyMatched}
labelHuman-facing label for the presentation
color-tagPrimary color tag associated with the presentation
prefixInserted into {presentationPrefixes} when this rule matches
suffixInserted into {presentationSuffixes} when this rule matches
label-matchMatch against live Pokemon form labels
aspect-matchMatch against the extracted aspect list
properties-matchMatch using a Cobblemon PokemonProperties query

Matching behavior:

  • Wonder evaluates label-match, aspect-match, and properties-match as an AND chain
  • if none of those three are set, the presentation never matches
  • multiple presentations can match the same Pokemon

Announcement templates are still keyed by trigger:

announcements = [
{
id = "queue_submit"
enabled = true
trigger = "queue.submit"
permission = "wonder.use"
message = "<gray>{playerName}</gray> has sent {presentationPrefixes}<white>{pokemonName}</white>{presentationSuffixes} <gray>into the Wonder system!</gray>"
}
]

Current built-in triggers:

  • queue.submit
  • stats.periodic
  • result.rare

stats.periodic is controlled by config.conf:

stats-announcements-enabled = true
stats-announcement-interval-minutes = 30

Wonder only broadcasts a template to players who satisfy its configured permission.

For Pokemon-bearing events like queue.submit and result.rare, Wonder injects:

  • {playerName}
  • {pokemonName}
  • {pokemonSpecies}
  • {channelId}
  • {isShiny}
  • {isLegendary}
  • {isMythical}
  • {isUltraBeast}
  • {presentationLabels}
  • {presentationPrefixes}
  • {presentationSuffixes}
  • {presentationColorTag}
  • {presentationCount}

And for each matched presentation id, additional keys:

  • {shinyMatched}
  • {shinyLabel}
  • {shinyPrefix}
  • {shinySuffix}
  • {shinyColorTag}

Replace shiny with whatever id you configured.

For periodic stats announcements, Wonder also supports dynamic counters in the form:

  • {queueCount}
  • {shinyCount}
  • {legendaryCount}
  • {mythicalCount}
  • {ultraBeastCount}

Those *Count placeholders are resolved from the configured presentations list, not hardcoded separately.

Queue submit using presentation-driven formatting:

message = "<gray>{playerName}</gray> has sent {presentationPrefixes}<white>{pokemonName}</white>{presentationSuffixes} <gray>into the Wonder system!</gray>"

Periodic stats driven by presentation counters:

message = "There are currently <white>{queueCount}</white> Pokemon in Wonder, with <gold>{legendaryCount}</gold> legendary, <light_purple>{mythicalCount}</light_purple> mythical, <aqua>{ultraBeastCount}</aqua> ultra beast, and <yellow>{shinyCount}</yellow> shiny."

Rare receive using the same presentation prefixes/suffixes:

message = "<gray>{playerName}</gray> obtained {presentationPrefixes}<white>{pokemonName}</white>{presentationSuffixes} <gray>from Wonder!</gray>"

discord-webhooks.conf routes Wonder events to Discord endpoints.

Supported event types:

  • POKEMON_QUEUED
  • RESULT_READY
  • RESULT_CLAIMED

Sender modes:

  • ORCHESTRATOR
  • EVENT_SOURCE
  • ALL_SERVERS

Wonder’s Discord webhook admin surface lives under:

/wonder admin discord-webhooks reload
/wonder admin discord-webhooks test endpoint <id>
/wonder admin discord-webhooks test rule <id>

Use those to verify endpoint ids and render rules without waiting for a live Wonder event.