diff --git a/src/telegram/inbound.ts b/src/telegram/inbound.ts index 97c18df5b..c5c377614 100644 --- a/src/telegram/inbound.ts +++ b/src/telegram/inbound.ts @@ -60,13 +60,14 @@ export async function convertTelegramMessage( * Extract sender identifier with telegram: prefix to prevent session ID collisions. * * Returns: - * - telegram:@username (if username available) + * - telegram:@username (if username available, lowercase for case-insensitive matching) * - telegram:+phone (if phone available, normalized to E.164) * - telegram:id (numeric Telegram ID as fallback) */ function extractSenderIdentifier(sender: Api.User | Api.Chat): string { if ("username" in sender && sender.username) { - return `telegram:@${sender.username}`; + // Lowercase username for case-insensitive matching (Telegram usernames are case-insensitive) + return `telegram:@${sender.username.toLowerCase()}`; } if ("phone" in sender && sender.phone) { // Ensure phone has + prefix for E.164 format to match normalized allowFrom entries @@ -209,6 +210,10 @@ export function isAllowedSender( return true; // No whitelist = allow all } + if (allowFrom.includes("*")) { + return true; // Wildcard allows all senders + } + const normalizedFrom = normalizeAllowFromEntry(message.from, "telegram"); const normalizedAllowList = allowFrom.map((e) => normalizeAllowFromEntry(e, "telegram"), diff --git a/src/telegram/monitor.ts b/src/telegram/monitor.ts index 8cccd2a30..1ca499a7c 100644 --- a/src/telegram/monitor.ts +++ b/src/telegram/monitor.ts @@ -170,11 +170,10 @@ async function handleInboundMessage( normalizeAllowFromEntry(e, "telegram"), ); if (!normalizedAllowList.includes(normalizedFrom)) { - if (isVerbose()) { - logVerbose( - `Skipping auto-reply: sender ${message.from} not in allowFrom list`, - ); - } + // Always log skipped messages (not just in verbose mode) + runtime.log( + `⏭️ Skipped message from ${message.from} (not in allowFrom list)`, + ); return; } } diff --git a/src/telegram/utils.ts b/src/telegram/utils.ts index 8428a4ea8..7c3745dee 100644 --- a/src/telegram/utils.ts +++ b/src/telegram/utils.ts @@ -6,13 +6,17 @@ type Entity = Api.User | Api.Chat | Api.Channel; /** * Resolve Telegram entity (user/chat) from identifier. * Supports @username, phone number, or user ID. + * Also handles telegram: prefix (e.g., telegram:@username). */ export async function resolveEntity( client: TelegramClient, identifier: string, ): Promise { - // Clean identifier - const clean = identifier.trim(); + // Clean identifier and strip telegram: prefix if present + let clean = identifier.trim(); + if (clean.startsWith("telegram:")) { + clean = clean.slice("telegram:".length); + } // Try as-is first (handles @username, phone, user ID) try {