diff --git a/src/telegram/bot-handlers.ts b/src/telegram/bot-handlers.ts index 910956635d1..688ed9a4897 100644 --- a/src/telegram/bot-handlers.ts +++ b/src/telegram/bot-handlers.ts @@ -29,6 +29,7 @@ import { buildTelegramGroupPeerId, buildTelegramParentPeer, resolveTelegramForumThreadId, + resolveTelegramGroupAllowFromContext, } from "./bot/helpers.js"; import { migrateTelegramGroupConfig } from "./group-migration.js"; import { resolveTelegramInlineButtonsScope } from "./inline-buttons.js"; @@ -327,17 +328,15 @@ export const registerTelegramHandlers = ({ const messageThreadId = callbackMessage.message_thread_id; const isForum = callbackMessage.chat.is_forum === true; - const resolvedThreadId = resolveTelegramForumThreadId({ + const groupAllowContext = await resolveTelegramGroupAllowFromContext({ + chatId, isForum, messageThreadId, + groupAllowFrom, + resolveTelegramGroupConfig, }); - const { groupConfig, topicConfig } = resolveTelegramGroupConfig(chatId, resolvedThreadId); - const storeAllowFrom = await readChannelAllowFromStore("telegram").catch(() => []); - const groupAllowOverride = firstDefined(topicConfig?.allowFrom, groupConfig?.allowFrom); - const effectiveGroupAllow = normalizeAllowFromWithStore({ - allowFrom: groupAllowOverride ?? groupAllowFrom, - storeAllowFrom, - }); + const { resolvedThreadId, storeAllowFrom, groupConfig, topicConfig, effectiveGroupAllow } = + groupAllowContext; const effectiveDmAllow = normalizeAllowFromWithStore({ allowFrom: telegramCfg.allowFrom, storeAllowFrom, @@ -357,7 +356,7 @@ export const registerTelegramHandlers = ({ ); return; } - if (typeof groupAllowOverride !== "undefined") { + if (groupAllowContext.hasGroupAllowOverride) { const allowed = senderId && isSenderAllowed({ @@ -698,18 +697,21 @@ export const registerTelegramHandlers = ({ const isGroup = msg.chat.type === "group" || msg.chat.type === "supergroup"; const messageThreadId = msg.message_thread_id; const isForum = msg.chat.is_forum === true; - const resolvedThreadId = resolveTelegramForumThreadId({ + const groupAllowContext = await resolveTelegramGroupAllowFromContext({ + chatId, isForum, messageThreadId, + groupAllowFrom, + resolveTelegramGroupConfig, }); - const storeAllowFrom = await readChannelAllowFromStore("telegram").catch(() => []); - const { groupConfig, topicConfig } = resolveTelegramGroupConfig(chatId, resolvedThreadId); - const groupAllowOverride = firstDefined(topicConfig?.allowFrom, groupConfig?.allowFrom); - const effectiveGroupAllow = normalizeAllowFromWithStore({ - allowFrom: groupAllowOverride ?? groupAllowFrom, + const { + resolvedThreadId, storeAllowFrom, - }); - const hasGroupAllowOverride = typeof groupAllowOverride !== "undefined"; + groupConfig, + topicConfig, + effectiveGroupAllow, + hasGroupAllowOverride, + } = groupAllowContext; if (isGroup) { if (groupConfig?.enabled === false) { diff --git a/src/telegram/bot-native-commands.ts b/src/telegram/bot-native-commands.ts index c2cbf894f45..27a3cd92849 100644 --- a/src/telegram/bot-native-commands.ts +++ b/src/telegram/bot-native-commands.ts @@ -29,7 +29,6 @@ import { resolveTelegramCustomCommands } from "../config/telegram-custom-command import { danger, logVerbose } from "../globals.js"; import { getChildLogger } from "../logging.js"; import { getAgentScopedMediaLocalRoots } from "../media/local-roots.js"; -import { readChannelAllowFromStore } from "../pairing/pairing-store.js"; import { executePluginCommand, getPluginCommandSpecs, @@ -53,7 +52,7 @@ import { buildTelegramGroupFrom, buildTelegramGroupPeerId, buildTelegramParentPeer, - resolveTelegramForumThreadId, + resolveTelegramGroupAllowFromContext, resolveTelegramThreadSpec, } from "./bot/helpers.js"; import { buildInlineKeyboard } from "./send.js"; @@ -155,18 +154,21 @@ async function resolveTelegramCommandAuth(params: { const isGroup = msg.chat.type === "group" || msg.chat.type === "supergroup"; const messageThreadId = (msg as { message_thread_id?: number }).message_thread_id; const isForum = (msg.chat as { is_forum?: boolean }).is_forum === true; - const resolvedThreadId = resolveTelegramForumThreadId({ + const groupAllowContext = await resolveTelegramGroupAllowFromContext({ + chatId, isForum, messageThreadId, + groupAllowFrom, + resolveTelegramGroupConfig, }); - const storeAllowFrom = await readChannelAllowFromStore("telegram").catch(() => []); - const { groupConfig, topicConfig } = resolveTelegramGroupConfig(chatId, resolvedThreadId); - const groupAllowOverride = firstDefined(topicConfig?.allowFrom, groupConfig?.allowFrom); - const effectiveGroupAllow = normalizeAllowFromWithStore({ - allowFrom: groupAllowOverride ?? groupAllowFrom, + const { + resolvedThreadId, storeAllowFrom, - }); - const hasGroupAllowOverride = typeof groupAllowOverride !== "undefined"; + groupConfig, + topicConfig, + effectiveGroupAllow, + hasGroupAllowOverride, + } = groupAllowContext; const senderIdRaw = msg.from?.id; const senderId = senderIdRaw ? String(senderIdRaw) : ""; const senderUsername = msg.from?.username ?? ""; diff --git a/src/telegram/bot/helpers.ts b/src/telegram/bot/helpers.ts index 809a3aa8255..8170bf99d8a 100644 --- a/src/telegram/bot/helpers.ts +++ b/src/telegram/bot/helpers.ts @@ -1,6 +1,13 @@ import type { Chat, Message, MessageOrigin, User } from "@grammyjs/types"; +import type { TelegramGroupConfig, TelegramTopicConfig } from "../../config/types.js"; import type { TelegramStreamMode } from "./types.js"; import { formatLocationText, type NormalizedLocation } from "../../channels/location.js"; +import { readChannelAllowFromStore } from "../../pairing/pairing-store.js"; +import { + firstDefined, + normalizeAllowFromWithStore, + type NormalizedAllowFrom, +} from "../bot-access.js"; const TELEGRAM_GENERAL_TOPIC_ID = 1; @@ -9,6 +16,50 @@ export type TelegramThreadSpec = { scope: "dm" | "forum" | "none"; }; +export async function resolveTelegramGroupAllowFromContext(params: { + chatId: string | number; + isForum?: boolean; + messageThreadId?: number | null; + groupAllowFrom?: Array; + resolveTelegramGroupConfig: ( + chatId: string | number, + messageThreadId?: number, + ) => { groupConfig?: TelegramGroupConfig; topicConfig?: TelegramTopicConfig }; +}): Promise<{ + resolvedThreadId?: number; + storeAllowFrom: string[]; + groupConfig?: TelegramGroupConfig; + topicConfig?: TelegramTopicConfig; + groupAllowOverride?: Array; + effectiveGroupAllow: NormalizedAllowFrom; + hasGroupAllowOverride: boolean; +}> { + const resolvedThreadId = resolveTelegramForumThreadId({ + isForum: params.isForum, + messageThreadId: params.messageThreadId, + }); + const storeAllowFrom = await readChannelAllowFromStore("telegram").catch(() => []); + const { groupConfig, topicConfig } = params.resolveTelegramGroupConfig( + params.chatId, + resolvedThreadId, + ); + const groupAllowOverride = firstDefined(topicConfig?.allowFrom, groupConfig?.allowFrom); + const effectiveGroupAllow = normalizeAllowFromWithStore({ + allowFrom: groupAllowOverride ?? params.groupAllowFrom, + storeAllowFrom, + }); + const hasGroupAllowOverride = typeof groupAllowOverride !== "undefined"; + return { + resolvedThreadId, + storeAllowFrom, + groupConfig, + topicConfig, + groupAllowOverride, + effectiveGroupAllow, + hasGroupAllowOverride, + }; +} + /** * Resolve the thread ID for Telegram forum topics. * For non-forum groups, returns undefined even if messageThreadId is present