61 lines
1.8 KiB
Go
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)
|
|
}
|