From d63cc1e8a7110aac06d5c6a1e983e0d02f0d9198 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 17 Jan 2026 07:49:57 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20allow=20telegram=20prefixes/topics=20for?= =?UTF-8?q?=20inline=20buttons=20(#1072)=20=E2=80=94=20thanks=20@danielz1z?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: danielz1z --- CHANGELOG.md | 1 + src/telegram/inline-buttons.test.ts | 10 ++++++++++ src/telegram/inline-buttons.ts | 15 +++++++-------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b11baeff..423e22455 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ - Plugins: add zip installs and `--link` to avoid copying local paths. ### Fixes +- Telegram: accept tg/group/telegram prefixes + topic targets for inline button validation. (#1072) — thanks @danielz1z. - Sub-agents: normalize announce delivery origin + queue bucketing by accountId to keep multi-account routing stable. (#1061, #1058) — thanks @adam91holt. - Sessions: include deliveryContext in sessions.list and reuse normalized delivery routing for announce/restart fallbacks. (#1058) - Sessions: propagate deliveryContext into last-route updates to keep account/channel routing stable. (#1058) diff --git a/src/telegram/inline-buttons.test.ts b/src/telegram/inline-buttons.test.ts index c7b4ec9b5..ba070258a 100644 --- a/src/telegram/inline-buttons.test.ts +++ b/src/telegram/inline-buttons.test.ts @@ -19,6 +19,16 @@ describe("resolveTelegramTargetChatType", () => { expect(resolveTelegramTargetChatType("TELEGRAM:5232990709")).toBe("direct"); }); + it("handles tg/group prefixes and topic suffixes", () => { + expect(resolveTelegramTargetChatType("tg:5232990709")).toBe("direct"); + expect(resolveTelegramTargetChatType("group:-123456789")).toBe("group"); + expect(resolveTelegramTargetChatType("telegram:group:-1001234567890")).toBe("group"); + expect(resolveTelegramTargetChatType("telegram:group:-1001234567890:topic:456")).toBe( + "group", + ); + expect(resolveTelegramTargetChatType("-1001234567890:456")).toBe("group"); + }); + it("returns 'unknown' for usernames", () => { expect(resolveTelegramTargetChatType("@username")).toBe("unknown"); expect(resolveTelegramTargetChatType("telegram:@username")).toBe("unknown"); diff --git a/src/telegram/inline-buttons.ts b/src/telegram/inline-buttons.ts index 1a6c75301..e6bcd29bb 100644 --- a/src/telegram/inline-buttons.ts +++ b/src/telegram/inline-buttons.ts @@ -1,6 +1,7 @@ import type { ClawdbotConfig } from "../config/config.js"; import type { TelegramInlineButtonsScope } from "../config/types.telegram.js"; import { listTelegramAccountIds, resolveTelegramAccount } from "./accounts.js"; +import { parseTelegramTarget } from "./targets.js"; const DEFAULT_INLINE_BUTTONS_SCOPE: TelegramInlineButtonsScope = "allowlist"; @@ -61,14 +62,12 @@ export function isTelegramInlineButtonsEnabled(params: { } export function resolveTelegramTargetChatType(target: string): "direct" | "group" | "unknown" { - let trimmed = target.trim(); - if (!trimmed) return "unknown"; - // Strip telegram: prefix added by normalizeTelegramMessagingTarget - if (trimmed.toLowerCase().startsWith("telegram:")) { - trimmed = trimmed.slice("telegram:".length).trim(); - } - if (/^-?\d+$/.test(trimmed)) { - return trimmed.startsWith("-") ? "group" : "direct"; + if (!target.trim()) return "unknown"; + const parsed = parseTelegramTarget(target); + const chatId = parsed.chatId.trim(); + if (!chatId) return "unknown"; + if (/^-?\d+$/.test(chatId)) { + return chatId.startsWith("-") ? "group" : "direct"; } return "unknown"; }