148 lines
5.9 KiB
TypeScript
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 })
|
|
}
|
|
}
|