OSDN Git Service

Loggerを利用するようにした
[kcd/KCD.git] / KCD / GuardShelterCommand.swift
1 //
2 //  GuardShelterCommand.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/15.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11
12 enum GuardEscapeAPI: String {
13     
14     case goback = "/kcsapi/api_req_combined_battle/goback_port"
15 }
16
17 extension Notification.Name {
18     
19     static let DidUpdateGuardEscape = Notification.Name("com.masakih.KCD.Notification.DidUpdateGuardEscape")
20 }
21
22 final class GuardShelterCommand: JSONCommand {
23     
24     override class func canExecuteAPI(_ api: String) -> Bool {
25         
26         return GuardEscapeAPI(rawValue: api) != nil ? true : false
27     }
28     
29     override func execute() {
30         
31         if let b = BattleAPI(rawValue: api) {
32             
33             switch b {
34             case .battleResult, .combinedBattleResult:
35                 registerReserve()
36                 
37             default:
38                 break
39             }
40         }
41         if let m = MapAPI(rawValue: api), m == .next {
42             
43             removeInvalidEntry()
44         }
45         if let _ = GuardEscapeAPI(rawValue: api) {
46             
47             ensureGuardShelter()
48         }
49         if let _ = PortAPI(rawValue: api) {
50             
51             removeAllEntry()
52         }
53     }
54     
55     private func damagedShipId(damagedPos: Int) -> Int? {
56         
57         let store = ServerDataStore.default
58         
59         switch damagedPos {
60         case 1...6: return store.deck(by: 1)?.shipId(of:damagedPos - 1)
61         case 7...12: return store.deck(by: 2)?.shipId(of: damagedPos - 6 - 1)
62         default: return nil
63         }
64     }
65     
66     private func registerReserve() {
67         
68         let escape = data["api_escape"]
69         
70         guard let guardianPos = escape["api_tow_idx"][0].int else { return }
71         
72         let fixedGuardianPos = guardianPos - 6 - 1
73                 
74         guard let guardianId = ServerDataStore.default.deck(by: 2)?.shipId(of: fixedGuardianPos) else {
75                 
76                 return Logger.shared.log("guardianPos is wrong")
77         }
78         
79         guard let escapeIdx = escape["api_escape_idx"][0].int,
80             let damagedId = damagedShipId(damagedPos: escapeIdx) else {
81                 
82                 return Logger.shared.log("damagedPos is wrong")
83         }
84         
85         let store = TemporaryDataStore.oneTimeEditor()
86         
87         guard let guardian = store.createGuardEscaped() else {
88             
89             return Logger.shared.log("Can not create GuardEscaped for guardinan")
90         }
91         
92         guardian.shipID = guardianId
93         guardian.ensured = false
94         
95         guard let damaged = store.createGuardEscaped() else {
96             
97             return Logger.shared.log("Can not create GuardEscaped for damaged")
98         }
99         
100         damaged.shipID = damagedId
101         damaged.ensured = false
102     }
103     
104     private func removeInvalidEntry() {
105         
106         let store = TemporaryDataStore.oneTimeEditor()
107         
108         store.notEnsuredGuardEscaped().forEach(store.delete)
109         store.save(errorHandler: store.presentOnMainThread)
110         Thread.sleep(forTimeInterval: 0.1)
111         notify()
112     }
113     
114     private func removeAllEntry() {
115         
116         let store = TemporaryDataStore.oneTimeEditor()
117         
118         store.guardEscaped().forEach(store.delete)
119         store.save(errorHandler: store.presentOnMainThread)
120         Thread.sleep(forTimeInterval: 0.1)
121         notify()
122     }
123     
124     func ensureGuardShelter() {
125         
126         let store = TemporaryDataStore.oneTimeEditor()
127         
128         store.guardEscaped().forEach { $0.ensured = true }
129         store.save(errorHandler: store.presentOnMainThread)
130         Thread.sleep(forTimeInterval: 0.1)
131         notify()
132     }
133     
134     private func notify() {
135         
136         DispatchQueue.main.async {
137             
138             NotificationCenter.default.post(name: .DidUpdateGuardEscape, object: self)
139         }
140     }
141 }