From 9a74359210d5ccc8ddc6cecd705f8b8e26547d26 Mon Sep 17 00:00:00 2001 From: Barry Deen Date: Sat, 4 Jan 2025 15:56:24 -0500 Subject: [PATCH] ignore follow list for people who follow spammers --- .env.example | 5 ++++- README.md | 1 + main.go | 30 ++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index ff98e5f..9c146b7 100644 --- a/.env.example +++ b/.env.example @@ -24,4 +24,7 @@ ARCHIVAL_SYNC="FALSE" ARCHIVE_REACTIONS="FALSE" # optional, reactions take up a lot of space and compute # optional, certain note kinds older than this many days will be deleted -MAX_AGE_DAYS=365 \ No newline at end of file +MAX_AGE_DAYS=365 + +# comma delimited list of pubkeys who follow bots and ruin the WoT +IGNORE_FOLLOWS_LIST="" \ No newline at end of file diff --git a/README.md b/README.md index a8a0b65..cf76c35 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ REFRESH_INTERVAL_HOURS=24 # interval in hours to refresh the web of trust MINIMUM_FOLLOWERS=3 #how many followers before they're allowed in the WoT ARCHIVAL_SYNC="FALSE" # set to TRUE to archive every note from every person in the WoT (not recommended) ARCHIVE_REACTIONS="FALSE" # set to TRUE to archive every reaction from every person in the WoT (not recommended) +IGNORE_FOLLOWS_LIST="" # comma separated list of pubkeys who follow too many bots and ruin the WoT ``` ### 4. Build the project diff --git a/main.go b/main.go index 77f5efc..ce6c439 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "net/http" "os" "strconv" + "strings" "time" "github.com/fiatjaf/eventstore" @@ -38,6 +39,7 @@ type Config struct { RelayIcon string MaxAgeDays int ArchiveReactions bool + IgnoredPubkeys []string } var pool *nostr.SimplePool @@ -209,6 +211,11 @@ func LoadConfig() Config { os.Setenv("ARCHIVE_REACTIONS", "FALSE") } + ignoredPubkeys := []string{} + if ignoreList := os.Getenv("IGNORE_FOLLOWS_LIST"); ignoreList != "" { + ignoredPubkeys = splitAndTrim(ignoreList) + } + minimumFollowers, _ := strconv.Atoi(os.Getenv("MINIMUM_FOLLOWERS")) maxAgeDays, _ := strconv.Atoi(os.Getenv("MAX_AGE_DAYS")) @@ -227,6 +234,7 @@ func LoadConfig() Config { ArchivalSync: getEnv("ARCHIVAL_SYNC") == "TRUE", MaxAgeDays: maxAgeDays, ArchiveReactions: getEnv("ARCHIVE_REACTIONS") == "TRUE", + IgnoredPubkeys: ignoredPubkeys, } return config @@ -290,6 +298,11 @@ func refreshTrustNetwork(ctx context.Context, relay *khatru.Relay) { log.Println("🔍 fetching owner's follows") for ev := range pool.SubManyEose(timeoutCtx, seedRelays, filters) { for _, contact := range ev.Event.Tags.GetAll([]string{"p"}) { + pubkey := contact[1] + if isIgnored(pubkey, config.IgnoredPubkeys) { + fmt.Println("ignoring follows from pubkey: ", pubkey) + continue + } pubkeyFollowerCount[contact[1]]++ // Increment follower count for the pubkey appendOneHopNetwork(contact[1]) } @@ -523,3 +536,20 @@ func getDB() badger.BadgerBackend { Path: getEnv("DB_PATH"), } } + +func splitAndTrim(input string) []string { + items := strings.Split(input, ",") + for i, item := range items { + items[i] = strings.TrimSpace(item) + } + return items +} + +func isIgnored(pubkey string, ignoredPubkeys []string) bool { + for _, ignored := range ignoredPubkeys { + if pubkey == ignored { + return true + } + } + return false +}