66
77static NSString * const kModSourceModrinth = @" modrinth" ;
88static NSString * const kModSourceCurseForge = @" curseforge" ;
9+ static NSString * const kDependencyMetadataCheckedAtKey = @" dependencyMetadataCheckedAt" ;
10+ static NSTimeInterval const kDependencyMetadataRefreshInterval = 24.0 * 60.0 * 60.0 ;
911
1012@interface ModManagerAPI ()
1113@property (nonatomic ) ModrinthAPI *modrinth;
@@ -144,6 +146,38 @@ - (NSDictionary *)modrinthVersionForID:(NSString *)versionID {
144146 return [version isKindOfClass: NSDictionary .class] ? version : nil ;
145147}
146148
149+ - (NSNumber *)currentTimestamp {
150+ return @([[NSDate date ] timeIntervalSince1970 ]);
151+ }
152+
153+ - (BOOL )modNeedsDependencyMetadataRefresh : (NSDictionary *)mod {
154+ if (![mod isKindOfClass: NSDictionary .class] || [mod[@" missing" ] boolValue ]) {
155+ return NO ;
156+ }
157+
158+ NSArray *dependencies = [mod[@" dependencies" ] isKindOfClass: NSArray .class] ? mod[@" dependencies" ] : nil ;
159+ if (dependencies) {
160+ NSNumber *checkedAt = [mod[kDependencyMetadataCheckedAtKey ] respondsToSelector: @selector (doubleValue )] ? mod[kDependencyMetadataCheckedAtKey ] : nil ;
161+ if (!checkedAt) {
162+ return NO ;
163+ }
164+ return [[NSDate date ] timeIntervalSince1970 ] - checkedAt.doubleValue > kDependencyMetadataRefreshInterval ;
165+ }
166+
167+ NSString *source = mod[@" source" ];
168+ if ([source isEqualToString: kModSourceCurseForge ]) {
169+ return mod[@" fileId" ] && mod[@" projectId" ];
170+ }
171+ if ([source isEqualToString: kModSourceModrinth ]) {
172+ NSString *versionID = mod[@" versionId" ];
173+ NSString *sha = mod[@" sha1" ];
174+ return ([versionID isKindOfClass: NSString .class] && versionID.length > 0 ) ||
175+ ([sha isKindOfClass: NSString .class] && sha.length > 0 ) ||
176+ [mod[@" path" ] isKindOfClass: NSString .class];
177+ }
178+ return NO ;
179+ }
180+
147181- (NSString *)jsonStringForArray : (NSArray *)array {
148182 if (![array isKindOfClass: NSArray .class]) {
149183 return @" []" ;
@@ -498,6 +532,7 @@ - (NSMutableDictionary *)recordFromNormalizedVersion:(NSDictionary *)version loc
498532 if (!record[@" installedAt" ] && mod[@" installedAt" ]) {
499533 record[@" installedAt" ] = mod[@" installedAt" ];
500534 }
535+ record[kDependencyMetadataCheckedAtKey ] = [self currentTimestamp ];
501536 return record;
502537}
503538
@@ -518,7 +553,7 @@ - (NSMutableDictionary *)recordFromNormalizedVersion:(NSDictionary *)version loc
518553 NSMutableSet <NSString *> *seenModrinthHashes = [NSMutableSet new ];
519554
520555 for (NSDictionary *mod in mods) {
521- if (![mod isKindOfClass: NSDictionary .class] || [ mod[ @" missing " ] boolValue ]) {
556+ if (![self modNeedsDependencyMetadataRefresh: mod]) {
522557 continue ;
523558 }
524559
0 commit comments