damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }