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