account creation working
Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
@@ -62,6 +62,7 @@
|
|||||||
4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFBA2804A34C0006080F /* ProofOfWork.swift */; };
|
4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFBA2804A34C0006080F /* ProofOfWork.swift */; };
|
||||||
4C7FF7D52823313F009601DB /* Mentions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7FF7D42823313F009601DB /* Mentions.swift */; };
|
4C7FF7D52823313F009601DB /* Mentions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7FF7D42823313F009601DB /* Mentions.swift */; };
|
||||||
4C8682872814DE470026224F /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8682862814DE470026224F /* ProfileView.swift */; };
|
4C8682872814DE470026224F /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8682862814DE470026224F /* ProfileView.swift */; };
|
||||||
|
4C90BD162839DB54008EE7EF /* NostrMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90BD152839DB54008EE7EF /* NostrMetadata.swift */; };
|
||||||
4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */; };
|
4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */; };
|
||||||
4CACA9D5280C31E100D9BBE8 /* ReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */; };
|
4CACA9D5280C31E100D9BBE8 /* ReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */; };
|
||||||
4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9DB280C38C000D9BBE8 /* Profiles.swift */; };
|
4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9DB280C38C000D9BBE8 /* Profiles.swift */; };
|
||||||
@@ -159,6 +160,7 @@
|
|||||||
4C75EFBA2804A34C0006080F /* ProofOfWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofOfWork.swift; sourceTree = "<group>"; };
|
4C75EFBA2804A34C0006080F /* ProofOfWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofOfWork.swift; sourceTree = "<group>"; };
|
||||||
4C7FF7D42823313F009601DB /* Mentions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mentions.swift; sourceTree = "<group>"; };
|
4C7FF7D42823313F009601DB /* Mentions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mentions.swift; sourceTree = "<group>"; };
|
||||||
4C8682862814DE470026224F /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
|
4C8682862814DE470026224F /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
|
||||||
|
4C90BD152839DB54008EE7EF /* NostrMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NostrMetadata.swift; sourceTree = "<group>"; };
|
||||||
4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineView.swift; sourceTree = "<group>"; };
|
4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineView.swift; sourceTree = "<group>"; };
|
||||||
4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyView.swift; sourceTree = "<group>"; };
|
4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyView.swift; sourceTree = "<group>"; };
|
||||||
4CACA9DB280C38C000D9BBE8 /* Profiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Profiles.swift; sourceTree = "<group>"; };
|
4CACA9DB280C38C000D9BBE8 /* Profiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Profiles.swift; sourceTree = "<group>"; };
|
||||||
@@ -285,6 +287,7 @@
|
|||||||
4CACA9DB280C38C000D9BBE8 /* Profiles.swift */,
|
4CACA9DB280C38C000D9BBE8 /* Profiles.swift */,
|
||||||
4C3BEFD32819DE8F00B3DE84 /* NostrKind.swift */,
|
4C3BEFD32819DE8F00B3DE84 /* NostrKind.swift */,
|
||||||
4C363A8F28247A1D006E126D /* NostrLink.swift */,
|
4C363A8F28247A1D006E126D /* NostrLink.swift */,
|
||||||
|
4C90BD152839DB54008EE7EF /* NostrMetadata.swift */,
|
||||||
);
|
);
|
||||||
path = Nostr;
|
path = Nostr;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -551,6 +554,7 @@
|
|||||||
4C3AC79F2833115300E1F516 /* FollowButtonView.swift in Sources */,
|
4C3AC79F2833115300E1F516 /* FollowButtonView.swift in Sources */,
|
||||||
4C3BEFD22819DB9B00B3DE84 /* ProfileModel.swift in Sources */,
|
4C3BEFD22819DB9B00B3DE84 /* ProfileModel.swift in Sources */,
|
||||||
4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */,
|
4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */,
|
||||||
|
4C90BD162839DB54008EE7EF /* NostrMetadata.swift in Sources */,
|
||||||
4C3AC7A12835A81400E1F516 /* SetupView.swift in Sources */,
|
4C3AC7A12835A81400E1F516 /* SetupView.swift in Sources */,
|
||||||
4C285C8C28398BC7008A31F1 /* Keys.swift in Sources */,
|
4C285C8C28398BC7008A31F1 /* Keys.swift in Sources */,
|
||||||
4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */,
|
4CACA9DC280C38C000D9BBE8 /* Profiles.swift in Sources */,
|
||||||
|
|||||||
@@ -412,6 +412,7 @@ struct ContentView: View {
|
|||||||
let text_filter = NostrFilter.filter_kinds([1,5,6,7])
|
let text_filter = NostrFilter.filter_kinds([1,5,6,7])
|
||||||
let profile_filter = NostrFilter.filter_profiles
|
let profile_filter = NostrFilter.filter_profiles
|
||||||
var contacts_filter = NostrFilter.filter_contacts
|
var contacts_filter = NostrFilter.filter_contacts
|
||||||
|
|
||||||
contacts_filter.authors = [self.pubkey]
|
contacts_filter.authors = [self.pubkey]
|
||||||
|
|
||||||
var filters = [text_filter, profile_filter, contacts_filter]
|
var filters = [text_filter, profile_filter, contacts_filter]
|
||||||
|
|||||||
@@ -22,6 +22,10 @@ class CreateAccountModel: ObservableObject {
|
|||||||
return real_name
|
return real_name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var keypair: Keypair {
|
||||||
|
return Keypair(pubkey: self.pubkey, privkey: self.privkey)
|
||||||
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
let keypair = generate_new_keypair()
|
let keypair = generate_new_keypair()
|
||||||
self.pubkey = keypair.pubkey
|
self.pubkey = keypair.pubkey
|
||||||
|
|||||||
@@ -349,6 +349,33 @@ func get_referenced_ids(tags: [[String]], key: String) -> [ReferencedId] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func make_first_contact_event(keypair: Keypair) -> NostrEvent {
|
||||||
|
let rw_relay_info = RelayInfo(read: true, write: true)
|
||||||
|
let damus_relay = "wss://relay.damus.io"
|
||||||
|
let relays: [String: RelayInfo] = ["wss://relay.damus.io": rw_relay_info]
|
||||||
|
let relay_json = encode_json(relays)!
|
||||||
|
let damus_pubkey = "3efdaebb1d8923ebd99c9e7ace3b4194ab45512e2be79c1b7d68d9243e0d2681"
|
||||||
|
let ev = NostrEvent(content: relay_json,
|
||||||
|
pubkey: keypair.pubkey,
|
||||||
|
kind: NostrKind.contacts.rawValue,
|
||||||
|
tags: [["p", damus_pubkey, damus_relay]])
|
||||||
|
ev.calculate_id()
|
||||||
|
ev.sign(privkey: keypair.privkey)
|
||||||
|
return ev
|
||||||
|
}
|
||||||
|
|
||||||
|
func make_metadata_event(keypair: Keypair, metadata: NostrMetadata) -> NostrEvent {
|
||||||
|
let metadata_json = encode_json(metadata)!
|
||||||
|
let ev = NostrEvent(content: metadata_json,
|
||||||
|
pubkey: keypair.pubkey,
|
||||||
|
kind: NostrKind.metadata.rawValue,
|
||||||
|
tags: [])
|
||||||
|
|
||||||
|
ev.calculate_id()
|
||||||
|
ev.sign(privkey: keypair.privkey)
|
||||||
|
return ev
|
||||||
|
}
|
||||||
|
|
||||||
func make_boost_event(pubkey: String, privkey: String, boosted: NostrEvent) -> NostrEvent {
|
func make_boost_event(pubkey: String, privkey: String, boosted: NostrEvent) -> NostrEvent {
|
||||||
var tags: [[String]] = boosted.tags.filter { tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p") }
|
var tags: [[String]] = boosted.tags.filter { tag in tag.count >= 2 && (tag[0] == "e" || tag[0] == "p") }
|
||||||
tags.append(["e", boosted.id])
|
tags.append(["e", boosted.id])
|
||||||
|
|||||||
20
damus/Nostr/NostrMetadata.swift
Normal file
20
damus/Nostr/NostrMetadata.swift
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// NostrMetadata.swift
|
||||||
|
// damus
|
||||||
|
//
|
||||||
|
// Created by William Casarin on 2022-05-21.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
|
||||||
|
struct NostrMetadata: Codable {
|
||||||
|
let display_name: String?
|
||||||
|
let name: String?
|
||||||
|
let about: String?
|
||||||
|
let website: String?
|
||||||
|
}
|
||||||
|
|
||||||
|
func create_account_to_metadata(_ model: CreateAccountModel) -> NostrMetadata {
|
||||||
|
return NostrMetadata(display_name: model.real_name, name: model.nick_name, about: model.about, website: nil)
|
||||||
|
}
|
||||||
@@ -9,9 +9,12 @@ import SwiftUI
|
|||||||
|
|
||||||
struct SaveKeysView: View {
|
struct SaveKeysView: View {
|
||||||
let account: CreateAccountModel
|
let account: CreateAccountModel
|
||||||
|
let pool: RelayPool = RelayPool()
|
||||||
@State var is_done: Bool = false
|
@State var is_done: Bool = false
|
||||||
@State var pub_copied: Bool = false
|
@State var pub_copied: Bool = false
|
||||||
@State var priv_copied: Bool = false
|
@State var priv_copied: Bool = false
|
||||||
|
@State var loading: Bool = false
|
||||||
|
@State var error: String? = nil
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack(alignment: .top) {
|
ZStack(alignment: .top) {
|
||||||
@@ -32,7 +35,7 @@ struct SaveKeysView: View {
|
|||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.padding(.bottom, 10)
|
.padding(.bottom, 10)
|
||||||
|
|
||||||
Text("This is your account ID, you can give this to your friends so that they can follow you")
|
Text("This is your account ID, you can give this to your friends so that they can follow you. Click to copy.")
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.padding(.bottom, 10)
|
.padding(.bottom, 10)
|
||||||
|
|
||||||
@@ -52,15 +55,67 @@ struct SaveKeysView: View {
|
|||||||
.padding(.bottom, 10)
|
.padding(.bottom, 10)
|
||||||
|
|
||||||
if pub_copied && priv_copied {
|
if pub_copied && priv_copied {
|
||||||
DamusWhiteButton("Let's go!") {
|
if loading {
|
||||||
save_keypair(pubkey: account.pubkey, privkey: account.privkey)
|
ProgressView()
|
||||||
notify(.login, ())
|
.progressViewStyle(.circular)
|
||||||
|
} else if let err = error {
|
||||||
|
Text("Error: \(err)")
|
||||||
|
.foregroundColor(.red)
|
||||||
|
DamusWhiteButton("Retry") {
|
||||||
|
complete_account_creation(account)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DamusWhiteButton("Let's go!") {
|
||||||
|
complete_account_creation(account)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(20)
|
.padding(20)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func complete_account_creation(_ account: CreateAccountModel) {
|
||||||
|
add_rw_relay(self.pool, "wss://relay.damus.io")
|
||||||
|
self.pool.register_handler(sub_id: "signup", handler: handle_event)
|
||||||
|
|
||||||
|
self.loading = true
|
||||||
|
|
||||||
|
self.pool.connect()
|
||||||
|
}
|
||||||
|
|
||||||
|
func handle_event(relay: String, ev: NostrConnectionEvent) {
|
||||||
|
switch ev {
|
||||||
|
case .ws_event(let wsev):
|
||||||
|
switch wsev {
|
||||||
|
case .connected:
|
||||||
|
let metadata = create_account_to_metadata(account)
|
||||||
|
let metadata_ev = make_metadata_event(keypair: account.keypair, metadata: metadata)
|
||||||
|
let contacts_ev = make_first_contact_event(keypair: account.keypair)
|
||||||
|
|
||||||
|
self.pool.send(.event(metadata_ev))
|
||||||
|
self.pool.send(.event(contacts_ev))
|
||||||
|
|
||||||
|
save_keypair(pubkey: account.pubkey, privkey: account.privkey)
|
||||||
|
notify(.login, account.keypair)
|
||||||
|
case .error(let err):
|
||||||
|
self.loading = false
|
||||||
|
self.error = "\(err.debugDescription)"
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
case .nostr_event(let resp):
|
||||||
|
switch resp {
|
||||||
|
case .notice(let msg):
|
||||||
|
// TODO handle message
|
||||||
|
self.loading = false
|
||||||
|
self.error = msg
|
||||||
|
print(msg)
|
||||||
|
case .event:
|
||||||
|
print("event in signup?")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SaveKeyView: View {
|
struct SaveKeyView: View {
|
||||||
|
|||||||
Reference in New Issue
Block a user