WebHooker/docs/guide/message-format.md
RhenCloud 3dce114cec
feat(groups): optional forge source label in message footers
- Group.forgeLabel (default off, editable per group in the console) shows the
  source forge on every message the group's routes dispatch
- Discord embed footer: forge name next to the repo + the site's favicon as
  icon_url (Gitea instance's own favicon from its origin)
- Telegram footer: hyperlinked site name (GitHub or Gitea hostname); custom
  webhooks render a plain 'Custom' label
- forgeInfo() derives branding from event.provider + repository.html_url;
  dispatch attaches it to the NeutralMessage like mentionRoleIds
- validateGroups accepts forgeLabel booleans; GroupEditor gains the toggle
- tests: forgeInfo unit, discord/telegram footer render, dispatch on/off
- docs: groups.md + message-format.md (en/zh), config.example.yaml, AGENTS.md
- fix: wrangler.jsonc compatibility_date was an incomplete '2026-'
2026-08-14 08:10:04 +08:00

2.1 KiB

Message Format

Every event formatter produces a platform-neutral message (NeutralMessage), rendered by the platform drivers into a Discord embed or Telegram HTML message.

Title

Every title must start with the repo, then an optional #number, then : subject:

{repo}{#number}: {subject}      e.g. acme/widget#7: Add feature

The repo comes from payload.repository.full_name (falling back to a generic "repository" label when missing). Comments, reviews, and inline comments use the same {repo}{#number}: {title} title as their parent object — never "Comment on org/repo" prefixes.

Only the repo head is hyperlinked — never the whole title:

  • Discord (embed titles cannot contain partial links): the title is the repo head {repo}{#number}, linked to the repository; the : {subject} text is rendered as the first line of the description, unlinked.
  • Telegram (HTML supports inline links): the one-line title keeps the subject, with only the repo head wrapped in a link.

Messages whose title has no colon separator (a : followed by a space) keep the legacy whole-title link behavior.

Commit hashes, branches, and tags render as inline code wrapped in a hyperlink (e.g. [`abc123d`](https://…/commit/abc123def456)), falling back to plain inline code when the repo base URL is unavailable.

Emoji

Event-specific emoji are added by the formatters; per-group Group.emoji (default true) strips them all when disabled. Milestone progress bars are exempt. See Message Language.

Forge Source Label

With Group.forgeLabel (default false) the message footer additionally names the source forge — GitHub, the Gitea instance hostname (hyperlinked), or a plain Custom — so events from different forges can be told apart. See Groups → Forge Source Label.

In-Place Updates

workflow_run and check_run messages are sent once and edited in place as the run progresses (queued → running → success/failure) — no duplicate messages. Tracking uses KV msg:* with a stable updateKey per run.