Files
2026-03-20 07:33:46 +00:00

148 lines
5.9 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
import { ConfigManager } from '@/remote-control/config/manager'
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms))
}
/**
* Poll a bot's getStatus() until it leaves 'connecting' state,
* or until timeout (default 10s). Returns the final status.
*/
async function waitForConnection(
getStatus: () => { status: string; error?: string },
timeoutMs = 10000,
intervalMs = 500,
): Promise<{ status: string; error?: string }> {
const deadline = Date.now() + timeoutMs
while (Date.now() < deadline) {
const s = getStatus()
// 'connected' or 'disconnected' (with error) means we have a definitive answer
if (s.status !== 'connecting') return s
await sleep(intervalMs)
}
return getStatus()
}
export async function POST(request: NextRequest) {
try {
const { platform } = await request.json()
if (platform !== 'discord' && platform !== 'dingtalk' && platform !== 'lark' && platform !== 'telegram' && platform !== 'slack') {
return NextResponse.json({ success: false, error: '无效的平台' }, { status: 400 })
}
const mgr = ConfigManager.getInstance()
await mgr.ensureLoaded()
const config = mgr.get()
// Reject test for disabled platforms
const platformConfig = config[platform as keyof typeof config] as { enabled: boolean }
if (!platformConfig?.enabled) {
return NextResponse.json({ success: false, error: '该渠道已禁用,请先启用后再测试' }, { status: 400 })
}
if (platform === 'discord') {
if (!config.discord.botToken) {
return NextResponse.json({ success: false, error: 'Discord Bot Token 未配置' })
}
try {
const bot = await import('@/remote-control/bots/discord')
await bot.stopBot()
await bot.startBot(config.discord.botToken)
const status = await waitForConnection(() => bot.getStatus())
return NextResponse.json({
success: status.status === 'connected',
status,
error: status.status !== 'connected' ? (status.error || '连接超时,请检查 Token 是否正确') : undefined,
})
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
return NextResponse.json({ success: false, error: `Discord 连接失败: ${msg}` })
}
}
if (platform === 'dingtalk') {
if (!config.dingtalk.clientId || !config.dingtalk.clientSecret) {
return NextResponse.json({ success: false, error: '钉钉 Client ID 或 Client Secret 未配置' })
}
try {
const bot = await import('@/remote-control/bots/dingtalk')
await bot.stopBot()
await bot.startBot(config.dingtalk.clientId, config.dingtalk.clientSecret)
const status = await waitForConnection(() => bot.getStatus())
return NextResponse.json({
success: status.status === 'connected',
status,
error: status.status !== 'connected' ? (status.error || '连接超时,请检查凭证是否正确') : undefined,
})
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
return NextResponse.json({ success: false, error: `钉钉连接失败: ${msg}` })
}
}
if (platform === 'lark') {
if (!config.lark.appId || !config.lark.appSecret) {
return NextResponse.json({ success: false, error: '飞书 App ID 或 App Secret 未配置' })
}
try {
const bot = await import('@/remote-control/bots/lark')
await bot.stopBot()
await bot.startBot(config.lark.appId, config.lark.appSecret)
const status = await waitForConnection(() => bot.getStatus())
return NextResponse.json({
success: status.status === 'connected',
status,
error: status.status !== 'connected' ? (status.error || '连接超时,请检查凭证是否正确') : undefined,
})
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
return NextResponse.json({ success: false, error: `飞书连接失败: ${msg}` })
}
}
if (platform === 'telegram') {
if (!config.telegram.botToken) {
return NextResponse.json({ success: false, error: 'Telegram Bot Token 未配置' })
}
try {
const bot = await import('@/remote-control/bots/telegram')
await bot.stopBot()
await bot.startBot(config.telegram.botToken)
const status = await waitForConnection(() => bot.getStatus())
return NextResponse.json({
success: status.status === 'connected',
status,
error: status.status !== 'connected' ? (status.error || '连接超时,请检查 Token 是否正确') : undefined,
})
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
return NextResponse.json({ success: false, error: `Telegram 连接失败: ${msg}` })
}
}
if (platform === 'slack') {
if (!config.slack.botToken || !config.slack.appToken) {
return NextResponse.json({ success: false, error: 'Slack Bot Token 或 App Token 未配置' })
}
try {
const bot = await import('@/remote-control/bots/slack')
await bot.stopBot()
await bot.startBot(config.slack.botToken, config.slack.appToken)
const status = await waitForConnection(() => bot.getStatus())
return NextResponse.json({
success: status.status === 'connected',
status,
error: status.status !== 'connected' ? (status.error || '连接超时,请检查凭证是否正确') : undefined,
})
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
return NextResponse.json({ success: false, error: `Slack 连接失败: ${msg}` })
}
}
} catch {
return NextResponse.json({ success: false, error: '请求解析失败' }, { status: 400 })
}
}