Skip to content

Commit 96fe85f

Browse files
committed
refactor: dedupe telegram trimmed readers
1 parent aaa8839 commit 96fe85f

18 files changed

Lines changed: 88 additions & 53 deletions

extensions/telegram/src/account-inspect.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function inspectTokenFile(pathValue: unknown): {
3434
tokenSource: "tokenFile" | "none";
3535
tokenStatus: TelegramCredentialStatus;
3636
} | null {
37-
const tokenFile = typeof pathValue === "string" ? pathValue.trim() : "";
37+
const tokenFile = normalizeOptionalString(pathValue) ?? "";
3838
if (!tokenFile) {
3939
return null;
4040
}
@@ -85,10 +85,10 @@ function inspectTokenValue(params: { cfg: OpenClawConfig; value: unknown }): {
8585
tokenStatus: "configured_unavailable",
8686
};
8787
}
88-
const envValue = process.env[ref.id];
89-
if (envValue && envValue.trim()) {
88+
const envValue = normalizeOptionalString(process.env[ref.id]);
89+
if (envValue) {
9090
return {
91-
token: envValue.trim(),
91+
token: envValue,
9292
tokenSource: "env",
9393
tokenStatus: "available",
9494
};
@@ -187,7 +187,11 @@ function inspectTelegramAccountPrimary(params: {
187187
}
188188

189189
const allowEnv = accountId === DEFAULT_ACCOUNT_ID;
190-
const envToken = allowEnv ? (params.envToken ?? process.env.TELEGRAM_BOT_TOKEN)?.trim() : "";
190+
const envToken = allowEnv
191+
? (normalizeOptionalString(params.envToken) ??
192+
normalizeOptionalString(process.env.TELEGRAM_BOT_TOKEN) ??
193+
"")
194+
: "";
191195
if (envToken) {
192196
return {
193197
accountId,

extensions/telegram/src/action-runtime.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import {
1111
resolveReactionMessageId,
1212
} from "openclaw/plugin-sdk/channel-actions";
1313
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
14-
import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime";
14+
import {
15+
normalizeOptionalLowercaseString,
16+
normalizeOptionalString,
17+
} from "openclaw/plugin-sdk/text-runtime";
1518
import { createTelegramActionGate, resolveTelegramPollActionGateState } from "./accounts.js";
1619
import {
1720
fitsTelegramCallbackData,
@@ -114,9 +117,8 @@ export function readTelegramButtons(
114117
throw new Error(`buttons[${rowIndex}][${buttonIndex}] must be an object`);
115118
}
116119
const rawButton = button as RawTelegramButton;
117-
const text = typeof rawButton.text === "string" ? rawButton.text.trim() : "";
118-
const callbackData =
119-
typeof rawButton.callback_data === "string" ? rawButton.callback_data.trim() : "";
120+
const text = normalizeOptionalString(rawButton.text) ?? "";
121+
const callbackData = normalizeOptionalString(rawButton.callback_data) ?? "";
120122
if (!text || !callbackData) {
121123
throw new Error(`buttons[${rowIndex}][${buttonIndex}] requires text and callback_data`);
122124
}

extensions/telegram/src/approval-handler.runtime.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
type PluginApprovalRequest,
1414
} from "openclaw/plugin-sdk/infra-runtime";
1515
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
16+
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
1617
import { resolveTelegramInlineButtons } from "./button-types.js";
1718
import {
1819
isTelegramExecApprovalHandlerConfigured,
@@ -49,7 +50,7 @@ function resolveHandlerContext(params: ChannelApprovalCapabilityHandlerContext):
4950
context: TelegramApprovalHandlerContext;
5051
} | null {
5152
const context = params.context as TelegramApprovalHandlerContext | undefined;
52-
const accountId = params.accountId?.trim() || "";
53+
const accountId = normalizeOptionalString(params.accountId) ?? "";
5354
if (!context?.token || !accountId) {
5455
return null;
5556
}

extensions/telegram/src/approval-native.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function resolveTurnSourceTelegramOriginTarget(
3434
request: ApprovalRequest,
3535
): TelegramOriginTarget | null {
3636
const turnSourceChannel = normalizeLowercaseStringOrEmpty(request.request.turnSourceChannel);
37-
const rawTurnSourceTo = request.request.turnSourceTo?.trim() || "";
37+
const rawTurnSourceTo = normalizeOptionalString(request.request.turnSourceTo) ?? "";
3838
const parsedTurnSourceTarget = rawTurnSourceTo ? parseTelegramTarget(rawTurnSourceTo) : null;
3939
const turnSourceTo = normalizeTelegramChatId(parsedTurnSourceTarget?.chatId ?? rawTurnSourceTo);
4040
if (turnSourceChannel !== "telegram" || !turnSourceTo) {

extensions/telegram/src/audit.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ vi.mock("openclaw/plugin-sdk/text-runtime", () => ({
1010
fetchWithTimeout: fetchWithTimeoutMock,
1111
isRecord: (value: unknown): value is Record<string, unknown> =>
1212
typeof value === "object" && value !== null,
13+
normalizeOptionalString: (value: unknown) => {
14+
if (typeof value !== "string") {
15+
return undefined;
16+
}
17+
const trimmed = value.trim();
18+
return trimmed ? trimmed : undefined;
19+
},
1320
}));
1421

1522
function mockGetChatMemberStatus(status: string) {

extensions/telegram/src/audit.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { TelegramGroupConfig } from "openclaw/plugin-sdk/config-runtime";
22
import type { TelegramNetworkConfig } from "openclaw/plugin-sdk/config-runtime";
3+
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
34

45
export type TelegramGroupMembershipAuditEntry = {
56
chatId: string;
@@ -46,7 +47,7 @@ export function collectTelegramUnmentionedGroupIds(
4647
if (value.requireMention !== false) {
4748
continue;
4849
}
49-
const id = String(key).trim();
50+
const id = normalizeOptionalString(String(key)) ?? "";
5051
if (!id) {
5152
continue;
5253
}
@@ -82,7 +83,7 @@ export async function auditTelegramGroupMembership(
8283
params: AuditTelegramGroupMembershipParams,
8384
): Promise<TelegramGroupMembershipAudit> {
8485
const started = Date.now();
85-
const token = params.token?.trim() ?? "";
86+
const token = normalizeOptionalString(params.token) ?? "";
8687
if (!token || params.groupIds.length === 0) {
8788
return {
8889
ok: true,

extensions/telegram/src/bot-access.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
type AllowlistMatch,
66
} from "openclaw/plugin-sdk/allow-from";
77
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
8+
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
89

910
export type NormalizedAllowFrom = {
1011
entries: string[];
@@ -40,7 +41,9 @@ function warnInvalidAllowFromEntries(entries: string[]) {
4041
}
4142

4243
export const normalizeAllowFrom = (list?: Array<string | number>): NormalizedAllowFrom => {
43-
const entries = (list ?? []).map((value) => String(value).trim()).filter(Boolean);
44+
const entries = (list ?? [])
45+
.map((value) => normalizeOptionalString(String(value)) ?? "")
46+
.filter(Boolean);
4447
const hasWildcard = entries.includes("*");
4548
const normalized = entries
4649
.filter((value) => value !== "*")

extensions/telegram/src/bot-native-command-menu.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { Bot } from "grammy";
66
import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
77
import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env";
88
import { resolveStateDir } from "openclaw/plugin-sdk/state-paths";
9-
import { readStringValue } from "openclaw/plugin-sdk/text-runtime";
9+
import { normalizeOptionalString, readStringValue } from "openclaw/plugin-sdk/text-runtime";
1010
import { withTelegramApiErrorLogging } from "./api-logging.js";
1111
import { normalizeTelegramCommandName, TELEGRAM_COMMAND_NAME_PATTERN } from "./command-config.js";
1212

@@ -154,7 +154,7 @@ export function buildPluginTelegramMenuCommands(params: {
154154
);
155155
continue;
156156
}
157-
const description = typeof spec.description === "string" ? spec.description.trim() : "";
157+
const description = normalizeOptionalString(spec.description) ?? "";
158158
if (!description) {
159159
issues.push(`Plugin command "/${normalized}" is missing a description.`);
160160
continue;

extensions/telegram/src/bot/helpers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
} from "openclaw/plugin-sdk/config-runtime";
88
import { readChannelAllowFromStore } from "openclaw/plugin-sdk/conversation-runtime";
99
import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
10+
import { normalizeOptionalString } from "openclaw/plugin-sdk/text-runtime";
1011
import { firstDefined, normalizeAllowFrom, type NormalizedAllowFrom } from "../bot-access.js";
1112
import { normalizeTelegramReplyToMessageId } from "../outbound-params.js";
1213
import { resolveTelegramPreviewStreamMode } from "../preview-streaming.js";
@@ -279,7 +280,8 @@ export function resolveTelegramDirectPeerId(params: {
279280
chatId: number | string;
280281
senderId?: number | string | null;
281282
}) {
282-
const senderId = params.senderId != null ? String(params.senderId).trim() : "";
283+
const senderId =
284+
params.senderId != null ? (normalizeOptionalString(String(params.senderId)) ?? "") : "";
283285
if (senderId) {
284286
return senderId;
285287
}

extensions/telegram/src/channel.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,13 @@ function targetsMatchTelegramReplySuppression(params: {
276276
const origin = parseTelegramTarget(params.originTarget);
277277
const target = parseTelegramTarget(params.targetKey);
278278
const originThreadId =
279-
origin.messageThreadId != null && String(origin.messageThreadId).trim()
280-
? String(origin.messageThreadId).trim()
279+
origin.messageThreadId != null && normalizeOptionalString(String(origin.messageThreadId))
280+
? normalizeOptionalString(String(origin.messageThreadId))
281281
: undefined;
282282
const targetThreadId =
283-
params.targetThreadId?.trim() ||
284-
(target.messageThreadId != null && String(target.messageThreadId).trim()
285-
? String(target.messageThreadId).trim()
283+
normalizeOptionalString(params.targetThreadId) ||
284+
(target.messageThreadId != null && normalizeOptionalString(String(target.messageThreadId))
285+
? normalizeOptionalString(String(target.messageThreadId))
286286
: undefined);
287287
if (
288288
normalizeOptionalLowercaseString(origin.chatId) !==
@@ -304,8 +304,8 @@ function resolveTelegramCommandConversation(params: {
304304
}) {
305305
const chatId = [params.originatingTo, params.commandTo, params.fallbackTo]
306306
.map((candidate) => {
307-
const trimmed = candidate?.trim();
308-
return trimmed ? parseTelegramTarget(trimmed).chatId.trim() : "";
307+
const trimmed = normalizeOptionalString(candidate) ?? "";
308+
return trimmed ? (normalizeOptionalString(parseTelegramTarget(trimmed).chatId) ?? "") : "";
309309
})
310310
.find((candidate) => candidate.length > 0);
311311
if (!chatId) {
@@ -331,12 +331,13 @@ function resolveTelegramInboundConversation(params: {
331331
conversationId?: string;
332332
threadId?: string | number;
333333
}) {
334-
const rawTarget = params.to?.trim() || params.conversationId?.trim() || "";
334+
const rawTarget =
335+
normalizeOptionalString(params.to) ?? normalizeOptionalString(params.conversationId) ?? "";
335336
if (!rawTarget) {
336337
return null;
337338
}
338339
const parsedTarget = parseTelegramTarget(rawTarget);
339-
const chatId = parsedTarget.chatId.trim();
340+
const chatId = normalizeOptionalString(parsedTarget.chatId) ?? "";
340341
if (!chatId) {
341342
return null;
342343
}

0 commit comments

Comments
 (0)