diff --git a/initialize/telegram.go b/initialize/telegram.go index 5d8fc9d..0054ded 100644 --- a/initialize/telegram.go +++ b/initialize/telegram.go @@ -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") + } }