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) }