feat: add content filtering functionality

- Introduce kikifilter package with IsWordsInText() function for word filtering
- Add FiltredWorlds configuration option to KikiSettings
- Integrate filtering into service to prevent posting filtered content
- Update Dockerfile and Makefile to include filter package
- Add example configuration with filtered words
This commit is contained in:
B4D_US3R 2026-03-07 13:47:20 +00:00
parent 95c95031d8
commit 3b0b688843
7 changed files with 32 additions and 14 deletions

View file

@ -4,12 +4,13 @@ RUN apk add --no-cache make
WORKDIR /app/kiki WORKDIR /app/kiki
RUN mkdir /app/kiki/config /app/kiki/service /app/kiki/stacker /app/kiki/tooter /app/kiki/file_watcher RUN mkdir /app/kiki/config /app/kiki/service /app/kiki/stacker /app/kiki/tooter /app/kiki/file_watcher /app/kiki/filter
COPY config/* /app/kiki/config COPY config/* /app/kiki/config
COPY service/* /app/kiki/service COPY service/* /app/kiki/service
COPY stacker/* /app/kiki/stacker COPY stacker/* /app/kiki/stacker
COPY tooter/* /app/kiki/tooter COPY tooter/* /app/kiki/tooter
COPY filter/* /app/kiki/filter
COPY file_watcher/* /app/kiki/file_watcher COPY file_watcher/* /app/kiki/file_watcher
COPY Makefile /app/kiki/ COPY Makefile /app/kiki/

View file

@ -9,7 +9,9 @@ stacker/go.sum : stacker/go.mod
cd stacker && go mod tidy && cd ../ cd stacker && go mod tidy && cd ../
service/go.sum : service/go.mod service/go.sum : service/go.mod
cd service && go mod tidy && cd ../ cd service && go mod tidy && cd ../
service/kiki : service/kiki.go service/kiki : service/kiki.go
go build -C service go build -C service
clean : clean :
rm kiki tooter/go.sum config/go.sum stacker/go.sum service/go.sum rm kiki tooter/go.sum config/go.sum stacker/go.sum service/go.sum

View file

@ -19,6 +19,7 @@ type KikiSettings struct {
Redis struct { Redis struct {
Address string `yaml:"address"` Address string `yaml:"address"`
} `yaml:"redis"` } `yaml:"redis"`
FiltredWorlds []string `yaml:"filtred_worlds,flow"`
} }
// Структура secret.conf // Структура secret.conf

View file

@ -1,12 +1,17 @@
package filter package kikifilter
import "strings" import (
"fmt"
"strings"
)
// Функция, проверяющая что запрещенные слова отсутсвуют в текста // Функция, проверяющая что запрещенные слова отсутсвуют в текста
// Возвращает true если слова есть в тексте, возвращает false если их нет // Возвращает true если слова есть в тексте, возвращает false если их нет
func isWordsInText(text string, words []string) bool { func IsWordsInText(text string, words []string) bool {
fmt.Println(words)
for _, v := range words { for _, v := range words {
if strings.ContainsAny(text, v) { if strings.Contains(text, v) {
fmt.Println(strings.Contains(text, v))
return true return true
} }
} }

View file

@ -1,3 +1,3 @@
module git.catgirls.asia/B4D_US3R/kiki/filter module kiki/kikifilter
go 1.22.2 go 1.22.2

View file

@ -8,13 +8,16 @@ replace kiki/stacker => ../stacker
replace kiki/tooter => ../tooter replace kiki/tooter => ../tooter
replace kiki/file_watcher => ../file_watcher/ replace kiki/file_watcher => ../file_watcher
replace kiki/kikifilter => ../filter
require ( require (
github.com/mattn/go-mastodon v0.0.9 github.com/mattn/go-mastodon v0.0.9
github.com/urfave/cli/v3 v3.2.0 github.com/urfave/cli/v3 v3.2.0
kiki/config v0.0.0-00010101000000-000000000000 kiki/config v0.0.0-00010101000000-000000000000
kiki/file_watcher v0.0.0-00010101000000-000000000000 kiki/file_watcher v0.0.0-00010101000000-000000000000
kiki/kikifilter v0.0.0-00010101000000-000000000000
kiki/stacker v0.0.0-00010101000000-000000000000 kiki/stacker v0.0.0-00010101000000-000000000000
kiki/tooter v0.0.0-00010101000000-000000000000 kiki/tooter v0.0.0-00010101000000-000000000000
) )

View file

@ -2,6 +2,7 @@ package main
import ( import (
"context" "context"
"fmt"
"log" "log"
"net/url" "net/url"
"os" "os"
@ -11,6 +12,7 @@ import (
"kiki/config" "kiki/config"
"kiki/file_watcher" "kiki/file_watcher"
"kiki/kikifilter"
"kiki/stacker" "kiki/stacker"
"kiki/tooter" "kiki/tooter"
@ -56,6 +58,7 @@ func main() {
log.Println(err) log.Println(err)
} }
kikiConfig := config.GetKikiConfig(confFile) kikiConfig := config.GetKikiConfig(confFile)
fmt.Println(kikiConfig.FiltredWorlds)
lastFileMod, err := file_watcher.GetFileModTime(confFile) lastFileMod, err := file_watcher.GetFileModTime(confFile)
log.Println(lastFileMod) log.Println(lastFileMod)
@ -88,15 +91,18 @@ func main() {
} }
if !inStack { if !inStack {
log.Println(post.Description) log.Println(post.Description)
toot, err := tooter.CreateToot(*mastoClient, post, rssUrl.Sensitive, rssUrl.Visibility) if !kikifilter.IsWordsInText(post.Description, kikiConfig.FiltredWorlds) {
if err != nil {
log.Println(err) toot, err := tooter.CreateToot(*mastoClient, post, rssUrl.Sensitive, rssUrl.Visibility)
if err != nil {
log.Println(err)
}
tooter.CreatePost(*mastoClient, toot)
} }
tooter.CreatePost(*mastoClient, toot)
stacker.SetToRedis(rdb, post.GUID, post.Description) stacker.SetToRedis(rdb, post.GUID, post.Description)
} }
} }