fix(telegram): render rich header title as plain text

This commit is contained in:
RhenCloud 2026-09-13 13:09:05 +08:00
parent 1348873847
commit 2e89c79e9c
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
2 changed files with 38 additions and 1 deletions

View file

@ -1,8 +1,15 @@
import MarkdownIt from "markdown-it";
import type { RouteTarget, Env, NeutralMessage } from "../../types";
import type { PlatformDriver, SendResult } from "../types";
import { sendMessage, sendPhoto, editMessageText, editMessageCaption } from "./rest";
import { renderNeutralMessage } from "./render";
const markdown = new MarkdownIt({ html: false, linkify: false, breaks: false, typographer: false });
function markdownToText(value: string): string {
return markdown.renderInline(value).replace(/<[^>]*>/gu, "");
}
function smallAvatar(url: string): string {
const sep = url.includes("?") ? "&" : "?";
return `${url}${sep}s=64`;
@ -11,7 +18,7 @@ function smallAvatar(url: string): string {
function richHeaderUrl(message: NeutralMessage, avatar: string, host: string): string {
const params = new URLSearchParams();
if (message.author?.name) params.set("title", message.author.name);
if (message.title) params.set("content", message.title);
if (message.title) params.set("content", markdownToText(message.title));
params.set("avatar", avatar);
return `${host.replace(/\/+$/, "")}/api/richheader?${params.toString()}`;
}

View file

@ -191,6 +191,36 @@ describe("telegram-rest sendPhoto", () => {
});
describe("TelegramDriver", () => {
it("uses a plain-text title for the rich header preview", async () => {
let capturedInit: RequestInit | undefined;
mockFetch((_url, init) => {
capturedInit = init;
return new Response(JSON.stringify({ ok: true, result: { message_id: 9 } }), { status: 200 });
});
const driver = new TelegramDriver();
await driver.send(
{
title: "OnionSchool/YangYiSongRequest: [CI — running](https://github.com/OnionSchool/YangYiSongRequest/actions)",
author: { name: "alice", iconUrl: "https://avatars.githubusercontent.com/u/1" },
},
{ platform: "telegram", chatId: "-100123" },
{
TELEGRAM_TOKEN: "t",
BASE_URL: "https://webhooker.example.com",
KV: {} as never,
DB: {} as never,
GITHUB_WEBHOOK_SECRET: "s",
},
);
const body = JSON.parse(String(capturedInit!.body)) as { link_preview_options: { url: string } };
const previewUrl = new URL(body.link_preview_options.url);
expect(previewUrl.searchParams.get("content")).toBe(
"OnionSchool/YangYiSongRequest: CI — running",
);
});
it("sends a small avatar photo (s=64) when the author has an icon", async () => {
let capturedInit: RequestInit | undefined;
mockFetch((url, init) => {