moodlink-gofiber / services /moderation.go
chandafa's picture
deployment v0.1
1b18b9e
package services
import (
"bufio"
"log"
"os"
"regexp"
"strings"
)
var blockedTerms []string
var blockedRegexes []*regexp.Regexp
func InitModeration() error {
file, err := os.Open("moderation/words.txt")
if err != nil {
log.Println("Moderation words file not found, creating default...")
return createDefaultModerationFile()
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if line == "" || strings.HasPrefix(line, "#") {
continue
}
blockedTerms = append(blockedTerms, strings.ToLower(line))
// Compile as regex for more flexible matching
regex, err := regexp.Compile("(?i)" + regexp.QuoteMeta(line))
if err == nil {
blockedRegexes = append(blockedRegexes, regex)
}
}
log.Printf("Loaded %d moderation terms", len(blockedTerms))
return scanner.Err()
}
func createDefaultModerationFile() error {
err := os.MkdirAll("moderation", 0755)
if err != nil {
return err
}
defaultTerms := []string{
"# Moderation Terms - one per line",
"# Lines starting with # are comments",
"spam",
"scam",
"hate",
"abuse",
"violence",
"suicide",
"self-harm",
"drugs",
"illegal",
}
file, err := os.Create("moderation/words.txt")
if err != nil {
return err
}
defer file.Close()
for _, term := range defaultTerms {
file.WriteString(term + "\n")
}
log.Println("Created default moderation file")
return nil
}
func CheckContent(content string) bool {
if len(blockedRegexes) == 0 {
return false
}
contentLower := strings.ToLower(content)
for _, regex := range blockedRegexes {
if regex.MatchString(contentLower) {
log.Printf("Content flagged by moderation: matched pattern")
return true
}
}
return false
}
func GetBlockedTermsCount() int {
return len(blockedTerms)
}