ContentFilters.swift (2093B)
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 = 0 14 case posts_and_replies = 1 15 case conversations = 2 16 17 func filter(ev: NostrEvent) -> Bool { 18 switch self { 19 case .posts: 20 return ev.known_kind == .boost || ev.known_kind == .highlight || !ev.is_reply() 21 case .posts_and_replies: 22 return true 23 case .conversations: 24 return true 25 } 26 } 27 } 28 29 /// Simple filter to determine whether to show posts with #nsfw tags 30 func nsfw_tag_filter(ev: NostrEvent) -> Bool { 31 return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil 32 } 33 34 func get_repost_of_muted_user_filter(damus_state: DamusState) -> ((_ ev: NostrEvent) -> Bool) { 35 return { ev in 36 guard ev.known_kind == .boost else { return true } 37 // This needs to use cached because it can be way too slow otherwise 38 guard let inner_ev = ev.get_cached_inner_event(cache: damus_state.events) else { return true } 39 return should_show_event(state: damus_state, ev: inner_ev) 40 } 41 } 42 43 /// Generic filter with various tweakable settings 44 struct ContentFilters { 45 var filters: [(NostrEvent) -> Bool] 46 47 func filter(ev: NostrEvent) -> Bool { 48 for filter in filters { 49 if !filter(ev) { 50 return false 51 } 52 } 53 54 return true 55 } 56 } 57 58 extension ContentFilters { 59 static func default_filters(damus_state: DamusState) -> ContentFilters { 60 return ContentFilters(filters: ContentFilters.defaults(damus_state: damus_state)) 61 } 62 63 static func defaults(damus_state: DamusState) -> [(NostrEvent) -> Bool] { 64 var filters = Array<(NostrEvent) -> Bool>() 65 if damus_state.settings.hide_nsfw_tagged_content { 66 filters.append(nsfw_tag_filter) 67 } 68 filters.append(get_repost_of_muted_user_filter(damus_state: damus_state)) 69 return filters 70 } 71 }