





















@@ -14,40 +14,67 @@ const SHARED_POLL_CREATION_PARAM_DEFS = {
1414pollMulti: { kind: "boolean" },
1515} satisfies Record<string, PollCreationParamDef>;
161617-const TELEGRAM_POLL_CREATION_PARAM_DEFS = {
18-pollDurationSeconds: { kind: "number" },
19-pollAnonymous: { kind: "boolean" },
20-pollPublic: { kind: "boolean" },
21-} satisfies Record<string, PollCreationParamDef>;
22-23-export const POLL_CREATION_PARAM_DEFS: Record<string, PollCreationParamDef> = {
24- ...SHARED_POLL_CREATION_PARAM_DEFS,
25- ...TELEGRAM_POLL_CREATION_PARAM_DEFS,
26-};
17+export const POLL_CREATION_PARAM_DEFS: Record<string, PollCreationParamDef> =
18+SHARED_POLL_CREATION_PARAM_DEFS;
27192820type SharedPollCreationParamName = keyof typeof SHARED_POLL_CREATION_PARAM_DEFS;
292130-const POLL_CREATION_PARAM_NAMES = Object.keys(POLL_CREATION_PARAM_DEFS);
3122export const SHARED_POLL_CREATION_PARAM_NAMES = Object.keys(
3223SHARED_POLL_CREATION_PARAM_DEFS,
3324) as SharedPollCreationParamName[];
25+const SHARED_POLL_CREATION_PARAM_KEY_SET = new Set(
26+SHARED_POLL_CREATION_PARAM_NAMES.map(normalizePollParamKey),
27+);
28+const POLL_VOTE_PARAM_KEY_SET = new Set(
29+["pollId", "pollOptionId", "pollOptionIds", "pollOptionIndex", "pollOptionIndexes"].map(
30+normalizePollParamKey,
31+),
32+);
34333534function readPollParamRaw(params: Record<string, unknown>, key: string): unknown {
3635return readSnakeCaseParamRaw(params, key);
3736}
383739-export function resolveTelegramPollVisibility(params: {
40-pollAnonymous?: boolean;
41-pollPublic?: boolean;
42-}): boolean | undefined {
43-if (params.pollAnonymous && params.pollPublic) {
44-throw new Error("pollAnonymous and pollPublic are mutually exclusive");
38+function normalizePollParamKey(key: string): string {
39+return normalizeLowercaseStringOrEmpty(key.replaceAll("_", ""));
40+}
41+42+function isChannelPollCreationParamName(key: string): boolean {
43+const normalized = normalizePollParamKey(key);
44+return (
45+normalized.startsWith("poll") &&
46+!SHARED_POLL_CREATION_PARAM_KEY_SET.has(normalized) &&
47+!POLL_VOTE_PARAM_KEY_SET.has(normalized)
48+);
49+}
50+51+function hasExplicitUnknownPollValue(key: string, value: unknown): boolean {
52+if (value === true) {
53+return true;
54+}
55+if (typeof value === "number") {
56+return Number.isFinite(value) && value !== 0;
4557}
46-return params.pollAnonymous ? true : params.pollPublic ? false : undefined;
58+if (typeof value === "string") {
59+const trimmed = value.trim();
60+if (trimmed.length === 0) {
61+return false;
62+}
63+if (normalizePollParamKey(key).includes("duration")) {
64+const parsed = Number(trimmed);
65+return Number.isFinite(parsed) && parsed !== 0;
66+}
67+const normalized = normalizeLowercaseStringOrEmpty(trimmed);
68+return normalized !== "false" && normalized !== "0";
69+}
70+if (Array.isArray(value)) {
71+return value.some((entry) => hasExplicitUnknownPollValue(key, entry));
72+}
73+return false;
4774}
48754976export function hasPollCreationParams(params: Record<string, unknown>): boolean {
50-for (const key of POLL_CREATION_PARAM_NAMES) {
77+for (const key of SHARED_POLL_CREATION_PARAM_NAMES) {
5178const def = POLL_CREATION_PARAM_DEFS[key];
5279const value = readPollParamRaw(params, key);
5380if (def.kind === "string" && typeof value === "string" && value.trim().length > 0) {
@@ -88,5 +115,10 @@ export function hasPollCreationParams(params: Record<string, unknown>): boolean
88115}
89116}
90117}
118+for (const [key, value] of Object.entries(params)) {
119+if (isChannelPollCreationParamName(key) && hasExplicitUnknownPollValue(key, value)) {
120+return true;
121+}
122+}
91123return false;
92124}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。