package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"regexp"
"strings"
"time"
)
// mattermostSend отправляет сообщение в Mattermost через Incoming Webhook.
// HTML-теги из Telegram автоматически конвертируются в Markdown.
// Если вебхук не настроен — пишет в лог и не паникует.
func mattermostSend(message string) error {
if !isMattermostConfigured() {
log.Printf("[Mattermost] Не настроен (нужен MATTERMOST_WEBHOOK_URL) — пропускаем")
return fmt.Errorf("mattermost не настроен")
}
mdMessage := mmHTMLToMarkdown(message)
payload := map[string]string{
"text": mdMessage,
}
jsonData, err := json.Marshal(payload)
if err != nil {
return fmt.Errorf("marshal error: %w", err)
}
log.Printf("[Mattermost] Отправка вебхук: %s", cfgMattermostWebhookURL)
client := &http.Client{Timeout: 15 * time.Second}
resp, err := client.Post(cfgMattermostWebhookURL, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
return fmt.Errorf("ошибка отправки в Mattermost (webhook: %s): %w", cfgMattermostWebhookURL, err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp.Body)
return fmt.Errorf("mattermost webhook error: status %d, body: %s", resp.StatusCode, string(body))
}
return nil
}
// mmHTMLToMarkdown конвертирует HTML-теги Telegram в Markdown для Mattermost.
//
// текст → **текст**
// текст → _текст_
// текст → `текст`
//
текст→ ```текст``` // ━━━ (разделители) → --- // Остальные теги → удаляются func mmHTMLToMarkdown(html string) string { s := html // ... → **...** s = regexp.MustCompile(`([\s\S]*?)`).ReplaceAllString(s, "**$1**") // ... → _..._ s = regexp.MustCompile(`([\s\S]*?)`).ReplaceAllString(s, "_$1_") //
... → `...`
s = regexp.MustCompile(`([\s\S]*?)`).ReplaceAllString(s, "`$1`")
// ...→ ```...``` s = regexp.MustCompile(`
([\s\S]*?)`).ReplaceAllString(s, "```$1```") // HTML-entities s = strings.ReplaceAll(s, "<", "<") s = strings.ReplaceAll(s, ">", ">") s = strings.ReplaceAll(s, "&", "&") s = strings.ReplaceAll(s, """, `"`) // Горизонтальные разделители (━━━...) → --- s = regexp.MustCompile(`━+`).ReplaceAllString(s, "---") // Убираем оставшиеся HTML-теги s = regexp.MustCompile(`<[^>]+>`).ReplaceAllString(s, "") // Убираем лишние пустые строки (более двух подряд) s = regexp.MustCompile(`\n{3,}`).ReplaceAllString(s, "\n\n") return strings.TrimSpace(s) }