| | package service |
| |
|
| | import ( |
| | "errors" |
| | "fmt" |
| | "one-api/dto" |
| | "one-api/setting" |
| | "strings" |
| | ) |
| |
|
| | 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) ([]string, error) { |
| | if ok, words := SensitiveWordContains(text); ok { |
| | return words, errors.New("sensitive words detected") |
| | } |
| | return nil, nil |
| | } |
| |
|
| | func CheckSensitiveInput(input any) ([]string, error) { |
| | switch v := input.(type) { |
| | case string: |
| | return CheckSensitiveText(v) |
| | case []string: |
| | var builder strings.Builder |
| | for _, s := range v { |
| | builder.WriteString(s) |
| | } |
| | return CheckSensitiveText(builder.String()) |
| | } |
| | return CheckSensitiveText(fmt.Sprintf("%v", input)) |
| | } |
| |
|
| | |
| | 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 := InitAc(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 |
| | } |
| |
|