94 lines
2.8 KiB
Go
94 lines
2.8 KiB
Go
package spam
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"code.nonshy.com/nonshy/website/pkg/models"
|
|
)
|
|
|
|
// SpamWebsites to third-party video hosting apps: we already have our own chat room, and third-party links shared in
|
|
// public places can pose a risk to user privacy/safety.
|
|
var SpamWebsites = []string{
|
|
"join.skype.com",
|
|
"zoom.us",
|
|
"whereby.com",
|
|
"meet.jit.si",
|
|
"https://t.me",
|
|
}
|
|
|
|
// DetectSpamMessage searches a message (such as a comment, forum post, etc.) for spammy contents such as Skype invite links
|
|
// and returns an error if found.
|
|
func DetectSpamMessage(message string) error {
|
|
for _, link := range SpamWebsites {
|
|
if strings.Contains(message, link) {
|
|
return errors.New(
|
|
"Your message could not be posted because it contains a link to a third-party video chat website. " +
|
|
"In the interest of protecting our community, we do not allow linking to third-party video conferencing apps where user " +
|
|
"privacy and security may not hold up to our standards, or where the content may run against our terms of service.",
|
|
)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RestrictSearchTerm can remove/replace search words to exclude blacklisted terms.
|
|
func RestrictSearchTerms(terms *models.Search) (*models.Search, error) {
|
|
var (
|
|
m = map[string]interface{}{}
|
|
result = &models.Search{}
|
|
r1, r2 int
|
|
)
|
|
|
|
// Map the blacklist for easy lookup.
|
|
for _, term := range restrictedSearchTerms {
|
|
m[term] = nil
|
|
}
|
|
|
|
// Filter the includes+excludes.
|
|
result.Includes, r1 = restrictTermsFrom(terms.Includes, m)
|
|
result.Excludes, r2 = restrictTermsFrom(terms.Excludes, m)
|
|
|
|
// If we have excluded everything down to zero.
|
|
if len(terms.Includes) > 0 && len(result.Includes) == 0 {
|
|
result.Includes = append(result.Includes, "36c49b88-dd0c-4b9f-a4e1-f0c73c976ce2")
|
|
}
|
|
|
|
// Were there restrictions?
|
|
if r1+r2 > 0 {
|
|
return result, errors.New("some search terms were restricted")
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// Restricted search terms.
|
|
var restrictedSearchTerms = []string{
|
|
"open", "mind", "minded", "openminded", "openmind", "taboo", "tabboo", "perv", "pervy", "grew", "raised", "raise",
|
|
"children", "child", "kid", "kids", "dad", "dads", "mom", "moms", "father", "mother", "underage", "yng", "ynger", "family", "families",
|
|
"18", "shota", "shotacon", "loli", "lolicon", "jailbait", "incest", "limit", "limits", "uninhibited", "depraved", "age", "ages",
|
|
"son", "daughter", "sons", "daughters",
|
|
}
|
|
|
|
func restrictTermsFrom(terms []string, blacklist map[string]interface{}) ([]string, int) {
|
|
var (
|
|
result []string
|
|
count int
|
|
)
|
|
|
|
for _, term := range terms {
|
|
// Break words in "quoted strings" too.
|
|
words := strings.Split(term, " ")
|
|
for _, word := range words {
|
|
if _, ok := blacklist[strings.ToLower(word)]; ok {
|
|
count++
|
|
continue
|
|
}
|
|
result = append(result, word)
|
|
}
|
|
}
|
|
|
|
return result, count
|
|
}
|