diff --git a/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 14.xcdatamodel/contents b/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 14.xcdatamodel/contents index dc9d4873..461e84bd 100644 --- a/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 14.xcdatamodel/contents +++ b/AltStoreCore/Model/AltStore.xcdatamodeld/AltStore 14.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -188,6 +188,7 @@ + @@ -207,8 +208,13 @@ + + + + + diff --git a/AltStoreCore/Model/Source.swift b/AltStoreCore/Model/Source.swift index b72e90e6..897dfe44 100644 --- a/AltStoreCore/Model/Source.swift +++ b/AltStoreCore/Model/Source.swift @@ -203,8 +203,9 @@ public class Source: NSManagedObject, Fetchable, Decodable /* Source Detail */ @NSManaged public var subtitle: String? - @NSManaged public var websiteURL: URL? @NSManaged public var localizedDescription: String? + @NSManaged public var websiteURL: URL? + @NSManaged public var patreonURL: URL? // Optional properties with fallbacks. // `private` to prevent accidentally using instead of `effective[PropertyName]` @@ -257,6 +258,7 @@ public class Source: NSManagedObject, Fetchable, Decodable case headerImageURL = "headerURL" case websiteURL = "website" case tintColor + case patreonURL case apps case news @@ -287,6 +289,7 @@ public class Source: NSManagedObject, Fetchable, Decodable self.localizedDescription = try container.decodeIfPresent(String.self, forKey: .localizedDescription) self.iconURL = try container.decodeIfPresent(URL.self, forKey: .iconURL) self.headerImageURL = try container.decodeIfPresent(URL.self, forKey: .headerImageURL) + self.patreonURL = try container.decodeIfPresent(URL.self, forKey: .patreonURL) if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor) { diff --git a/AltStoreCore/Model/StoreApp.swift b/AltStoreCore/Model/StoreApp.swift index 1f97895d..69f27e56 100644 --- a/AltStoreCore/Model/StoreApp.swift +++ b/AltStoreCore/Model/StoreApp.swift @@ -91,6 +91,18 @@ extension PlatformURL: Comparable { public typealias PlatformURLs = [PlatformURL] +extension StoreApp +{ + private struct PatreonParameters: Decodable + { + var pledge: Decimal? + var currency: String? + var tiers: Set? + var benefit: String? + var hidden: Bool? + } +} + @objc(StoreApp) public class StoreApp: NSManagedObject, Decodable, Fetchable { @@ -112,6 +124,14 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable @NSManaged public private(set) var tintColor: UIColor? @NSManaged public private(set) var isBeta: Bool + @NSManaged public var isPledged: Bool + @NSManaged public private(set) var isPledgeRequired: Bool + @NSManaged public private(set) var isHiddenWithoutPledge: Bool + @NSManaged public private(set) var pledgeCurrency: String? + + @nonobjc public var pledgeAmount: Decimal? { _pledgeAmount as? Decimal } + @NSManaged @objc(pledgeAmount) private var _pledgeAmount: NSDecimalNumber? + @NSManaged public var sortIndex: Int32 @objc public internal(set) var sourceIdentifier: String? { @@ -232,6 +252,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable case size case isBeta = "beta" case versions + case patreon // Legacy case version @@ -380,6 +401,33 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable in: context) try self.setVersions([appVersion]) } + + // Must _explicitly_ set to false to ensure it updates cached database value. + self.isPledged = false + + if let patreon = try container.decodeIfPresent(PatreonParameters.self, forKey: .patreon) + { + self.isPledgeRequired = true + self.isHiddenWithoutPledge = patreon.hidden ?? false // Default to showing Patreon apps + + if let pledge = patreon.pledge + { + self._pledgeAmount = pledge as NSDecimalNumber + self.pledgeCurrency = patreon.currency ?? "USD" // Only set pledge currency if explicitly given pledge. + } + else if patreon.pledge == nil && patreon.tiers == nil && patreon.benefit == nil + { + // No conditions, so default to pledgeAmount of 0 to simplify logic. + self._pledgeAmount = 0 as NSDecimalNumber + } + } + else + { + self.isPledgeRequired = false + self.isHiddenWithoutPledge = false + self._pledgeAmount = nil + self.pledgeCurrency = nil + } } catch {