OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / SlotResetCommand.swift
index e4b6d6c..790ff40 100644 (file)
@@ -8,35 +8,53 @@
 
 import Cocoa
 
-class SlotResetCommand: JSONCommand {
-    override class func canExecuteAPI(_ api: String) -> Bool {
-        if api == "/kcsapi/api_req_kaisou/slot_exchange_index" { return true }
-        return false
+final class SlotResetCommand: JSONCommand {
+    
+    override class func canExecuteAPI(_ api: API) -> Bool {
+        
+        return api.endpoint == .exchangeIndex
     }
     
     override func execute() {
-        let store = ServerDataStore.oneTimeEditor()
-        guard let ship = arguments["api_id"]
-            .int
-            .flatMap({ store.ship(byId: $0) })
-            else { return print("api_id is wrong") }
-        guard let slotItems = data["api_slot"].arrayObject as? [Int]
-            else { return print("Can not parse api_data.api_slot") }
         
-        slotItems.enumerated().forEach { ship.setItem($0.element, for: $0.offset) }
-        
-        let storedSlotItems = store.sortedSlotItemsById()
-        let newSet = slotItems
-            .flatMap { slotItem -> SlotItem? in
-                guard slotItem > 0 else { return nil }
-                let found = storedSlotItems.binarySearch { $0.id ==? slotItem }
-                if let item = found {
-                    return item
-                }
-                print("Item \(slotItem) is not found")
-                return nil
+        let store = ServerDataStore.oneTimeEditor()
+        store.sync {
+            
+            guard let ship = self.parameter["api_id"].int.flatMap(store.ship(by:)) else {
+                
+                Logger.shared.log("api_id is wrong")
+                
+                return
+            }
+            guard let slotItems = self.data["api_slot"].arrayObject as? [Int] else {
+                
+                Logger.shared.log("Can not parse api_data.api_slot")
+                
+                return
+            }
+            
+            zip(slotItems, 0...).forEach(ship.setItem)
+            
+            let storedSlotItems = store.sortedSlotItemsById()
+            let newSet = slotItems
+                .compactMap { slotItem -> SlotItem? in
+                    
+                    guard slotItem > 0 else {
+                        
+                        return nil
+                    }
+                    
+                    let found = storedSlotItems.binarySearch { $0.id ==? slotItem }
+                    if let item = found {
+                        
+                        return item
+                    }
+                    print("Item \(slotItem) is not found")
+                    
+                    return nil
+            }
+            
+            ship.equippedItem = NSOrderedSet(array: newSet)
         }
-        
-        ship.equippedItem = NSOrderedSet(array: newSet)
     }
 }