Skip to content

Commit 3555614

Browse files
Cache mod dependency metadata checks
1 parent de5eac9 commit 3555614

4 files changed

Lines changed: 47 additions & 2 deletions

File tree

Natives/installer/modpack/CurseForgeAPI.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ - (NSDictionary *)modManagerRecordForFile:(NSDictionary *)file projectID:(NSNumb
135135
@"size": size,
136136
@"gameVersion": [self minecraftVersionForFile:file],
137137
@"dependencies": [self normalizedCurseForgeDependencies:([file[@"dependencies"] isKindOfClass:NSArray.class] ? file[@"dependencies"] : @[])],
138+
@"dependencyMetadataCheckedAt": @([[NSDate date] timeIntervalSince1970]),
138139
@"enabled": @YES
139140
};
140141
}

Natives/installer/mods/ModManagerAPI.m

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
static NSString * const kModSourceModrinth = @"modrinth";
88
static 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

Natives/installer/mods/ModManagerStore.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ - (NSDictionary *)installPlanForFiles:(NSArray<NSDictionary *> *)files error:(NS
456456
NSString *title = [file[@"title"] isKindOfClass:NSString.class] ? file[@"title"] : fileName;
457457

458458
NSMutableDictionary *record = [NSMutableDictionary new];
459-
NSArray *recordKeys = @[@"source", @"projectId", @"versionId", @"fileId", @"title", @"versionName", @"summary", @"iconUrl", @"fileName", @"sha1", @"size", @"gameVersion", @"loaders", @"dependencies", @"datePublished"];
459+
NSArray *recordKeys = @[@"source", @"projectId", @"versionId", @"fileId", @"title", @"versionName", @"summary", @"iconUrl", @"fileName", @"sha1", @"size", @"gameVersion", @"loaders", @"dependencies", @"datePublished", @"dependencyMetadataCheckedAt"];
460460
for (NSString *key in recordKeys) {
461461
id value = file[key];
462462
if (value && value != NSNull.null) {

Natives/installer/mods/ModManagerViewController.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ @interface ModManagerViewController ()
1818
@property(nonatomic) UISearchController *searchController;
1919
@property(nonatomic) NSArray<NSMutableDictionary *> *mods;
2020
@property(nonatomic) BOOL checkingUpdates;
21+
@property(nonatomic) BOOL checkingDependencies;
2122
@end
2223

2324
@implementation ModManagerViewController
@@ -86,6 +87,12 @@ - (void)setCheckingUpdates:(BOOL)checkingUpdates {
8687
}
8788
}
8889

90+
- (void)setCheckingDependencies:(BOOL)checkingDependencies {
91+
_checkingDependencies = checkingDependencies;
92+
self.tableView.userInteractionEnabled = !checkingDependencies;
93+
self.navigationItem.prompt = checkingDependencies ? @"Checking dependencies..." : nil;
94+
}
95+
8996
- (void)actionCheckUpdates {
9097
if (self.checkingUpdates) {
9198
return;
@@ -253,6 +260,7 @@ - (NSDictionary *)currentInstalledModMatchingMod:(NSDictionary *)mod {
253260

254261
- (void)refreshProviderMetadataForMod:(NSDictionary *)mod completion:(void (^)(NSDictionary *currentMod))completion {
255262
NSArray *installedMods = [self.store installedMods];
263+
self.checkingDependencies = YES;
256264
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
257265
NSArray *records = [self.api refreshedMetadataForInstalledMods:installedMods profileInfo:self.store.profileInfo];
258266
NSError *error = self.api.lastError;
@@ -263,6 +271,7 @@ - (void)refreshProviderMetadataForMod:(NSDictionary *)mod completion:(void (^)(N
263271
}
264272
}
265273
dispatch_async(dispatch_get_main_queue(), ^{
274+
self.checkingDependencies = NO;
266275
if (error) {
267276
[self presentError:error];
268277
if (completion) {

0 commit comments

Comments
 (0)