mirror of
https://github.com/ReCloudStudio/WebHooker.git
synced 2026-09-22 16:11:29 +00:00
fix(telegram): render rich header title as plain text
This commit is contained in:
parent
1348873847
commit
2e89c79e9c
2 changed files with 38 additions and 1 deletions
|
|
@ -1,8 +1,15 @@
|
||||||
|
import MarkdownIt from "markdown-it";
|
||||||
import type { RouteTarget, Env, NeutralMessage } from "../../types";
|
import type { RouteTarget, Env, NeutralMessage } from "../../types";
|
||||||
import type { PlatformDriver, SendResult } from "../types";
|
import type { PlatformDriver, SendResult } from "../types";
|
||||||
import { sendMessage, sendPhoto, editMessageText, editMessageCaption } from "./rest";
|
import { sendMessage, sendPhoto, editMessageText, editMessageCaption } from "./rest";
|
||||||
import { renderNeutralMessage } from "./render";
|
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 {
|
function smallAvatar(url: string): string {
|
||||||
const sep = url.includes("?") ? "&" : "?";
|
const sep = url.includes("?") ? "&" : "?";
|
||||||
return `${url}${sep}s=64`;
|
return `${url}${sep}s=64`;
|
||||||
|
|
@ -11,7 +18,7 @@ function smallAvatar(url: string): string {
|
||||||
function richHeaderUrl(message: NeutralMessage, avatar: string, host: string): string {
|
function richHeaderUrl(message: NeutralMessage, avatar: string, host: string): string {
|
||||||
const params = new URLSearchParams();
|
const params = new URLSearchParams();
|
||||||
if (message.author?.name) params.set("title", message.author.name);
|
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);
|
params.set("avatar", avatar);
|
||||||
return `${host.replace(/\/+$/, "")}/api/richheader?${params.toString()}`;
|
return `${host.replace(/\/+$/, "")}/api/richheader?${params.toString()}`;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -191,6 +191,36 @@ describe("telegram-rest sendPhoto", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("TelegramDriver", () => {
|
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 () => {
|
it("sends a small avatar photo (s=64) when the author has an icon", async () => {
|
||||||
let capturedInit: RequestInit | undefined;
|
let capturedInit: RequestInit | undefined;
|
||||||
mockFetch((url, init) => {
|
mockFetch((url, init) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue