feat: interactivateCommands in telegram
Browse files
src/services/telegram/interactiveCommands.ts
CHANGED
|
@@ -37,6 +37,7 @@ const OAUTH_POLLING_SAFETY_MARGIN_MS = 3000
|
|
| 37 |
|
| 38 |
const MODEL_PREFIX = 'tg:model'
|
| 39 |
const CONNECT_PREFIX = 'tg:connect'
|
|
|
|
| 40 |
|
| 41 |
type ConnectPendingState =
|
| 42 |
| { kind: 'openrouter-api-key' }
|
|
@@ -95,6 +96,19 @@ function buildConnectKeyboard(): TelegramInlineKeyboardMarkup {
|
|
| 95 |
])
|
| 96 |
}
|
| 97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
function buildSkipKeyKeyboard(providerId: 'custom-openai' | 'custom-anthropic') {
|
| 99 |
return createKeyboard([
|
| 100 |
[
|
|
@@ -456,6 +470,15 @@ export async function maybeHandleTelegramInteractiveInput(
|
|
| 456 |
return true
|
| 457 |
}
|
| 458 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 459 |
return false
|
| 460 |
}
|
| 461 |
|
|
@@ -627,6 +650,25 @@ export async function handleTelegramCallback(
|
|
| 627 |
return true
|
| 628 |
}
|
| 629 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 630 |
return false
|
| 631 |
}
|
| 632 |
|
|
|
|
| 37 |
|
| 38 |
const MODEL_PREFIX = 'tg:model'
|
| 39 |
const CONNECT_PREFIX = 'tg:connect'
|
| 40 |
+
const LOGIN_PREFIX = 'tg:login'
|
| 41 |
|
| 42 |
type ConnectPendingState =
|
| 43 |
| { kind: 'openrouter-api-key' }
|
|
|
|
| 96 |
])
|
| 97 |
}
|
| 98 |
|
| 99 |
+
function buildLoginKeyboard(): TelegramInlineKeyboardMarkup {
|
| 100 |
+
return createKeyboard([
|
| 101 |
+
[
|
| 102 |
+
{ text: 'Anthropic', callback_data: `${LOGIN_PREFIX}:provider:anthropic` },
|
| 103 |
+
{ text: 'OpenAI', callback_data: `${LOGIN_PREFIX}:provider:openai` },
|
| 104 |
+
],
|
| 105 |
+
[
|
| 106 |
+
{ text: 'OpenRouter', callback_data: `${LOGIN_PREFIX}:provider:openrouter` },
|
| 107 |
+
{ text: 'Local', callback_data: `${LOGIN_PREFIX}:provider:local` },
|
| 108 |
+
],
|
| 109 |
+
])
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
function buildSkipKeyKeyboard(providerId: 'custom-openai' | 'custom-anthropic') {
|
| 113 |
return createKeyboard([
|
| 114 |
[
|
|
|
|
| 470 |
return true
|
| 471 |
}
|
| 472 |
|
| 473 |
+
if (text === '/login') {
|
| 474 |
+
await telegramService.sendMessage(
|
| 475 |
+
event.chatId,
|
| 476 |
+
'请选择登录方式:\n\nAnthropic - Anthropic 账户登录\nOpenAI - OpenAI / Codex 登录\nOpenRouter - OpenRouter API Key\nLocal - 本地模型服务器',
|
| 477 |
+
buildLoginKeyboard(),
|
| 478 |
+
)
|
| 479 |
+
return true
|
| 480 |
+
}
|
| 481 |
+
|
| 482 |
return false
|
| 483 |
}
|
| 484 |
|
|
|
|
| 650 |
return true
|
| 651 |
}
|
| 652 |
|
| 653 |
+
if (event.data.startsWith(`${LOGIN_PREFIX}:provider:`)) {
|
| 654 |
+
const providerId = event.data.split(':').at(-1)
|
| 655 |
+
await telegramService.answerCallbackQuery(event.callbackQueryId)
|
| 656 |
+
|
| 657 |
+
const providerMessages: Record<string, string> = {
|
| 658 |
+
'anthropic': 'Anthropic 登录需要在本地终端执行 /login 命令,Telegram 暂不支持浏览器 OAuth 流程。',
|
| 659 |
+
'openai': 'OpenAI 登录需要在本地终端执行 /login 命令,Telegram 暂不支持交互式登录。',
|
| 660 |
+
'openrouter': 'OpenRouter 登录需要在本地终端执行 /login 命令,Telegram 暂不支持 API Key 输入。',
|
| 661 |
+
'local': '本地模型配置需要在本地终端执行 /login 命令。',
|
| 662 |
+
}
|
| 663 |
+
|
| 664 |
+
await telegramService.editMessage(
|
| 665 |
+
event.chatId,
|
| 666 |
+
event.messageId,
|
| 667 |
+
providerMessages[providerId] || '暂不支持此登录方式。',
|
| 668 |
+
)
|
| 669 |
+
return true
|
| 670 |
+
}
|
| 671 |
+
|
| 672 |
return false
|
| 673 |
}
|
| 674 |
|