|
|
package service |
|
|
|
|
|
import ( |
|
|
"errors" |
|
|
"strings" |
|
|
|
|
|
"github.com/QuantumNous/new-api/dto" |
|
|
"github.com/QuantumNous/new-api/setting" |
|
|
) |
|
|
|
|
|
func CheckSensitiveMessages(messages []dto.Message) ([]string, error) { |
|
|
if len(messages) == 0 { |
|
|
return nil, nil |
|
|
} |
|
|
|
|
|
for _, message := range messages { |
|
|
arrayContent := message.ParseContent() |
|
|
for _, m := range arrayContent { |
|
|
if m.Type == "image_url" { |
|
|
|
|
|
continue |
|
|
} |
|
|
|
|
|
if m.Text == "" { |
|
|
continue |
|
|
} |
|
|
if ok, words := SensitiveWordContains(m.Text); ok { |
|
|
return words, errors.New("sensitive words detected") |
|
|
} |
|
|
} |
|
|
} |
|
|
return nil, nil |
|
|
} |
|
|
|
|
|
func CheckSensitiveText(text string) (bool, []string) { |
|
|
return SensitiveWordContains(text) |
|
|
} |
|
|
|
|
|
|
|
|
func SensitiveWordContains(text string) (bool, []string) { |
|
|
if len(setting.SensitiveWords) == 0 { |
|
|
return false, nil |
|
|
} |
|
|
if len(text) == 0 { |
|
|
return false, nil |
|
|
} |
|
|
checkText := strings.ToLower(text) |
|
|
return AcSearch(checkText, setting.SensitiveWords, true) |
|
|
} |
|
|
|
|
|
|
|
|
func SensitiveWordReplace(text string, returnImmediately bool) (bool, []string, string) { |
|
|
if len(setting.SensitiveWords) == 0 { |
|
|
return false, nil, text |
|
|
} |
|
|
checkText := strings.ToLower(text) |
|
|
m := getOrBuildAC(setting.SensitiveWords) |
|
|
hits := m.MultiPatternSearch([]rune(checkText), returnImmediately) |
|
|
if len(hits) > 0 { |
|
|
words := make([]string, 0, len(hits)) |
|
|
var builder strings.Builder |
|
|
builder.Grow(len(text)) |
|
|
lastPos := 0 |
|
|
|
|
|
for _, hit := range hits { |
|
|
pos := hit.Pos |
|
|
word := string(hit.Word) |
|
|
builder.WriteString(text[lastPos:pos]) |
|
|
builder.WriteString("**###**") |
|
|
lastPos = pos + len(word) |
|
|
words = append(words, word) |
|
|
} |
|
|
builder.WriteString(text[lastPos:]) |
|
|
return true, words, builder.String() |
|
|
} |
|
|
return false, nil, text |
|
|
} |
|
|
|