2 // HMMemberShipCommand.m
5 // Created by Hori,Masaki on 2014/02/23.
6 // Copyright (c) 2014年 Hori,Masaki. All rights reserved.
9 #import "HMMemberShipCommand.h"
11 @interface HMMemberShipCommand ()
12 @property (strong) NSMutableArray *ids;
14 @property (nonatomic, strong) NSArray *masterShips;
15 @property (nonatomic, strong) NSArray *slotItems;
18 @implementation HMMemberShipCommand
21 static dispatch_once_t onceToken;
22 dispatch_once(&onceToken, ^{
23 [HMJSONCommand registerClass:self];
26 + (BOOL)canExcuteAPI:(NSString *)api
28 if([api isEqualToString:@"/kcsapi/api_get_member/ship"]) return YES;
32 - (NSArray *)ignoreKeys
34 static NSArray *ignoreKeys = nil;
35 if(ignoreKeys) return ignoreKeys;
37 ignoreKeys = @[@"api_gomes", @"api_gomes2", @"api_broken", @"api_powup",
38 @"api_voicef", @"api_afterlv", @"api_aftershipid", @"api_backs",
39 @"api_slotnum", @"api_stype", @"api_name", @"api_yomi",
40 @"api_raig", @"api_luck", @"api_saku", @"api_raim", @"api_baku",
41 @"api_taik", @"api_houg", @"api_souk", @"api_houm", @"api_tyku",
42 @"api_ndock_item", @"api_soku", @"api_star",
43 @"api_ndock_time_str", @"api_member_id", @"api_fuel_max", @"api_bull_max"];
51 _ids = [NSMutableArray new];
58 [self commitJSONToEntityNamed:@"Ship"];
63 if([self.api isEqualToString:@"/kcsapi/api_port/port"]) {
64 return @"api_data.api_ship";
66 if([self.api isEqualToString:@"/kcsapi/api_get_member/ship3"]) {
67 return @"api_data.api_ship_data";
69 if([self.api isEqualToString:@"/kcsapi/api_req_kousyou/getship"]) {
70 return @"api_data.api_ship";
72 if([self.api isEqualToString:@"/kcsapi/api_get_member/ship_deck"]) {
73 return @"api_data.api_ship_data";
74 }if([self.api isEqualToString:@"/kcsapi/api_req_kaisou/powerup"]) {
75 return @"api_data.api_ship";
77 return [super dataKey];
80 - (void)beginRegisterObject:(NSManagedObject *)object
82 [object setValue:nil forKey:@"sally_area"];
85 - (void)setMasterShip:(id)value toObject:(NSManagedObject *)object
87 id currentValue = [object valueForKeyPath:@"master_ship.name"];
88 if(currentValue && ![currentValue isEqual:[NSNull null]]) {
89 NSNumber *shipId = [object valueForKey:@"ship_id"];
90 if([value isEqual:shipId]) return;
93 if(!self.masterShips) {
94 NSManagedObjectContext *managedObjectContext = [object managedObjectContext];
95 NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"MasterShip"];
96 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
97 [req setSortDescriptors:@[sortDescriptor]];
99 self.masterShips = [managedObjectContext executeFetchRequest:req
102 [self log:@"Fetch error: %@", error];
105 if(!self.masterShips || [self.masterShips count] == 0) {
106 [self log:@"MasterShip is invalidate"];
111 NSRange range = NSMakeRange(0, self.masterShips.count);
112 NSUInteger index = [self.masterShips indexOfObject:value
114 options:NSBinarySearchingFirstEqual
115 usingComparator:^(id obj1, id obj2) {
117 if([obj1 isKindOfClass:[NSNumber class]]) {
120 value1 = [obj1 valueForKey:@"id"];
122 if([obj2 isKindOfClass:[NSNumber class]]) {
125 value2 = [obj2 valueForKey:@"id"];
127 return [value1 compare:value2];
129 if(index == NSNotFound) {
130 [self log:@"Could not find ship of id (%@)", value];
133 id item = [self.masterShips objectAtIndex:index];
135 [self setValueIfNeeded:item toObject:object forKey:@"master_ship"];
136 [self setValueIfNeeded:value toObject:object forKey:@"ship_id"];
139 - (void)addSlotItem:(id)slotItems toObject:(NSManagedObject *)object
141 if(!self.slotItems) {
142 NSError *error = nil;
143 NSManagedObjectContext *managedObjectContext = [object managedObjectContext];
144 NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"SlotItem"];
145 NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:YES];
146 [req setSortDescriptors:@[sortDescriptor]];
147 self.slotItems = [managedObjectContext executeFetchRequest:req
150 [self log:@"Fetch error: %@", error];
153 if([self.slotItems count] == 0) {
158 NSMutableArray *newItems = [NSMutableArray new];
159 NSRange range = NSMakeRange(0, self.slotItems.count);
160 for(id value in slotItems) {
161 if([value integerValue] == -1) continue;
162 NSUInteger index = [self.slotItems indexOfObject:value
164 options:NSBinarySearchingFirstEqual
165 usingComparator:^(id obj1, id obj2) {
167 if([obj1 isKindOfClass:[NSNumber class]]) {
170 value1 = [obj1 valueForKey:@"id"];
172 if([obj2 isKindOfClass:[NSNumber class]]) {
175 value2 = [obj2 valueForKey:@"id"];
177 return [value1 compare:value2];
179 if(index == NSNotFound) {
180 id lastItem = [self.slotItems lastObject];
181 NSInteger lastItemId = [[lastItem valueForKey:@"id"] integerValue];
182 if(lastItemId < [value integerValue]) {
184 [self log:@"item is maybe unregistered, so it is new ship's equipment."];
187 [self log:@"Item %@ is not found.", value];
191 id item = [self.slotItems objectAtIndex:index];
193 [newItems addObject:item];
196 NSMutableOrderedSet *orderedSet = [object mutableOrderedSetValueForKey:@"equippedItem"];
197 [orderedSet removeAllObjects];
198 [orderedSet addObjectsFromArray:newItems];
201 - (BOOL)handleExtraValue:(id)value forKey:(NSString *)key toObject:(NSManagedObject *)object
203 // 取得後破棄した艦娘のデータを削除する
204 if([key isEqualToString:@"api_id"]) {
205 [self.ids addObject:value];
208 if([key isEqualToString:@"api_ship_id"]) {
209 [self setMasterShip:value toObject:object];
213 if([key isEqualToString:@"api_exp"]) {
214 if(![value isKindOfClass:[NSArray class]]) return NO;
215 [self setValueIfNeeded:[value objectAtIndex:0] toObject:object forKey:@"exp"];
219 if([key isEqualToString:@"api_slot"]) {
220 [self addSlotItem:value toObject:object];
227 static BOOL isFewShipUpdateAPI(NSString *api)
229 if([api isEqualToString:@"/kcsapi/api_get_member/ship3"]) return YES;
230 if([api isEqualToString:@"/kcsapi/api_req_kousyou/getship"]) return YES;
231 if([api isEqualToString:@"/kcsapi/api_get_member/ship_deck"]) return YES;
232 if([api isEqualToString:@"/kcsapi/api_req_kaisou/powerup"]) return YES;
236 - (void)finishOperating:(NSManagedObjectContext *)moc
238 // ship3の時は1隻のみのデータアップデートがあるため
239 // getshipの時は取得した1隻のみのデータのため
240 if(isFewShipUpdateAPI(self.api)) {
244 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ship"];
245 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT id IN %@", self.ids];
246 [request setPredicate:predicate];
248 NSError *error = nil;
249 NSArray *array = [moc executeFetchRequest:request error:&error];
255 for(id obj in array) {
256 [moc deleteObject:obj];
259 // if(array.count != 0) {
260 // NSLog(@"%ld Objects deleted.", array.count);
263 // NSLog(@"updated count -> %ld\ndeleted -> %@", [[moc updatedObjects] count], [moc deletedObjects]);