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-'
This commit is contained in:
RhenCloud 2026-08-14 08:10:04 +08:00
parent a5324fb0ea
commit 3dce114cec
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
19 changed files with 273 additions and 16 deletions

View file

@ -1,6 +1,6 @@
import { describe, it, expect } from "bun:test";
import { formatEvent } from "../server/lib/formatters";
import { MAX_COMMIT_SUBJECT } from "../server/lib/formatters/helpers";
import { forgeInfo, MAX_COMMIT_SUBJECT } from "../server/lib/formatters/helpers";
import type { Route, WebhookEvent } from "../server/lib/types";
const route: Route = {
@ -518,3 +518,38 @@ describe("limits and localization", () => {
expect(msg.description!.length).toBe(4096);
});
});
describe("forge source branding", () => {
it("github events brand as GitHub with the favicon", () => {
expect(
forgeInfo({ event: "push", provider: "github", payload: {} }),
).toEqual({
name: "GitHub",
url: "https://github.com",
iconUrl: "https://github.com/favicon.ico",
});
});
it("gitea events brand as the instance hostname derived from the repo url", () => {
expect(
forgeInfo({
event: "push",
provider: "gitea",
payload: { repository: { html_url: "https://git.example.com/org/repo" } },
}),
).toEqual({
name: "git.example.com",
url: "https://git.example.com",
iconUrl: "https://git.example.com/favicon.ico",
});
expect(
forgeInfo({ event: "push", provider: "gitea", payload: {} }),
).toBeUndefined();
});
it("custom events brand as a plain label without links", () => {
expect(forgeInfo({ event: "custom", provider: "custom", payload: {} })).toEqual({
name: "Custom",
});
});
});