Allow non-string values in profiles

Profiles were not loading from other clients because some fields were
not strings

Changelog-Fixed: Fixed profiles sometimes not loading from other clients
This commit is contained in:
William Casarin
2023-01-27 10:16:56 -08:00
parent b9c2473a2d
commit d559dd3a13
5 changed files with 693 additions and 26 deletions

View File

@@ -8,7 +8,7 @@
import Foundation
struct Profile: Codable {
var value: [String: String]
var value: [String: AnyCodable]
init (name: String?, display_name: String?, about: String?, picture: String?, banner: String?, website: String?, lud06: String?, lud16: String?, nip05: String?) {
self.value = [:]
@@ -23,50 +23,71 @@ struct Profile: Codable {
self.nip05 = nip05
}
private func str(_ str: String) -> String? {
guard let val = self.value[str] else{
return nil
}
guard let s = val.value as? String else {
return nil
}
return s
}
private mutating func set_str(_ key: String, _ val: String?) {
if val == nil {
self.value.removeValue(forKey: key)
return
}
self.value[key] = AnyCodable.init(val)
}
var display_name: String? {
get { return value["display_name"]; }
set(s) { value["display_name"] = s }
get { return str("display_name"); }
set(s) { set_str("display_name", s) }
}
var name: String? {
get { return value["name"]; }
set(s) { value["name"] = s }
get { return str("name"); }
set(s) { set_str("name", s) }
}
var about: String? {
get { return value["about"]; }
set(s) { value["about"] = s }
get { return str("about"); }
set(s) { set_str("about", s) }
}
var picture: String? {
get { return value["picture"]; }
set(s) { value["picture"] = s }
get { return str("picture"); }
set(s) { set_str("picture", s) }
}
var banner: String? {
get { return value["banner"]; }
set(s) { value["banner"] = s }
get { return str("banner"); }
set(s) { set_str("banner", s) }
}
var website: String? {
get { return value["website"]; }
set(s) { value["website"] = s }
get { return str("website"); }
set(s) { set_str("website", s) }
}
var lud06: String? {
get { return str("lud06"); }
set(s) { set_str("lud06", s) }
}
var lud16: String? {
get { return str("lud16"); }
set(s) { set_str("lud16", s) }
}
var website_url: URL? {
return self.website.flatMap { URL(string: $0) }
}
var lud06: String? {
get { return value["lud06"]; }
set(s) { value["lud06"] = s }
}
var lud16: String? {
get { return value["lud16"]; }
set(s) { value["lud16"] = s }
}
var lnurl: String? {
guard let addr = lud06 ?? lud16 else {
return nil;
@@ -80,8 +101,8 @@ struct Profile: Codable {
}
var nip05: String? {
get { return value["nip05"]; }
set(s) { value["nip05"] = s }
get { return str("nip05"); }
set(s) { set_str("nip05", s) }
}
var lightning_uri: URL? {
@@ -90,7 +111,7 @@ struct Profile: Codable {
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
self.value = try container.decode([String: String].self)
self.value = try container.decode([String: AnyCodable].self)
}
func encode(to encoder: Encoder) throws {