OSDN Git Service

UIを調整
[kcd/KCD.git] / KCD / HMMemberShipCommand.m
1 //
2 //  HMMemberShipCommand.m
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2014/02/23.
6 //  Copyright (c) 2014年 Hori,Masaki. All rights reserved.
7 //
8
9 #import "HMMemberShipCommand.h"
10
11 @interface HMMemberShipCommand ()
12 @property (strong) NSMutableArray *ids;
13
14 @property (nonatomic, strong) NSArray *masterShips;
15 @property (nonatomic, strong) NSArray *slotItems;
16 @end
17
18 @implementation HMMemberShipCommand
19 + (void)load
20 {
21         static dispatch_once_t onceToken;
22         dispatch_once(&onceToken, ^{
23                 [HMJSONCommand registerClass:self];
24         });
25 }
26 + (BOOL)canExcuteAPI:(NSString *)api
27 {
28         if([api isEqualToString:@"/kcsapi/api_get_member/ship"]) return YES;
29         return NO;
30 }
31
32 - (NSArray *)ignoreKeys
33 {
34         static NSArray *ignoreKeys = nil;
35         if(ignoreKeys) return ignoreKeys;
36         
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"];
44         return ignoreKeys;
45 }
46
47 - (id)init
48 {
49         self = [super init];
50         if(self) {
51                 _ids = [NSMutableArray new];
52         }
53         return self;
54 }
55
56 - (void)execute
57 {
58         [self commitJSONToEntityNamed:@"Ship"];
59 }
60
61 - (NSString *)dataKey
62 {
63         if([self.api isEqualToString:@"/kcsapi/api_port/port"]) {
64                 return @"api_data.api_ship";
65         }
66         if([self.api isEqualToString:@"/kcsapi/api_get_member/ship3"]) {
67                 return @"api_data.api_ship_data";
68         }
69         if([self.api isEqualToString:@"/kcsapi/api_req_kousyou/getship"]) {
70                 return @"api_data.api_ship";
71         }
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";
76         }
77         return [super dataKey];
78 }
79
80 - (void)beginRegisterObject:(NSManagedObject *)object
81 {
82         [object setValue:nil forKey:@"sally_area"];
83 }
84
85 - (void)setMasterShip:(id)value toObject:(NSManagedObject *)object
86 {
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;
91         }
92         
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]];
98                 NSError *error = nil;
99                 self.masterShips = [managedObjectContext executeFetchRequest:req
100                                                                                                                 error:&error];
101                 if(error) {
102                         [self log:@"Fetch error: %@", error];
103                         return;
104                 }
105                 if(!self.masterShips || [self.masterShips count] == 0) {
106                         [self log:@"MasterShip is invalidate"];
107                         return;
108                 }
109         }
110         
111         NSRange range = NSMakeRange(0, self.masterShips.count);
112         NSUInteger index = [self.masterShips indexOfObject:value
113                                                                                  inSortedRange:range
114                                                                                            options:NSBinarySearchingFirstEqual
115                                                                            usingComparator:^(id obj1, id obj2) {
116                                                                                    id value1, value2;
117                                                                                    if([obj1 isKindOfClass:[NSNumber class]]) {
118                                                                                            value1 = obj1;
119                                                                                    } else {
120                                                                                            value1 = [obj1 valueForKey:@"id"];
121                                                                                    }
122                                                                                    if([obj2 isKindOfClass:[NSNumber class]]) {
123                                                                                            value2 = obj2;
124                                                                                    } else {
125                                                                                            value2 = [obj2 valueForKey:@"id"];
126                                                                                    }
127                                                                                    return [value1 compare:value2];
128                                                                            }];
129         if(index == NSNotFound) {
130                 [self log:@"Could not find ship of id (%@)", value];
131                 return;
132         }
133         id item = [self.masterShips objectAtIndex:index];
134         
135         [self setValueIfNeeded:item toObject:object forKey:@"master_ship"];
136         [self setValueIfNeeded:value toObject:object forKey:@"ship_id"];
137 }
138
139 - (void)addSlotItem:(id)slotItems toObject:(NSManagedObject *)object
140 {
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
148                                                                                                                          error:&error];
149                 if(error) {
150                         [self log:@"Fetch error: %@", error];
151                         return;
152                 }
153                 if([self.slotItems count] == 0) {
154                         return;
155                 }
156         }
157
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
163                                                                                    inSortedRange:range
164                                                                                                  options:NSBinarySearchingFirstEqual
165                                                                                  usingComparator:^(id obj1, id obj2) {
166                                                                                          id value1, value2;
167                                                                                          if([obj1 isKindOfClass:[NSNumber class]]) {
168                                                                                                  value1 = obj1;
169                                                                                          } else {
170                                                                                                  value1 = [obj1 valueForKey:@"id"];
171                                                                                          }
172                                                                                          if([obj2 isKindOfClass:[NSNumber class]]) {
173                                                                                                  value2 = obj2;
174                                                                                          } else {
175                                                                                                  value2 = [obj2 valueForKey:@"id"];
176                                                                                          }
177                                                                                          return [value1 compare:value2];
178                                                                                  }];
179                 if(index == NSNotFound) {
180                         id lastItem = [self.slotItems lastObject];
181                         NSInteger lastItemId = [[lastItem valueForKey:@"id"] integerValue];
182                         if(lastItemId < [value integerValue]) {
183 #if DEBUG
184                                 [self log:@"item is maybe unregistered, so it is new ship's equipment."];
185 #endif
186                         } else {
187                                 [self log:@"Item %@ is not found.", value];
188                         }
189                         continue;
190                 }
191                 id item = [self.slotItems objectAtIndex:index];
192                 
193                 [newItems addObject:item];
194         }
195         
196         NSMutableOrderedSet *orderedSet = [object mutableOrderedSetValueForKey:@"equippedItem"];
197         [orderedSet removeAllObjects];
198         [orderedSet addObjectsFromArray:newItems];
199 }
200
201 - (BOOL)handleExtraValue:(id)value forKey:(NSString *)key toObject:(NSManagedObject *)object
202 {
203         // 取得後破棄した艦娘のデータを削除する
204         if([key isEqualToString:@"api_id"]) {
205                 [self.ids addObject:value];
206         }
207         
208         if([key isEqualToString:@"api_ship_id"]) {
209                 [self setMasterShip:value toObject:object];
210                 return YES;
211         }
212         
213         if([key isEqualToString:@"api_exp"]) {
214                 if(![value isKindOfClass:[NSArray class]]) return NO;
215                 [self setValueIfNeeded:[value objectAtIndex:0] toObject:object forKey:@"exp"];
216                 return YES;
217         }
218         
219         if([key isEqualToString:@"api_slot"]) {
220                 [self addSlotItem:value toObject:object];
221                 return NO;
222         }
223         
224         return NO;
225 }
226
227 static BOOL isFewShipUpdateAPI(NSString *api)
228 {
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;
233         
234         return NO;
235 }
236 - (void)finishOperating:(NSManagedObjectContext *)moc
237 {
238         // ship3の時は1隻のみのデータアップデートがあるため
239         // getshipの時は取得した1隻のみのデータのため
240         if(isFewShipUpdateAPI(self.api)) {
241                 return;
242         }
243         
244         NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Ship"];
245         NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT id IN %@", self.ids];
246         [request setPredicate:predicate];
247         
248         NSError *error = nil;
249         NSArray *array = [moc executeFetchRequest:request error:&error];
250         if(error) {
251                 NSLog(@"HOGEEEEE");
252                 return;
253         }
254         
255         for(id obj in array) {
256                 [moc deleteObject:obj];
257         }
258         
259 //      if(array.count != 0) {
260 //              NSLog(@"%ld Objects deleted.", array.count);
261 //      }
262 //      
263 //      NSLog(@"updated count -> %ld\ndeleted -> %@", [[moc updatedObjects] count], [moc deletedObjects]);
264 }
265
266 @end