fix: handle Telegram General topic thread params (#848) (thanks @azade-c)

This commit is contained in:
Peter Steinberger
2026-01-16 00:07:45 +00:00
parent fe8b28cdd9
commit 8312a19f02
7 changed files with 48 additions and 17 deletions

View File

@@ -0,0 +1,30 @@
import { describe, expect, it } from "vitest";
import { buildTelegramThreadParams, buildTypingThreadParams } from "./helpers.js";
describe("buildTelegramThreadParams", () => {
it("omits General topic thread id for message sends", () => {
expect(buildTelegramThreadParams(1)).toBeUndefined();
});
it("includes non-General topic thread ids", () => {
expect(buildTelegramThreadParams(99)).toEqual({ message_thread_id: 99 });
});
it("normalizes thread ids to integers", () => {
expect(buildTelegramThreadParams(42.9)).toEqual({ message_thread_id: 42 });
});
});
describe("buildTypingThreadParams", () => {
it("returns undefined when no thread id is provided", () => {
expect(buildTypingThreadParams(undefined)).toBeUndefined();
});
it("includes General topic thread id for typing indicators", () => {
expect(buildTypingThreadParams(1)).toEqual({ message_thread_id: 1 });
});
it("normalizes thread ids to integers", () => {
expect(buildTypingThreadParams(42.9)).toEqual({ message_thread_id: 42 });
});
});

View File

@@ -21,25 +21,29 @@ export function resolveTelegramForumThreadId(params: {
/**
* Build thread params for Telegram API calls (messages, media).
* Excludes General topic (id=1) as Telegram rejects explicit message_thread_id=1
* for sendMessage calls in forum supergroups ("message thread not found" error).
* General forum topic (id=1) must be treated like a regular supergroup send:
* Telegram rejects sendMessage/sendMedia with message_thread_id=1 ("thread not found").
*/
export function buildTelegramThreadParams(messageThreadId?: number) {
if (messageThreadId == null || messageThreadId === TELEGRAM_GENERAL_TOPIC_ID) {
if (messageThreadId == null) {
return undefined;
}
return { message_thread_id: messageThreadId };
const normalized = Math.trunc(messageThreadId);
if (normalized === TELEGRAM_GENERAL_TOPIC_ID) {
return undefined;
}
return { message_thread_id: normalized };
}
/**
* Build thread params for typing indicators (sendChatAction).
* Unlike sendMessage, sendChatAction accepts message_thread_id=1 for General topic.
* Empirically, General topic (id=1) needs message_thread_id for typing to appear.
*/
export function buildTypingThreadParams(messageThreadId?: number) {
if (messageThreadId == null) {
return undefined;
}
return { message_thread_id: messageThreadId };
return { message_thread_id: Math.trunc(messageThreadId) };
}
export function resolveTelegramStreamMode(