ndb: make NostrEvents immutable
Since we can't mutate NdbNotes, let's update the existing codebase to generate and sign ids on NostrEvent constructions. This will allow us to match NdbNote's constructor
This commit is contained in:
@@ -140,12 +140,11 @@ struct EventActionBar: View {
|
||||
}
|
||||
|
||||
func send_like() {
|
||||
guard let privkey = damus_state.keypair.privkey else {
|
||||
guard let keypair = damus_state.keypair.to_full(),
|
||||
let like_ev = make_like_event(keypair: keypair, liked: event) else {
|
||||
return
|
||||
}
|
||||
|
||||
let like_ev = make_like_event(pubkey: damus_state.pubkey, privkey: privkey, liked: event)
|
||||
|
||||
|
||||
self.bar.our_like = like_ev
|
||||
|
||||
generator.impactOccurred()
|
||||
@@ -222,10 +221,9 @@ struct LikeButton: View {
|
||||
|
||||
struct EventActionBar_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let pk = "pubkey"
|
||||
let ds = test_damus_state()
|
||||
let ev = NostrEvent(content: "hi", pubkey: pk)
|
||||
|
||||
let ev = NostrEvent(content: "hi", keypair: test_keypair)!
|
||||
|
||||
let bar = ActionBarModel.empty()
|
||||
let likedbar = ActionBarModel(likes: 10, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: nil, our_boost: nil, our_zap: nil, our_reply: nil)
|
||||
let likedbar_ours = ActionBarModel(likes: 10, boosts: 0, zaps: 0, zap_total: 0, replies: 0, our_like: test_event, our_boost: nil, our_zap: nil, our_reply: nil)
|
||||
|
||||
@@ -20,12 +20,11 @@ struct RepostAction: View {
|
||||
Button {
|
||||
dismiss()
|
||||
|
||||
guard let privkey = self.damus_state.keypair.privkey else {
|
||||
guard let keypair = self.damus_state.keypair.to_full(),
|
||||
let boost = make_boost_event(keypair: keypair, boosted: self.event) else {
|
||||
return
|
||||
}
|
||||
|
||||
let boost = make_boost_event(pubkey: damus_state.keypair.pubkey, privkey: privkey, boosted: self.event)
|
||||
|
||||
|
||||
damus_state.postbox.send(boost)
|
||||
} label: {
|
||||
Label(NSLocalizedString("Repost", comment: "Button to repost a note"), image: "repost")
|
||||
|
||||
@@ -116,15 +116,11 @@ struct ConfigView: View {
|
||||
confirm_delete_account = false
|
||||
}
|
||||
Button(NSLocalizedString("Delete", comment: "Button for deleting the users account."), role: .destructive) {
|
||||
guard let full_kp = state.keypair.to_full() else {
|
||||
guard let keypair = state.keypair.to_full(),
|
||||
delete_text == DELETE_KEYWORD,
|
||||
let ev = created_deleted_account_profile(keypair: keypair) else {
|
||||
return
|
||||
}
|
||||
|
||||
guard delete_text == DELETE_KEYWORD else {
|
||||
return
|
||||
}
|
||||
|
||||
let ev = created_deleted_account_profile(keypair: full_kp)
|
||||
state.postbox.send(ev)
|
||||
notify(.logout, ())
|
||||
}
|
||||
|
||||
@@ -177,9 +177,9 @@ struct DMChatView: View, KeyboardReadable {
|
||||
|
||||
struct DMChatView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let ev = NostrEvent(content: "hi", pubkey: "pubkey", kind: 1, tags: [])
|
||||
let ev = NostrEvent(content: "hi", keypair: test_keypair, kind: 1, tags: [])!
|
||||
|
||||
let model = DirectMessageModel(events: [ev], our_pubkey: "pubkey", pubkey: "the_pk")
|
||||
let model = DirectMessageModel(events: [ev], our_pubkey: test_pubkey, pubkey: test_pubkey)
|
||||
|
||||
DMChatView(damus_state: test_damus_state(), dms: model)
|
||||
}
|
||||
@@ -216,11 +216,7 @@ func create_encrypted_event(_ message: String, to_pk: String, tags: [[String]],
|
||||
return nil
|
||||
}
|
||||
|
||||
let ev = NostrEvent(content: enc_content, pubkey: keypair.pubkey, kind: kind, tags: tags, createdAt: created_at)
|
||||
|
||||
ev.calculate_id()
|
||||
ev.sign(privkey: privkey)
|
||||
return ev
|
||||
return NostrEvent(content: enc_content, keypair: keypair.to_keypair(), kind: kind, tags: tags, createdAt: created_at)
|
||||
}
|
||||
|
||||
func create_dm(_ message: String, to_pk: String, tags: [[String]], keypair: Keypair, created_at: UInt32? = nil) -> NostrEvent?
|
||||
|
||||
@@ -73,7 +73,7 @@ struct DMView: View {
|
||||
|
||||
struct DMView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
let ev = NostrEvent(content: "Hey there *buddy*, want to grab some drinks later? 🍻", pubkey: "pubkey", kind: 1, tags: [])
|
||||
let ev = NostrEvent(content: "Hey there *buddy*, want to grab some drinks later? 🍻", keypair: test_keypair, kind: 1, tags: [])!
|
||||
DMView(event: ev, damus_state: test_damus_state())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,19 +59,18 @@ struct LongformView: View {
|
||||
}
|
||||
}
|
||||
|
||||
let test_longform_event = LongformEvent.parse(from:
|
||||
.init(id: "longform_id",
|
||||
content: longform_long_test_data,
|
||||
pubkey: "pk",
|
||||
kind: NostrKind.longform.rawValue,
|
||||
tags: [
|
||||
["title", "What is WASTOIDS?"],
|
||||
["summary", "WASTOIDS is an audio/visual feed, created by Sam Means..."],
|
||||
["published_at", "1685638715"],
|
||||
["t", "coffee"],
|
||||
["t", "coffeechain"],
|
||||
["image", "https://cdn.jb55.com/s/038fe8f558153b52.jpg"],
|
||||
])
|
||||
let test_longform_event = LongformEvent.parse(from: NostrEvent(
|
||||
content: longform_long_test_data,
|
||||
keypair: test_keypair,
|
||||
kind: NostrKind.longform.rawValue,
|
||||
tags: [
|
||||
["title", "What is WASTOIDS?"],
|
||||
["summary", "WASTOIDS is an audio/visual feed, created by Sam Means..."],
|
||||
["published_at", "1685638715"],
|
||||
["t", "coffee"],
|
||||
["t", "coffeechain"],
|
||||
["image", "https://cdn.jb55.com/s/038fe8f558153b52.jpg"],
|
||||
])!
|
||||
)
|
||||
|
||||
struct LongformView_Previews: PreviewProvider {
|
||||
|
||||
@@ -48,15 +48,6 @@ struct ZapEvent: View {
|
||||
}
|
||||
|
||||
|
||||
let test_zap_invoice = ZapInvoice(description: .description("description"), amount: 10000, string: "lnbc1", expiry: 1000000, payment_hash: Data(), created_at: 1000000)
|
||||
let test_zap_request_ev = NostrEvent(content: "hi", pubkey: "pk", kind: 9734)
|
||||
let test_zap_request = ZapRequest(ev: test_zap_request_ev)
|
||||
let test_zap = Zap(event: test_event, invoice: test_zap_invoice, zapper: "zapper", target: .profile("pk"), raw_request: test_zap_request, is_anon: false, private_request: nil)
|
||||
|
||||
let test_private_zap = Zap(event: test_event, invoice: test_zap_invoice, zapper: "zapper", target: .profile("pk"), raw_request: test_zap_request, is_anon: false, private_request: .init(ev: test_event))
|
||||
|
||||
let test_pending_zap = PendingZap(amount_msat: 10000, target: .note(id: "id", author: "pk"), request: .normal(test_zap_request), type: .pub, state: .external(.init(state: .fetching_invoice)))
|
||||
|
||||
struct ZapEvent_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
VStack {
|
||||
|
||||
@@ -258,12 +258,6 @@ struct EventGroupView: View {
|
||||
}
|
||||
}
|
||||
|
||||
let test_encoded_post = "{\"id\": \"8ba545ab96959fe0ce7db31bc10f3ac3aa5353bc4428dbf1e56a7be7062516db\",\"pubkey\": \"7e27509ccf1e297e1df164912a43406218f8bd80129424c3ef798ca3ef5c8444\",\"created_at\": 1677013417,\"kind\": 1,\"tags\": [],\"content\": \"hello\",\"sig\": \"93684f15eddf11f42afbdd81828ee9fc35350344d8650c78909099d776e9ad8d959cd5c4bff7045be3b0b255144add43d0feef97940794a1bc9c309791bebe4a\"}"
|
||||
let test_repost_1 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk1", kind: 6, tags: [], createdAt: 1)
|
||||
let test_repost_2 = NostrEvent(id: "", content: test_encoded_post, pubkey: "pk2", kind: 6, tags: [], createdAt: 1)
|
||||
let test_reposts = [test_repost_1, test_repost_2]
|
||||
let test_event_group = EventGroup(events: test_reposts)
|
||||
|
||||
struct EventGroupView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
VStack {
|
||||
|
||||
@@ -62,10 +62,12 @@ struct EditMetadataView: View {
|
||||
|
||||
func save() {
|
||||
let profile = to_profile()
|
||||
guard let keypair = damus_state.keypair.to_full() else {
|
||||
guard let keypair = damus_state.keypair.to_full(),
|
||||
let metadata_ev = make_metadata_event(keypair: keypair, metadata: profile)
|
||||
else {
|
||||
return
|
||||
}
|
||||
let metadata_ev = make_metadata_event(keypair: keypair, metadata: profile)
|
||||
|
||||
damus_state.postbox.send(metadata_ev)
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,6 @@ struct ReactionView: View {
|
||||
|
||||
struct ReactionView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ReactionView(damus_state: test_damus_state(), reaction: NostrEvent(id: "", content: "🤙🏼", pubkey: ""))
|
||||
ReactionView(damus_state: test_damus_state(), reaction: NostrEvent(content: "🤙🏼", keypair: test_keypair)!)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@ struct RecommendedRelayView: View {
|
||||
var body: some View {
|
||||
ZStack {
|
||||
HStack {
|
||||
if let privkey = damus.keypair.privkey {
|
||||
if let keypair = damus.keypair.to_full() {
|
||||
if showActionButtons && add_button {
|
||||
AddButton(privkey: privkey, showText: false)
|
||||
AddButton(keypair: keypair, showText: false)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,8 +59,8 @@ struct RecommendedRelayView: View {
|
||||
}
|
||||
.swipeActions {
|
||||
if add_button {
|
||||
if let privkey = damus.keypair.privkey {
|
||||
AddButton(privkey: privkey, showText: false)
|
||||
if let keypair = damus.keypair.to_full() {
|
||||
AddButton(keypair: keypair, showText: false)
|
||||
.tint(.accentColor)
|
||||
}
|
||||
}
|
||||
@@ -68,8 +68,8 @@ struct RecommendedRelayView: View {
|
||||
.contextMenu {
|
||||
CopyAction(relay: relay)
|
||||
|
||||
if let privkey = damus.keypair.privkey {
|
||||
AddButton(privkey: privkey, showText: true)
|
||||
if let keypair = damus.keypair.to_full() {
|
||||
AddButton(keypair: keypair, showText: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,9 +82,9 @@ struct RecommendedRelayView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func AddButton(privkey: String, showText: Bool) -> some View {
|
||||
func AddButton(keypair: FullKeypair, showText: Bool) -> some View {
|
||||
Button(action: {
|
||||
add_action(privkey: privkey)
|
||||
add_action(keypair: keypair)
|
||||
}) {
|
||||
if showText {
|
||||
Text(NSLocalizedString("Connect", comment: "Button to connect to recommended relay server."))
|
||||
@@ -97,11 +97,11 @@ struct RecommendedRelayView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func add_action(privkey: String) {
|
||||
func add_action(keypair: FullKeypair) {
|
||||
guard let ev_before_add = damus.contacts.event else {
|
||||
return
|
||||
}
|
||||
guard let ev_after_add = add_relay(ev: ev_before_add, privkey: privkey, current_relays: damus.pool.our_descriptors, relay: relay, info: .rw) else {
|
||||
guard let ev_after_add = add_relay(ev: ev_before_add, keypair: keypair, current_relays: damus.pool.our_descriptors, relay: relay, info: .rw) else {
|
||||
return
|
||||
}
|
||||
process_contact_event(state: damus, ev: ev_after_add)
|
||||
|
||||
@@ -54,7 +54,7 @@ struct RelayConfigView: View {
|
||||
VStack {
|
||||
HStack {
|
||||
Spacer()
|
||||
if(!new_relay.isEmpty) {
|
||||
if !new_relay.isEmpty {
|
||||
Button(NSLocalizedString("Cancel", comment: "Button to cancel out of view adding user inputted relay.")) {
|
||||
new_relay = ""
|
||||
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
||||
@@ -76,15 +76,9 @@ struct RelayConfigView: View {
|
||||
new_relay.removeLast();
|
||||
}
|
||||
|
||||
guard let url = RelayURL(new_relay) else {
|
||||
return
|
||||
}
|
||||
|
||||
guard let ev = state.contacts.event else {
|
||||
return
|
||||
}
|
||||
|
||||
guard let privkey = state.keypair.privkey else {
|
||||
guard let url = RelayURL(new_relay),
|
||||
let ev = state.contacts.event,
|
||||
let keypair = state.keypair.to_full() else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -103,7 +97,7 @@ struct RelayConfigView: View {
|
||||
|
||||
state.pool.connect(to: [new_relay])
|
||||
|
||||
guard let new_ev = add_relay(ev: ev, privkey: privkey, current_relays: state.pool.our_descriptors, relay: new_relay, info: info) else {
|
||||
guard let new_ev = add_relay(ev: ev, keypair: keypair, current_relays: state.pool.our_descriptors, relay: new_relay, info: info) else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -40,35 +40,38 @@ struct RelayDetailView: View {
|
||||
return Text("No data available", comment: "Text indicating that there is no data available to show for specific metadata about a relay server.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func RemoveRelayButton(_ keypair: FullKeypair) -> some View {
|
||||
Button(action: {
|
||||
guard let ev = state.contacts.event else {
|
||||
return
|
||||
}
|
||||
|
||||
let descriptors = state.pool.our_descriptors
|
||||
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, keypair: keypair, relay: relay) else {
|
||||
return
|
||||
}
|
||||
|
||||
process_contact_event(state: state, ev: new_ev)
|
||||
state.postbox.send(new_ev)
|
||||
dismiss()
|
||||
}) {
|
||||
Text("Disconnect From Relay", comment: "Button to disconnect from the relay.")
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Group {
|
||||
Form {
|
||||
|
||||
if let privkey = state.keypair.privkey {
|
||||
if let keypair = state.keypair.to_full() {
|
||||
if check_connection() {
|
||||
Button(action: {
|
||||
guard let ev = state.contacts.event else {
|
||||
return
|
||||
}
|
||||
|
||||
let descriptors = state.pool.our_descriptors
|
||||
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, privkey: privkey, relay: relay) else {
|
||||
return
|
||||
}
|
||||
|
||||
process_contact_event(state: state, ev: new_ev)
|
||||
state.postbox.send(new_ev)
|
||||
dismiss()
|
||||
}) {
|
||||
Text("Disconnect From Relay", comment: "Button to disconnect from the relay.")
|
||||
}
|
||||
RemoveRelayButton(keypair)
|
||||
} else {
|
||||
Button(action: {
|
||||
guard let ev_before_add = state.contacts.event else {
|
||||
return
|
||||
}
|
||||
guard let ev_after_add = add_relay(ev: ev_before_add, privkey: privkey, current_relays: state.pool.our_descriptors, relay: relay, info: .rw) else {
|
||||
guard let ev_after_add = add_relay(ev: ev_before_add, keypair: keypair, current_relays: state.pool.our_descriptors, relay: relay, info: .rw) else {
|
||||
return
|
||||
}
|
||||
process_contact_event(state: state, ev: ev_after_add)
|
||||
|
||||
@@ -95,7 +95,8 @@ struct RelayView: View {
|
||||
}
|
||||
|
||||
let descriptors = state.pool.our_descriptors
|
||||
guard let new_ev = remove_relay( ev: ev, current_relays: descriptors, privkey: privkey, relay: relay) else {
|
||||
guard let keypair = state.keypair.to_full(),
|
||||
let new_ev = remove_relay(ev: ev, current_relays: descriptors, keypair: keypair, relay: relay) else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ import SwiftUI
|
||||
struct ReportView: View {
|
||||
let postbox: PostBox
|
||||
let target: ReportTarget
|
||||
let privkey: String
|
||||
|
||||
let keypair: FullKeypair
|
||||
|
||||
@State var report_sent: Bool = false
|
||||
@State var report_id: String = ""
|
||||
@State var report_message: String = ""
|
||||
@@ -46,7 +46,8 @@ struct ReportView: View {
|
||||
}
|
||||
|
||||
func do_send_report() {
|
||||
guard let selected_report_type, let ev = send_report(privkey: privkey, postbox: postbox, target: target, type: selected_report_type, message: report_message) else {
|
||||
guard let selected_report_type,
|
||||
let ev = send_report(keypair: keypair, postbox: postbox, target: target, type: selected_report_type, message: report_message) else {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -116,9 +117,9 @@ struct ReportView: View {
|
||||
}
|
||||
}
|
||||
|
||||
func send_report(privkey: String, postbox: PostBox, target: ReportTarget, type: ReportType, message: String) -> NostrEvent? {
|
||||
func send_report(keypair: FullKeypair, postbox: PostBox, target: ReportTarget, type: ReportType, message: String) -> NostrEvent? {
|
||||
let report = Report(type: type, target: target, message: message)
|
||||
guard let ev = create_report_event(privkey: privkey, report: report) else {
|
||||
guard let ev = create_report_event(keypair: keypair, report: report) else {
|
||||
return nil
|
||||
}
|
||||
postbox.send(ev)
|
||||
@@ -130,10 +131,10 @@ struct ReportView_Previews: PreviewProvider {
|
||||
let ds = test_damus_state()
|
||||
VStack {
|
||||
|
||||
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), privkey: "")
|
||||
|
||||
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), privkey: "", report_sent: true, report_id: "report_id")
|
||||
|
||||
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), keypair: test_keypair.to_full()!)
|
||||
|
||||
ReportView(postbox: ds.postbox, target: ReportTarget.user(""), keypair: test_keypair.to_full()!, report_sent: true, report_id: "report_id")
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ struct RepostView: View {
|
||||
|
||||
struct RepostView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
RepostView(damus_state: test_damus_state(), repost: NostrEvent(id: "", content: "", pubkey: ""))
|
||||
RepostView(damus_state: test_damus_state(), repost: NostrEvent(content: "", keypair: test_keypair)!)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -130,8 +130,8 @@ struct SaveKeysView: View {
|
||||
let metadata = create_account_to_metadata(account)
|
||||
let contacts_ev = make_first_contact_event(keypair: account.keypair)
|
||||
|
||||
if let keypair = account.keypair.to_full() {
|
||||
let metadata_ev = make_metadata_event(keypair: keypair, metadata: metadata)
|
||||
if let keypair = account.keypair.to_full(),
|
||||
let metadata_ev = make_metadata_event(keypair: keypair, metadata: metadata) {
|
||||
self.pool.send(.event(metadata_ev))
|
||||
}
|
||||
|
||||
|
||||
@@ -181,7 +181,9 @@ struct WalletView: View {
|
||||
}
|
||||
|
||||
profile.damus_donation = settings.donation_percent
|
||||
let meta = make_metadata_event(keypair: keypair, metadata: profile)
|
||||
guard let meta = make_metadata_event(keypair: keypair, metadata: profile) else {
|
||||
return
|
||||
}
|
||||
let tsprofile = TimestampedProfile(profile: profile, timestamp: meta.created_at, event: meta)
|
||||
damus_state.profiles.add(id: damus_state.pubkey, profile: tsprofile)
|
||||
damus_state.postbox.send(meta)
|
||||
|
||||
Reference in New Issue
Block a user