refactor(telegram): 优化 Telegram 初始化逻辑,优先使用数据库配置
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 5m53s

重构 Telegram 初始化流程,优先从数据库获取配置并添加回退逻辑
移除未使用的 config.Telegram 依赖
添加 webhook 删除操作以避免长轮询冲突
This commit is contained in:
shanshanzhong 2025-12-21 23:28:13 -08:00
parent 74f4a12422
commit e42a5b80bf

View File

@ -7,7 +7,6 @@ import (
"github.com/perfect-panel/server/pkg/logger"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/perfect-panel/server/internal/config"
"github.com/perfect-panel/server/internal/logic/telegram"
"github.com/perfect-panel/server/internal/model/auth"
"github.com/perfect-panel/server/internal/svc"
@ -16,26 +15,30 @@ import (
func Telegram(svc *svc.ServiceContext) {
// Prefer BotToken from DB auth method, fallback to config file
var usedToken string
var webHookDomain string
method, err := svc.AuthModel.FindOneByMethod(context.Background(), "telegram")
if err != nil {
logger.Errorf("[Init Telegram Config] Get Telegram Config Error: %s", err.Error())
return
if err == nil {
tgConfig := new(auth.TelegramAuthConfig)
if err = tgConfig.Unmarshal(method.Config); err == nil {
usedToken = tgConfig.BotToken
webHookDomain = tgConfig.WebHookDomain
} else {
logger.Errorf("[Init Telegram Config] Unmarshal Telegram Config Error: %s", err.Error())
}
} else {
logger.Debugf("[Init Telegram Config] No Telegram method in DB, fallback to file config: %s", err.Error())
}
var tg config.Telegram
tgConfig := new(auth.TelegramAuthConfig)
if err = tgConfig.Unmarshal(method.Config); err != nil {
logger.Errorf("[Init Telegram Config] Unmarshal Telegram Config Error: %s", err.Error())
return
}
usedToken := tgConfig.BotToken
if usedToken == "" {
usedToken = svc.Config.Telegram.BotToken
if usedToken == "" {
logger.Debug("[Init Telegram Config] Telegram Token is empty")
return
}
}
if webHookDomain == "" {
webHookDomain = svc.Config.Telegram.WebHookDomain
}
if usedToken == "" {
logger.Debug("[Init Telegram Config] Telegram Token is empty")
return
}
bot, err := tgbotapi.NewBotAPI(usedToken)
@ -44,8 +47,12 @@ func Telegram(svc *svc.ServiceContext) {
return
}
if tgConfig.WebHookDomain == "" || svc.Config.Debug {
// set Long Polling mode
if webHookDomain == "" || svc.Config.Debug {
// Ensure webhook is removed to avoid long polling conflict
if _, derr := bot.MakeRequest("deleteWebhook", tgbotapi.Params{}); derr != nil {
logger.Errorf("[Init Telegram Config] Delete webhook failed: %s", derr.Error())
}
// Long Polling mode
updateConfig := tgbotapi.NewUpdate(0)
updateConfig.Timeout = 60
updates := bot.GetUpdatesChan(updateConfig)
@ -59,7 +66,7 @@ func Telegram(svc *svc.ServiceContext) {
}
}()
} else {
wh, err := tgbotapi.NewWebhook(fmt.Sprintf("%s/v1/telegram/webhook?secret=%s", tgConfig.WebHookDomain, tool.Md5Encode(usedToken, false)))
wh, err := tgbotapi.NewWebhook(fmt.Sprintf("%s/v1/telegram/webhook?secret=%s", webHookDomain, tool.Md5Encode(usedToken, false)))
if err != nil {
logger.Errorf("[Init Telegram Config] New Webhook Error: %s", err.Error())
return
@ -79,9 +86,12 @@ func Telegram(svc *svc.ServiceContext) {
svc.Config.Telegram.BotID = user.ID
svc.Config.Telegram.BotName = user.UserName
svc.Config.Telegram.BotToken = usedToken
svc.Config.Telegram.EnableNotify = tg.EnableNotify
svc.Config.Telegram.WebHookDomain = tg.WebHookDomain
svc.Config.Telegram.WebHookDomain = webHookDomain
svc.TelegramBot = bot
logger.Info("[Init Telegram Config] Webhook set success")
if webHookDomain == "" || svc.Config.Debug {
logger.Info("[Init Telegram Config] Long polling mode initialized")
} else {
logger.Info("[Init Telegram Config] Webhook set success")
}
}