ContentFilters.swift (1988B)
1 // 2 // ContentFilters.swift 3 // damus 4 // 5 // Created by Daniel D’Aquino on 2023-09-18. 6 // 7 8 import Foundation 9 10 11 /// Simple filter to determine whether to show posts or all posts and replies. 12 enum FilterState : Int { 13 case posts_and_replies = 1 14 case posts = 0 15 16 func filter(ev: NostrEvent) -> Bool { 17 switch self { 18 case .posts: 19 return ev.known_kind == .boost || !ev.is_reply(.empty) 20 case .posts_and_replies: 21 return true 22 } 23 } 24 } 25 26 /// Simple filter to determine whether to show posts with #nsfw tags 27 func nsfw_tag_filter(ev: NostrEvent) -> Bool { 28 return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil 29 } 30 31 func get_repost_of_muted_user_filter(damus_state: DamusState) -> ((_ ev: NostrEvent) -> Bool) { 32 return { ev in 33 guard ev.known_kind == .boost else { return true } 34 // This needs to use cached because it can be way too slow otherwise 35 guard let inner_ev = ev.get_cached_inner_event(cache: damus_state.events) else { return true } 36 return should_show_event(state: damus_state, ev: inner_ev) 37 } 38 } 39 40 /// Generic filter with various tweakable settings 41 struct ContentFilters { 42 var filters: [(NostrEvent) -> Bool] 43 44 func filter(ev: NostrEvent) -> Bool { 45 for filter in filters { 46 if !filter(ev) { 47 return false 48 } 49 } 50 51 return true 52 } 53 } 54 55 extension ContentFilters { 56 static func default_filters(damus_state: DamusState) -> ContentFilters { 57 return ContentFilters(filters: ContentFilters.defaults(damus_state: damus_state)) 58 } 59 60 static func defaults(damus_state: DamusState) -> [(NostrEvent) -> Bool] { 61 var filters = Array<(NostrEvent) -> Bool>() 62 if damus_state.settings.hide_nsfw_tagged_content { 63 filters.append(nsfw_tag_filter) 64 } 65 filters.append(get_repost_of_muted_user_filter(damus_state: damus_state)) 66 return filters 67 } 68 }