1
0
mirror of git://jb55.com/damus synced 2024-09-18 19:23:49 +00:00

filters: generalize ContentFilter

This simplifies our content filters so that it is a bit more flexible
for future additions.

Fixes: 0957cc896cc8 ("Add "Do not show #nsfw tagged posts" setting")
This commit is contained in:
William Casarin 2023-09-21 08:30:23 -04:00
parent 49283f2bb2
commit 440e37c1d3
3 changed files with 36 additions and 39 deletions

View File

@ -82,12 +82,7 @@ struct ContentView: View {
@StateObject var navigationCoordinator: NavigationCoordinator = NavigationCoordinator() @StateObject var navigationCoordinator: NavigationCoordinator = NavigationCoordinator()
@AppStorage("has_seen_suggested_users") private var hasSeenSuggestedUsers = false @AppStorage("has_seen_suggested_users") private var hasSeenSuggestedUsers = false
let sub_id = UUID().description let sub_id = UUID().description
var damus_filter: DamusFilter {
get {
return DamusFilter(hide_nsfw_tagged_content: self.damus_state?.settings.hide_nsfw_tagged_content ?? true)
}
}
@Environment(\.colorScheme) var colorScheme @Environment(\.colorScheme) var colorScheme
// connect retry timer // connect retry timer
@ -97,7 +92,13 @@ struct ContentView: View {
Text("Are you lost?", comment: "Text asking the user if they are lost in the app.") Text("Are you lost?", comment: "Text asking the user if they are lost in the app.")
.id("what") .id("what")
} }
func content_filter(_ fstate: FilterState) -> ((NostrEvent) -> Bool) {
var filters = ContentFilters.defaults(damus_state!.settings)
filters.append(fstate.filter)
return ContentFilters(filters: filters).filter
}
var PostingTimelineView: some View { var PostingTimelineView: some View {
VStack { VStack {
ZStack { ZStack {
@ -105,10 +106,10 @@ struct ContentView: View {
// This is needed or else there is a bug when switching from the 3rd or 2nd tab to first. no idea why. // This is needed or else there is a bug when switching from the 3rd or 2nd tab to first. no idea why.
mystery mystery
contentTimelineView(filter: damus_filter.get_filter(.posts)) contentTimelineView(filter: content_filter(.posts))
.tag(FilterState.posts) .tag(FilterState.posts)
.id(FilterState.posts) .id(FilterState.posts)
contentTimelineView(filter: damus_filter.get_filter(.posts_and_replies)) contentTimelineView(filter: content_filter(.posts_and_replies))
.tag(FilterState.posts_and_replies) .tag(FilterState.posts_and_replies)
.id(FilterState.posts_and_replies) .id(FilterState.posts_and_replies)
} }

View File

@ -7,15 +7,9 @@
import Foundation import Foundation
protocol ContentFilter {
/// Function that implements the content filtering logic
/// - Parameter ev: The nostr event to be processed
/// - Returns: Must return `true` to show events, and return `false` to hide/filter events
func filter(ev: NostrEvent) -> Bool
}
/// Simple filter to determine whether to show posts or all posts and replies. /// Simple filter to determine whether to show posts or all posts and replies.
enum FilterState : Int, ContentFilter { enum FilterState : Int {
case posts_and_replies = 1 case posts_and_replies = 1
case posts = 0 case posts = 0
@ -30,29 +24,31 @@ enum FilterState : Int, ContentFilter {
} }
/// Simple filter to determine whether to show posts with #nsfw tags /// Simple filter to determine whether to show posts with #nsfw tags
struct NSFWTagFilter: ContentFilter { func nsfw_tag_filter(ev: NostrEvent) -> Bool {
func filter(ev: NostrEvent) -> Bool {
return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil
}
} }
/// Generic filter with various tweakable settings /// Generic filter with various tweakable settings
struct DamusFilter: ContentFilter { struct ContentFilters {
let hide_nsfw_tagged_content: Bool var filters: [(NostrEvent) -> Bool]
func filter(ev: NostrEvent) -> Bool { func filter(ev: NostrEvent) -> Bool {
if self.hide_nsfw_tagged_content { for filter in filters {
return NSFWTagFilter().filter(ev: ev) if !filter(ev) {
} return false
else { }
return true
} }
return true
}
}
extension ContentFilters {
static func defaults(_ settings: UserSettingsStore) -> [(NostrEvent) -> Bool] {
var filters = Array<(NostrEvent) -> Bool>()
if settings.hide_nsfw_tagged_content {
filters.append(nsfw_tag_filter)
}
return filters
} }
func get_filter(_ filter_state: FilterState) -> ((NostrEvent) -> Bool) {
return { ev in
return filter_state.filter(ev: ev) && self.filter(ev: ev)
}
}
} }

View File

@ -14,10 +14,10 @@ struct SearchHomeView: View {
@StateObject var model: SearchHomeModel @StateObject var model: SearchHomeModel
@State var search: String = "" @State var search: String = ""
@FocusState private var isFocused: Bool @FocusState private var isFocused: Bool
var damus_filter: DamusFilter {
get { var content_filter: (NostrEvent) -> Bool {
return DamusFilter(hide_nsfw_tagged_content: self.damus_state.settings.hide_nsfw_tagged_content) let filters = ContentFilters.defaults(self.damus_state.settings)
} return ContentFilters(filters: filters).filter
} }
let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) }) let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) })
@ -55,7 +55,7 @@ struct SearchHomeView: View {
damus: damus_state, damus: damus_state,
show_friend_icon: true, show_friend_icon: true,
filter: { ev in filter: { ev in
if !damus_filter.filter(ev: ev) { if !content_filter(ev) {
return false return false
} }