
















@@ -240,15 +240,40 @@ export const registerTelegramHandlers = ({
240240};
241241242242const MULTI_SELECT_PREFIX = "OC_MULTI|";
243+const MULTI_SELECT_TOGGLE_PREFIX = `${MULTI_SELECT_PREFIX}toggle|`;
243244const SELECT_PREFIX = "OC_SELECT|";
244245const SELECTED_PREFIX = "✅ ";
245246247+type TelegramManagedSelectCallback =
248+| { type: "multi-toggle"; value: string }
249+| { type: "multi-clear" }
250+| { type: "multi-submit" }
251+| { type: "select"; value: string };
252+246253type TelegramCallbackButton = {
247254text: string;
248255callback_data: string;
249256style?: "danger" | "success" | "primary";
250257};
251258259+const parseTelegramManagedSelectCallback = (
260+data: string,
261+): TelegramManagedSelectCallback | undefined => {
262+if (data.startsWith(MULTI_SELECT_TOGGLE_PREFIX)) {
263+return { type: "multi-toggle", value: data.slice(MULTI_SELECT_TOGGLE_PREFIX.length) };
264+}
265+if (data === `${MULTI_SELECT_PREFIX}clear`) {
266+return { type: "multi-clear" };
267+}
268+if (data === `${MULTI_SELECT_PREFIX}submit`) {
269+return { type: "multi-submit" };
270+}
271+if (data.startsWith(SELECT_PREFIX)) {
272+return { type: "select", value: data.slice(SELECT_PREFIX.length) };
273+}
274+return undefined;
275+};
276+252277const cloneInlineKeyboardButtons = (message: Message): TelegramCallbackButton[][] => {
253278const rows = (message as { reply_markup?: { inline_keyboard?: unknown } }).reply_markup
254279?.inline_keyboard;
@@ -292,15 +317,14 @@ export const registerTelegramHandlers = ({
292317const isSelectedMultiButton = (button: TelegramCallbackButton): boolean =>
293318/^✅\s*/.test(button.text);
294319const isMultiToggleButton = (button: TelegramCallbackButton): boolean =>
295-typeof button.callback_data === "string" &&
296-button.callback_data.startsWith(`${MULTI_SELECT_PREFIX}toggle|`);
320+button.callback_data.startsWith(MULTI_SELECT_TOGGLE_PREFIX);
297321const resolveMultiSelectedValues = (buttons: TelegramCallbackButton[][]): string[] =>
298322buttons.flatMap((row) =>
299323row.flatMap((button) => {
300324if (!isMultiToggleButton(button) || !isSelectedMultiButton(button)) {
301325return [];
302326}
303-return [button.callback_data.slice(`${MULTI_SELECT_PREFIX}toggle|`.length)];
327+return [button.callback_data.slice(MULTI_SELECT_TOGGLE_PREFIX.length)];
304328}),
305329);
306330const updateMultiSelectKeyboard = (
@@ -313,7 +337,7 @@ export const registerTelegramHandlers = ({
313337if (!isMultiToggleButton(button)) {
314338return button;
315339}
316-const buttonValue = button.callback_data.slice(`${MULTI_SELECT_PREFIX}toggle|`.length);
340+const buttonValue = button.callback_data.slice(MULTI_SELECT_TOGGLE_PREFIX.length);
317341const baseText = stripMultiSelectPrefix(button.text);
318342const selected =
319343action === "clear"
@@ -1694,10 +1718,17 @@ export const registerTelegramHandlers = ({
16941718return;
16951719}
169617201697-if (data.startsWith(MULTI_SELECT_PREFIX)) {
1698-const [, action, value = ""] = data.split("|");
1699-if (action === "toggle" || action === "clear") {
1700-const buttons = updateMultiSelectKeyboard(callbackMessage, action, value);
1721+const managedSelectCallback = parseTelegramManagedSelectCallback(data);
1722+if (managedSelectCallback) {
1723+if (
1724+managedSelectCallback.type === "multi-toggle" ||
1725+managedSelectCallback.type === "multi-clear"
1726+) {
1727+const buttons = updateMultiSelectKeyboard(
1728+callbackMessage,
1729+managedSelectCallback.type === "multi-clear" ? "clear" : "toggle",
1730+managedSelectCallback.type === "multi-toggle" ? managedSelectCallback.value : "",
1731+);
17011732if (buttons.length > 0) {
17021733try {
17031734await editCallbackButtons(buttons);
@@ -1709,7 +1740,8 @@ export const registerTelegramHandlers = ({
17091740}
17101741return;
17111742}
1712-if (action === "submit") {
1743+1744+if (managedSelectCallback.type === "multi-submit") {
17131745const selected = resolveMultiSelectedValues(cloneInlineKeyboardButtons(callbackMessage));
17141746const synthetic = buildCallbackSyntheticTextContext({
17151747 ctx,
@@ -1724,10 +1756,7 @@ export const registerTelegramHandlers = ({
17241756});
17251757return;
17261758}
1727-}
172817591729-if (data.startsWith(SELECT_PREFIX)) {
1730-const value = data.slice(SELECT_PREFIX.length);
17311760try {
17321761await clearCallbackButtons();
17331762} catch (editErr) {
@@ -1743,7 +1772,7 @@ export const registerTelegramHandlers = ({
17431772 ctx,
17441773 callbackMessage,
17451774 callback,
1746-text: `Single-select submitted: ${value}`,
1775+text: `Single-select submitted: ${managedSelectCallback.value}`,
17471776 isForum,
17481777});
17491778await processMessageWithReplyChain(synthetic.ctx, synthetic.message, [], storeAllowFrom, {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。