damus

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

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 }