1
0
mirror of git://jb55.com/damus synced 2024-09-30 00:40:45 +00:00

Mute: Add user_keypair to MutelistManager

The user keypair is necessary to determine whether or not a given event
is muted or not. Previously, the user keypair had to be passed on each
function call as an optional parameter, and word filtering would not
work unless the caller remembered to add the keypair parameter.

All usages of MutelistManager functions indicate that the desired base
keypair is always the same as the DamusState's keypair that owns the
MutelistManager. Therefore, it is simpler and less error prone to simply
pass the keypair to MutelistManager during its initialization.

Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
Daniel D’Aquino 2024-05-07 04:31:40 +00:00 committed by William Casarin
parent dcd7b5b111
commit e981ae247e
10 changed files with 20 additions and 15 deletions

View File

@ -28,7 +28,7 @@ struct NotificationExtensionState: HeadlessDamusState {
self.settings = UserSettingsStore() self.settings = UserSettingsStore()
self.contacts = Contacts(our_pubkey: keypair.pubkey) self.contacts = Contacts(our_pubkey: keypair.pubkey)
self.mutelist_manager = MutelistManager() self.mutelist_manager = MutelistManager(user_keypair: keypair)
self.keypair = keypair self.keypair = keypair
self.profiles = Profiles(ndb: ndb) self.profiles = Profiles(ndb: ndb)
self.zaps = Zaps(our_pubkey: keypair.pubkey) self.zaps = Zaps(our_pubkey: keypair.pubkey)

View File

@ -699,7 +699,7 @@ struct ContentView: View {
likes: EventCounter(our_pubkey: pubkey), likes: EventCounter(our_pubkey: pubkey),
boosts: EventCounter(our_pubkey: pubkey), boosts: EventCounter(our_pubkey: pubkey),
contacts: Contacts(our_pubkey: pubkey), contacts: Contacts(our_pubkey: pubkey),
mutelist_manager: MutelistManager(), mutelist_manager: MutelistManager(user_keypair: keypair),
profiles: Profiles(ndb: ndb), profiles: Profiles(ndb: ndb),
dms: home.dms, dms: home.dms,
previews: PreviewCache(), previews: PreviewCache(),

View File

@ -112,7 +112,7 @@ class DamusState: HeadlessDamusState {
likes: EventCounter(our_pubkey: empty_pub), likes: EventCounter(our_pubkey: empty_pub),
boosts: EventCounter(our_pubkey: empty_pub), boosts: EventCounter(our_pubkey: empty_pub),
contacts: Contacts(our_pubkey: empty_pub), contacts: Contacts(our_pubkey: empty_pub),
mutelist_manager: MutelistManager(), mutelist_manager: MutelistManager(user_keypair: kp),
profiles: Profiles(ndb: .empty), profiles: Profiles(ndb: .empty),
dms: DirectMessagesModel(our_pubkey: empty_pub), dms: DirectMessagesModel(our_pubkey: empty_pub),
previews: PreviewCache(), previews: PreviewCache(),

View File

@ -1148,8 +1148,8 @@ func should_show_event(event: NostrEvent, damus_state: DamusState) -> Bool {
) )
} }
func should_show_event(state: DamusState, ev: NostrEvent, keypair: Keypair? = nil) -> Bool { func should_show_event(state: DamusState, ev: NostrEvent) -> Bool {
let event_muted = state.mutelist_manager.is_event_muted(ev, keypair: keypair) let event_muted = state.mutelist_manager.is_event_muted(ev)
if event_muted { if event_muted {
return false return false
} }

View File

@ -8,12 +8,17 @@
import Foundation import Foundation
class MutelistManager { class MutelistManager {
let user_keypair: Keypair
private(set) var event: NostrEvent? = nil private(set) var event: NostrEvent? = nil
var users: Set<MuteItem> = [] var users: Set<MuteItem> = []
var hashtags: Set<MuteItem> = [] var hashtags: Set<MuteItem> = []
var threads: Set<MuteItem> = [] var threads: Set<MuteItem> = []
var words: Set<MuteItem> = [] var words: Set<MuteItem> = []
init(user_keypair: Keypair) {
self.user_keypair = user_keypair
}
func refresh_sets() { func refresh_sets() {
guard let referenced_mute_items = event?.referenced_mute_items else { return } guard let referenced_mute_items = event?.referenced_mute_items else { return }
@ -55,8 +60,8 @@ class MutelistManager {
} }
} }
func is_event_muted(_ ev: NostrEvent, keypair: Keypair? = nil) -> Bool { func is_event_muted(_ ev: NostrEvent) -> Bool {
return event_muted_reason(ev, keypair: keypair) != nil return self.event_muted_reason(ev) != nil
} }
func set_mutelist(_ ev: NostrEvent) { func set_mutelist(_ ev: NostrEvent) {
@ -120,9 +125,9 @@ class MutelistManager {
/// ///
/// - Parameter ev: The ``NostrEvent`` that you want to check the muted reason for. /// - Parameter ev: The ``NostrEvent`` that you want to check the muted reason for.
/// - Returns: The ``MuteItem`` that matched the event. Or `nil` if the event is not muted. /// - Returns: The ``MuteItem`` that matched the event. Or `nil` if the event is not muted.
func event_muted_reason(_ ev: NostrEvent, keypair: Keypair? = nil) -> MuteItem? { func event_muted_reason(_ ev: NostrEvent) -> MuteItem? {
// Events from the current user should not be muted. // Events from the current user should not be muted.
guard keypair?.pubkey != ev.pubkey else { return nil } guard self.user_keypair.pubkey != ev.pubkey else { return nil }
// Check if user is muted // Check if user is muted
let check_user_item = MuteItem.user(ev.pubkey, nil) let check_user_item = MuteItem.user(ev.pubkey, nil)
@ -147,7 +152,7 @@ class MutelistManager {
} }
// Check if word is muted // Check if word is muted
if let keypair, let content: String = ev.maybe_get_content(keypair)?.lowercased() { if let content: String = ev.maybe_get_content(self.user_keypair)?.lowercased() {
for word in words { for word in words {
if case .word(let string, _) = word { if case .word(let string, _) = word {
if content.contains(string.lowercased()) { if content.contains(string.lowercased()) {

View File

@ -37,7 +37,7 @@ func should_display_notification(state: HeadlessDamusState, event ev: NostrEvent
} }
// Don't show notifications that match mute list. // Don't show notifications that match mute list.
if state.mutelist_manager.is_event_muted(ev, keypair: state.keypair) { if state.mutelist_manager.is_event_muted(ev) {
return false return false
} }

View File

@ -73,7 +73,7 @@ var test_damus_state: DamusState = ({
likes: .init(our_pubkey: our_pubkey), likes: .init(our_pubkey: our_pubkey),
boosts: .init(our_pubkey: our_pubkey), boosts: .init(our_pubkey: our_pubkey),
contacts: .init(our_pubkey: our_pubkey), contacts: .init(our_pubkey: our_pubkey),
mutelist_manager: MutelistManager(), mutelist_manager: MutelistManager(user_keypair: test_keypair),
profiles: .init(ndb: ndb), profiles: .init(ndb: ndb),
dms: .init(our_pubkey: our_pubkey), dms: .init(our_pubkey: our_pubkey),
previews: .init(), previews: .init(),

View File

@ -20,7 +20,7 @@ struct DMChatView: View, KeyboardReadable {
ScrollViewReader { scroller in ScrollViewReader { scroller in
ScrollView { ScrollView {
LazyVStack(alignment: .leading) { LazyVStack(alignment: .leading) {
ForEach(Array(zip(dms.events, dms.events.indices)).filter { should_show_event(state: damus_state, ev: $0.0, keypair: damus_state.keypair)}, id: \.0.id) { (ev, ind) in ForEach(Array(zip(dms.events, dms.events.indices)).filter { should_show_event(state: damus_state, ev: $0.0)}, id: \.0.id) { (ev, ind) in
DMView(event: dms.events[ind], damus_state: damus_state) DMView(event: dms.events[ind], damus_state: damus_state)
.contextMenu{MenuItems(damus_state: damus_state, event: ev, target_pubkey: ev.pubkey, profileModel: ProfileModel(pubkey: ev.pubkey, damus: damus_state))} .contextMenu{MenuItems(damus_state: damus_state, event: ev, target_pubkey: ev.pubkey, profileModel: ProfileModel(pubkey: ev.pubkey, damus: damus_state))}
} }

View File

@ -55,7 +55,7 @@ struct DirectMessagesView: View {
func MaybeEvent(_ model: DirectMessageModel) -> some View { func MaybeEvent(_ model: DirectMessageModel) -> some View {
Group { Group {
if let ev = model.events.last(where: { should_show_event(state: damus_state, ev: $0, keypair: damus_state.keypair) }) { if let ev = model.events.last(where: { should_show_event(state: damus_state, ev: $0) }) {
EventView(damus: damus_state, event: ev, pubkey: model.pubkey, options: options) EventView(damus: damus_state, event: ev, pubkey: model.pubkey, options: options)
.onTapGesture { .onTapGesture {
self.model.set_active_dm_model(model) self.model.set_active_dm_model(model)

View File

@ -25,7 +25,7 @@ func generate_test_damus_state(
return profiles return profiles
}() }()
let mutelist_manager = MutelistManager() let mutelist_manager = MutelistManager(user_keypair: test_keypair)
let damus = DamusState(pool: pool, let damus = DamusState(pool: pool,
keypair: test_keypair, keypair: test_keypair,
likes: .init(our_pubkey: our_pubkey), likes: .init(our_pubkey: our_pubkey),