1
0
mirror of git://jb55.com/damus synced 2024-10-01 09:20:47 +00:00

home: add quote repost counter and handler

This adds the initial support code for counting and handling
quote reposts.

Eventually we are going to replace all of the event counts by stats
within nostrdb, but we do this in the meantime now.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin 2024-03-16 12:05:49 +00:00
parent 6111e244de
commit 8cdbc84093
6 changed files with 36 additions and 8 deletions

View File

@ -723,7 +723,8 @@ struct ContentView: View {
nav: self.navigationCoordinator, nav: self.navigationCoordinator,
music: MusicController(onChange: music_changed), music: MusicController(onChange: music_changed),
video: VideoController(), video: VideoController(),
ndb: ndb ndb: ndb,
quote_reposts: .init(our_pubkey: pubkey)
) )
home.damus_state = self.damus_state! home.damus_state = self.damus_state!

View File

@ -16,10 +16,12 @@ enum Zapped {
class ActionBarModel: ObservableObject { class ActionBarModel: ObservableObject {
@Published var our_like: NostrEvent? @Published var our_like: NostrEvent?
@Published var our_boost: NostrEvent? @Published var our_boost: NostrEvent?
@Published var our_quote_repost: NostrEvent?
@Published var our_reply: NostrEvent? @Published var our_reply: NostrEvent?
@Published var our_zap: Zapping? @Published var our_zap: Zapping?
@Published var likes: Int @Published var likes: Int
@Published var boosts: Int @Published var boosts: Int
@Published var quote_reposts: Int
@Published private(set) var zaps: Int @Published private(set) var zaps: Int
@Published var zap_total: Int64 @Published var zap_total: Int64
@Published var replies: Int @Published var replies: Int
@ -28,7 +30,7 @@ class ActionBarModel: ObservableObject {
return ActionBarModel(likes: 0, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil) return ActionBarModel(likes: 0, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil)
} }
init(likes: Int = 0, boosts: Int = 0, zaps: Int = 0, zap_total: Int64 = 0, replies: Int = 0, our_like: NostrEvent? = nil, our_boost: NostrEvent? = nil, our_zap: Zapping? = nil, our_reply: NostrEvent? = nil) { init(likes: Int = 0, boosts: Int = 0, zaps: Int = 0, zap_total: Int64 = 0, replies: Int = 0, our_like: NostrEvent? = nil, our_boost: NostrEvent? = nil, our_zap: Zapping? = nil, our_reply: NostrEvent? = nil, our_quote_repost: NostrEvent? = nil, quote_reposts: Int = 0) {
self.likes = likes self.likes = likes
self.boosts = boosts self.boosts = boosts
self.zaps = zaps self.zaps = zaps
@ -38,6 +40,8 @@ class ActionBarModel: ObservableObject {
self.our_boost = our_boost self.our_boost = our_boost
self.our_zap = our_zap self.our_zap = our_zap
self.our_reply = our_reply self.our_reply = our_reply
self.our_quote_repost = our_quote_repost
self.quote_reposts = quote_reposts
} }
func update(damus: DamusState, evid: NoteId) { func update(damus: DamusState, evid: NoteId) {
@ -45,11 +49,13 @@ class ActionBarModel: ObservableObject {
self.boosts = damus.boosts.counts[evid] ?? 0 self.boosts = damus.boosts.counts[evid] ?? 0
self.zaps = damus.zaps.event_counts[evid] ?? 0 self.zaps = damus.zaps.event_counts[evid] ?? 0
self.replies = damus.replies.get_replies(evid) self.replies = damus.replies.get_replies(evid)
self.quote_reposts = damus.quote_reposts.counts[evid] ?? 0
self.zap_total = damus.zaps.event_totals[evid] ?? 0 self.zap_total = damus.zaps.event_totals[evid] ?? 0
self.our_like = damus.likes.our_events[evid] self.our_like = damus.likes.our_events[evid]
self.our_boost = damus.boosts.our_events[evid] self.our_boost = damus.boosts.our_events[evid]
self.our_zap = damus.zaps.our_zaps[evid]?.first self.our_zap = damus.zaps.our_zaps[evid]?.first
self.our_reply = damus.replies.our_reply(evid) self.our_reply = damus.replies.our_reply(evid)
self.our_quote_repost = damus.quote_reposts.our_events[evid]
self.objectWillChange.send() self.objectWillChange.send()
} }
@ -68,4 +74,8 @@ class ActionBarModel: ObservableObject {
var boosted: Bool { var boosted: Bool {
return our_boost != nil return our_boost != nil
} }
var quoted: Bool {
return our_quote_repost != nil
}
} }

View File

@ -13,6 +13,7 @@ class DamusState: HeadlessDamusState {
let keypair: Keypair let keypair: Keypair
let likes: EventCounter let likes: EventCounter
let boosts: EventCounter let boosts: EventCounter
let quote_reposts: EventCounter
let contacts: Contacts let contacts: Contacts
let mutelist_manager: MutelistManager let mutelist_manager: MutelistManager
let profiles: Profiles let profiles: Profiles
@ -36,7 +37,7 @@ class DamusState: HeadlessDamusState {
let ndb: Ndb let ndb: Ndb
var purple: DamusPurple var purple: DamusPurple
init(pool: RelayPool, keypair: Keypair, likes: EventCounter, boosts: EventCounter, contacts: Contacts, mutelist_manager: MutelistManager, profiles: Profiles, dms: DirectMessagesModel, previews: PreviewCache, zaps: Zaps, lnurls: LNUrls, settings: UserSettingsStore, relay_filters: RelayFilters, relay_model_cache: RelayModelCache, drafts: Drafts, events: EventCache, bookmarks: BookmarksManager, postbox: PostBox, bootstrap_relays: [String], replies: ReplyCounter, wallet: WalletModel, nav: NavigationCoordinator, music: MusicController?, video: VideoController, ndb: Ndb, purple: DamusPurple? = nil) { init(pool: RelayPool, keypair: Keypair, likes: EventCounter, boosts: EventCounter, contacts: Contacts, mutelist_manager: MutelistManager, profiles: Profiles, dms: DirectMessagesModel, previews: PreviewCache, zaps: Zaps, lnurls: LNUrls, settings: UserSettingsStore, relay_filters: RelayFilters, relay_model_cache: RelayModelCache, drafts: Drafts, events: EventCache, bookmarks: BookmarksManager, postbox: PostBox, bootstrap_relays: [String], replies: ReplyCounter, wallet: WalletModel, nav: NavigationCoordinator, music: MusicController?, video: VideoController, ndb: Ndb, purple: DamusPurple? = nil, quote_reposts: EventCounter) {
self.pool = pool self.pool = pool
self.keypair = keypair self.keypair = keypair
self.likes = likes self.likes = likes
@ -66,6 +67,7 @@ class DamusState: HeadlessDamusState {
settings: settings, settings: settings,
keypair: keypair keypair: keypair
) )
self.quote_reposts = quote_reposts
} }
@discardableResult @discardableResult
@ -129,7 +131,8 @@ class DamusState: HeadlessDamusState {
nav: NavigationCoordinator(), nav: NavigationCoordinator(),
music: nil, music: nil,
video: VideoController(), video: VideoController(),
ndb: .empty ndb: .empty,
quote_reposts: .init(our_pubkey: empty_pub)
) )
} }
} }

View File

@ -347,12 +347,19 @@ class HomeModel {
case .already_counted: case .already_counted:
break break
case .success(let n): case .success(let n):
let boosted = Counted(event: ev, id: e, total: n)
notify(.reposted(boosted))
notify(.update_stats(note_id: e)) notify(.update_stats(note_id: e))
} }
} }
func handle_quote_repost_event(_ ev: NostrEvent, target: NoteId) {
switch damus_state.quote_reposts.add_event(ev, target: target) {
case .already_counted:
break
case .success(let n):
notify(.update_stats(note_id: target))
}
}
func handle_like_event(_ ev: NostrEvent) { func handle_like_event(_ ev: NostrEvent) {
guard let e = ev.last_refid() else { guard let e = ev.last_refid() else {
// no id ref? invalid like event // no id ref? invalid like event
@ -672,6 +679,10 @@ class HomeModel {
damus_state.replies.count_replies(ev, keypair: self.damus_state.keypair) damus_state.replies.count_replies(ev, keypair: self.damus_state.keypair)
damus_state.events.insert(ev) damus_state.events.insert(ev)
if let quoted_event = ev.referenced_quote_ids.first {
handle_quote_repost_event(ev, target: quoted_event.note_id)
}
if sub_id == home_subid { if sub_id == home_subid {
insert_home_event(ev) insert_home_event(ev)
} else if sub_id == notifications_subid { } else if sub_id == notifications_subid {

View File

@ -92,7 +92,9 @@ var test_damus_state: DamusState = ({
nav: .init(), nav: .init(),
music: .init(onChange: {_ in }), music: .init(onChange: {_ in }),
video: .init(), video: .init(),
ndb: ndb) ndb: ndb,
quote_reposts: .init(our_pubkey: our_pubkey)
)
/* /*
let prof = Profile(name: "damus", display_name: "damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", banner: "", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io", damus_donation: nil) let prof = Profile(name: "damus", display_name: "damus", about: "iOS app!", picture: "https://damus.io/img/logo.png", banner: "", website: "https://damus.io", lud06: nil, lud16: "jb55@sendsats.lol", nip05: "damus.io", damus_donation: nil)

View File

@ -49,7 +49,8 @@ func generate_test_damus_state(
nav: .init(), nav: .init(),
music: .init(onChange: {_ in }), music: .init(onChange: {_ in }),
video: .init(), video: .init(),
ndb: ndb) ndb: ndb,
quote_reposts: .init(our_pubkey: our_pubkey) )
return damus return damus
} }