OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / SetPlaneCommand.swift
index 6fc9fdd..45f68a6 100644 (file)
@@ -8,43 +8,70 @@
 
 import Cocoa
 
-class SetPlaneCommand: JSONCommand {
-    override class func canExecuteAPI(_ api: String) -> Bool {
-        if api == "/kcsapi/api_req_air_corps/set_plane" { return true }
-        return false
+final class SetPlaneCommand: JSONCommand {
+    
+    override class func canExecuteAPI(_ api: API) -> Bool {
+        
+        return api.endpoint == .setPlane
     }
     
     override func execute() {
+        
         guard let areaId = parameter["api_area_id"].int,
             let rId = parameter["api_base_id"].int,
-            let squadronId = parameter["api_squadron_id"].int
-            else { return print("Argument is wrong") }
-        guard let distance = data["api_distance"].int,
-            let bauxite = data["api_after_bauxite"].int
-            else { return print("JSON is wrong") }
-        let planInfo = data["api_plane_info"][0]
-        guard let cond = planInfo["api_cond"].int,
-            let slotid = planInfo["api_slotid"].int,
-            let state = planInfo["api_state"].int,
-            let count = planInfo["api_count"].int,
-            let maxCount = planInfo["api_max_count"].int
-            else { return print("api_plane_info is wrong") }
+            let squadronId = parameter["api_squadron_id"].int else {
+                
+                Logger.shared.log("SetPlaneCommand: Argument is wrong")
+                
+                return
+        }
+        guard let distance = data["api_distance"].int else {
+            
+            Logger.shared.log("SetPlaneCommand: JSON is wrong")
+            
+            return
+        }
         
-        let store = ServerDataStore.oneTimeEditor()
-        guard let airbase = store.airBase(area: areaId, base: rId)
-            else { return print("AirBase is not found") }
-        let planes = airbase.planeInfo
-        guard planes.count >= squadronId,
-            let plane = planes[squadronId - 1] as? AirBasePlaneInfo
-            else { return print("AirBase is wrong") }
-        plane.cond = cond
-        plane.slotid = slotid
-        plane.state = state
-        plane.count = count
-        plane.max_count = maxCount
+        let planInfo = data["api_plane_info"][0]
         
-        airbase.distance = distance
+        guard let slotid = planInfo["api_slotid"].int,
+            let state = planInfo["api_state"].int else {
+                
+                Logger.shared.log("api_plane_info is wrong")
+                
+                return
+        }
         
-        store.material()?.bauxite = bauxite
+        let store = ServerDataStore.oneTimeEditor()
+        store.sync {
+            
+            guard let airbase = store.airBase(area: areaId, base: rId) else {
+                
+                Logger.shared.log("AirBase is not found")
+                
+                return
+            }
+            
+            let planes = airbase.planeInfo
+            
+            guard planes.count >= squadronId,
+                let plane = planes[squadronId - 1] as? AirBasePlaneInfo else {
+                    
+                    Logger.shared.log("AirBase is wrong")
+                    
+                    return
+            }
+            
+            // TODO: state が 2 の時のみ cond, count, max_count がnilであることを許すようにする
+            plane.cond = planInfo["api_cond"].int ?? 0
+            plane.slotid = slotid
+            plane.state = state
+            plane.count = planInfo["api_count"].int ?? 0
+            plane.max_count = planInfo["api_max_count"].int ?? 0
+            
+            airbase.distance = distance
+            
+            self.data["api_after_bauxite"].int.map { store.material()?.bauxite = $0 }
+        }
     }
 }