From edb34885c06dce8e99b577c8a825b36648cf84f0 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 16 Feb 2026 12:00:58 +0530 Subject: [PATCH] refactor(telegram): centralize target chat type parsing --- src/telegram/inline-buttons.ts | 16 +--------------- src/telegram/targets.test.ts | 7 +++++++ src/telegram/targets.ts | 23 ++++++++++++++++++++++- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/telegram/inline-buttons.ts b/src/telegram/inline-buttons.ts index 1cf770d0a8f..1137d61d1cd 100644 --- a/src/telegram/inline-buttons.ts +++ b/src/telegram/inline-buttons.ts @@ -1,7 +1,6 @@ import type { OpenClawConfig } 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"; @@ -65,17 +64,4 @@ export function isTelegramInlineButtonsEnabled(params: { ); } -export function resolveTelegramTargetChatType(target: string): "direct" | "group" | "unknown" { - 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"; -} +export { resolveTelegramTargetChatType } from "./targets.js"; diff --git a/src/telegram/targets.test.ts b/src/telegram/targets.test.ts index e25e38b2c3c..51d34206c6d 100644 --- a/src/telegram/targets.test.ts +++ b/src/telegram/targets.test.ts @@ -23,12 +23,14 @@ describe("parseTelegramTarget", () => { it("parses plain chatId", () => { expect(parseTelegramTarget("-1001234567890")).toEqual({ chatId: "-1001234567890", + chatType: "group", }); }); it("parses @username", () => { expect(parseTelegramTarget("@mychannel")).toEqual({ chatId: "@mychannel", + chatType: "unknown", }); }); @@ -36,6 +38,7 @@ describe("parseTelegramTarget", () => { expect(parseTelegramTarget("-1001234567890:123")).toEqual({ chatId: "-1001234567890", messageThreadId: 123, + chatType: "group", }); }); @@ -43,6 +46,7 @@ describe("parseTelegramTarget", () => { expect(parseTelegramTarget("-1001234567890:topic:456")).toEqual({ chatId: "-1001234567890", messageThreadId: 456, + chatType: "group", }); }); @@ -50,12 +54,14 @@ describe("parseTelegramTarget", () => { expect(parseTelegramTarget(" -1001234567890:99 ")).toEqual({ chatId: "-1001234567890", messageThreadId: 99, + chatType: "group", }); }); it("does not treat non-numeric suffix as topicId", () => { expect(parseTelegramTarget("-1001234567890:abc")).toEqual({ chatId: "-1001234567890:abc", + chatType: "unknown", }); }); @@ -63,6 +69,7 @@ describe("parseTelegramTarget", () => { expect(parseTelegramTarget("telegram:group:-1001234567890:topic:456")).toEqual({ chatId: "-1001234567890", messageThreadId: 456, + chatType: "group", }); }); }); diff --git a/src/telegram/targets.ts b/src/telegram/targets.ts index cb26c0d06b3..346bb3e35c5 100644 --- a/src/telegram/targets.ts +++ b/src/telegram/targets.ts @@ -1,6 +1,7 @@ export type TelegramTarget = { chatId: string; messageThreadId?: number; + chatType: "direct" | "group" | "unknown"; }; export function stripTelegramInternalPrefixes(to: string): string { @@ -33,6 +34,17 @@ export function stripTelegramInternalPrefixes(to: string): string { * - `chatId:topicId` (numeric topic/thread ID) * - `chatId:topic:topicId` (explicit topic marker; preferred) */ +function resolveTelegramChatType(chatId: string): "direct" | "group" | "unknown" { + const trimmed = chatId.trim(); + if (!trimmed) { + return "unknown"; + } + if (/^-?\d+$/.test(trimmed)) { + return trimmed.startsWith("-") ? "group" : "direct"; + } + return "unknown"; +} + export function parseTelegramTarget(to: string): TelegramTarget { const normalized = stripTelegramInternalPrefixes(to); @@ -41,6 +53,7 @@ export function parseTelegramTarget(to: string): TelegramTarget { return { chatId: topicMatch[1], messageThreadId: Number.parseInt(topicMatch[2], 10), + chatType: resolveTelegramChatType(topicMatch[1]), }; } @@ -49,8 +62,16 @@ export function parseTelegramTarget(to: string): TelegramTarget { return { chatId: colonMatch[1], messageThreadId: Number.parseInt(colonMatch[2], 10), + chatType: resolveTelegramChatType(colonMatch[1]), }; } - return { chatId: normalized }; + return { + chatId: normalized, + chatType: resolveTelegramChatType(normalized), + }; +} + +export function resolveTelegramTargetChatType(target: string): "direct" | "group" | "unknown" { + return parseTelegramTarget(target).chatType; }