From 61737b124f7193f30a5a92b95af4dd29dad1e5a4 Mon Sep 17 00:00:00 2001 From: harold Date: Mon, 28 Apr 2025 22:11:47 +0500 Subject: [PATCH] add filter words and links --- internal/service/donat/donat.go | 64 ++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index ec792b7..fd9fc60 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -9,7 +9,9 @@ import ( "log/slog" "mime/multipart" "net/http" + "regexp" "strconv" + "strings" ) type ServiceDonat struct { @@ -682,17 +684,52 @@ func (donatService *ServiceDonat) InitNewStreamer( ) } +// Добавляем функцию замены слов +func replaceFilteredWords(text string, words []string) string { + if len(words) == 0 { + return text + } + + // Экранируем специальные символы в словах + escapedWords := make([]string, len(words)) + for i, word := range words { + escapedWords[i] = regexp.QuoteMeta(word) + } + + // Создаем регулярное выражение для поиска целых слов без учета регистра + pattern := `(?i)\b(` + strings.Join(escapedWords, "|") + `)\b` + re := regexp.MustCompile(pattern) + + // Заменяем найденные слова на звёздочки + return re.ReplaceAllStringFunc(text, func(match string) string { + return strings.Repeat("*", len(match)) + }) +} + func (donatService *ServiceDonat) GetPlayingDonat( ctx context.Context, streamerID int, ) (model.PlayingDonat, error) { playingDonat, err := donatService.donatRepo.GetPlayingDonat(ctx, streamerID) - if err != nil { slog.Error("Failed to get playing donat", "error", err) return model.PlayingDonat{}, err } + filteredSettings, err := donatService.GetFiltersSettings(ctx, streamerID) + if err != nil { + slog.Error("Failed to get filtered words", "error", err) + return model.PlayingDonat{}, err + } + + if len(filteredSettings.FilteredWords) > 0 { + playingDonat.Text = donatService.replaceFilteredWords(playingDonat.Text, filteredSettings.FilteredWords) + } + + if !filteredSettings.EnableLinks { + playingDonat.Text = donatService.replaceLinks(playingDonat.Text) + } + if playingDonat.OrderID == "" { return playingDonat, nil } @@ -744,3 +781,28 @@ func (donatService *ServiceDonat) UpdateAvatarStreamer( } return nil } + +func (donatService *ServiceDonat) replaceFilteredWords(text string, words []string) string { + if len(words) == 0 { + return text + } + + escapedWords := make([]string, len(words)) + for i, word := range words { + escapedWords[i] = regexp.QuoteMeta(word) + } + + pattern := `(?i)\b(` + strings.Join(escapedWords, "|") + `)\b` + re := regexp.MustCompile(pattern) + + return re.ReplaceAllStringFunc(text, func(match string) string { + return strings.Repeat("*", len(match)) + }) +} + +func (donatService *ServiceDonat) replaceLinks(text string) string { + re := regexp.MustCompile(`(?i)\bhttps?://\S+\b`) + return re.ReplaceAllStringFunc(text, func(match string) string { + return strings.Repeat("*", len(match)) + }) +}