Files
aura-crm/production/backend/internal/maxbot/setup.go
T

61 lines
1.8 KiB
Go

package maxbot
import (
"bytes"
"context"
"encoding/json"
"log"
"net/http"
"production/internal/settings"
)
// EnsureWebhook registers webhookURL with MAX's POST /subscriptions so the
// bot starts receiving updates at Handler.Webhook — mirrors
// internal/tgbot.EnsureWebhook's fail-soft stance (missing token/secret/URL
// or a platform-side error is logged, never a startup failure). Re-run
// (i.e. restart the process) after changing the bot token or webhook
// secret in Settings.
func EnsureWebhook(s settings.Settings, webhookURL string) {
if s.MaxBotToken == "" || s.MaxWebhookSecret == "" || webhookURL == "" {
return
}
ctx, cancel := context.WithTimeout(context.Background(), sendTimeout)
defer cancel()
payload, err := json.Marshal(map[string]any{
"url": webhookURL,
"secret": s.MaxWebhookSecret,
"update_types": []string{"bot_started", "bot_stopped", "message_created"},
})
if err != nil {
log.Printf("maxbot: subscribe build failed: %v", err)
return
}
req, err := http.NewRequestWithContext(ctx, http.MethodPost, baseURL+"/subscriptions", bytes.NewReader(payload))
if err != nil {
log.Printf("maxbot: subscribe request build failed: %v", err)
return
}
req.Header.Set("Authorization", s.MaxBotToken)
req.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: sendTimeout}
resp, err := client.Do(req)
if err != nil {
log.Printf("maxbot: subscribe request failed: %v", err)
return
}
defer resp.Body.Close()
if resp.StatusCode >= 300 {
var apiErr struct {
Message string `json:"message"`
}
_ = json.NewDecoder(resp.Body).Decode(&apiErr)
log.Printf("maxbot: subscribe rejected (status %d): %s", resp.StatusCode, apiErr.Message)
return
}
log.Printf("maxbot: webhook registered at %s", webhookURL)
}