OSDN Git Service

アクションをdelegateではなくfirst responder に接続した
[kcd/KCD.git] / KCD / TSVSupport.swift
1 //
2 //  File.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/05.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate struct LFSeparateLine {
12     static let empty = LFSeparateLine(line: "", empty: true)
13     
14     let line: String
15     private let isEmpty: Bool
16     
17     init(line: String, empty: Bool = false) {
18         self.line = line
19         isEmpty = empty
20     }
21     func append(_ column: String) -> LFSeparateLine {
22         if isEmpty { return LFSeparateLine(line: column) }
23         let newLine = line + "\t" + column
24         return LFSeparateLine(line: newLine)
25     }
26     func append(_ dateCol: Date) -> LFSeparateLine {
27         return append("\(dateCol)")
28     }
29     func append(_ intCol: Int) -> LFSeparateLine {
30         return append("\(intCol)")
31     }
32     func append(_ boolCol: Bool) -> LFSeparateLine {
33         return append("\(boolCol)")
34     }
35 }
36
37 // swiftlint:disable type_body_length
38 class TSVSupport {
39     private let store = LocalDataStore.oneTimeEditor()
40     
41     private var dateFomatter: DateFormatter = {
42         let formatter = DateFormatter()
43         formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'Z"
44         return formatter
45     }()
46     
47     func load() {
48         let panel = NSOpenPanel()
49         panel.allowedFileTypes = ["kcdlocaldata"]
50         panel.begin {
51             guard $0 == NSModalResponseOK else { return }
52             
53             panel.urls.forEach { url in
54                 guard let fileW = try? FileWrapper(url: url) else { return }
55                 fileW.fileWrappers?.forEach {
56                     guard let data = $0.value.regularFileContents else { return }
57                     switch $0.key {
58                     case "kaihatu.tsv": self.registerKaihatuHistory(data)
59                     case "kenzo.tsv": self.registerKenzoHistory(data)
60                     case "kenzoMark.tsv": self.registerKenzoMark(data)
61                     case "dropShip.tsv": self.registerDropShipHistory(data)
62                     default: break
63                     }
64                 }
65                 
66             }
67         }
68     }
69     func save() {
70         let panel = NSSavePanel()
71         panel.allowedFileTypes = ["kcdlocaldata"]
72         panel.begin {
73             guard $0 == NSModalResponseOK,
74                 let url = panel.url
75                 else { return }
76             guard let kaihatuHistory = self.dataOfKaihatuHistory(),
77                 let kenzoHistory = self.dataOfKenzoHistory(),
78                 let kenzoMark = self.dataOfKenzoMark(),
79                 let dropShipHistory = self.dataOfDropShipHistory()
80                 else { return }
81             let fileW = FileWrapper(directoryWithFileWrappers: [:])
82             fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
83             fileW.addRegularFile(withContents: kenzoHistory, preferredFilename: "kenzo.tsv")
84             fileW.addRegularFile(withContents: kenzoMark, preferredFilename: "kenzoMark.tsv")
85             fileW.addRegularFile(withContents: dropShipHistory, preferredFilename: "dropShip.tsv")
86             do {
87                 try fileW.write(to: url, originalContentsURL: nil)
88             } catch { print("Error to write") }
89         }
90     }
91     
92     private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
93         let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
94         guard let array = try? store.objects(with: entity, sortDescriptors: [sortDesc])
95             else {
96                 print("Can not get \(entity.name)")
97                 return []
98         }
99         return array
100     }
101     private func dataOfKaihatuHistory() -> Data? {
102         return localData(KaihatuHistory.entity)
103             .map {
104                 LFSeparateLine.empty
105                     .append($0.date)
106                     .append($0.fuel)
107                     .append($0.bull)
108                     .append($0.steel)
109                     .append($0.bauxite)
110                     .append($0.kaihatusizai)
111                     .append($0.name)
112                     .append($0.flagShipName)
113                     .append($0.flagShipLv)
114                     .append($0.commanderLv)
115                     .line
116             }
117             .joined(separator: "\n")
118             .data(using: .utf8)
119     }
120     private func dataOfKenzoHistory() -> Data? {
121         return localData(KenzoHistory.entity)
122             .map {
123             LFSeparateLine.empty
124                 .append($0.date)
125                 .append($0.fuel)
126                 .append($0.bull)
127                 .append($0.steel)
128                 .append($0.bauxite)
129                 .append($0.kaihatusizai)
130                 .append($0.name)
131                 .append($0.sTypeId)
132                 .append($0.flagShipName)
133                 .append($0.flagShipLv)
134                 .append($0.commanderLv)
135                 .line
136             }
137             .joined(separator: "\n")
138             .data(using: .utf8)
139     }
140     private func dataOfKenzoMark() -> Data? {
141         return localData(KenzoMark.entity, sortBy: "kDockId")
142             .map {
143             LFSeparateLine.empty
144                 .append($0.date)
145                 .append($0.fuel)
146                 .append($0.bull)
147                 .append($0.steel)
148                 .append($0.bauxite)
149                 .append($0.kaihatusizai)
150                 .append($0.created_ship_id)
151                 .append($0.kDockId)
152                 .append($0.flagShipName)
153                 .append($0.flagShipLv)
154                 .append($0.commanderLv)
155                 .line
156             }
157             .joined(separator: "\n")
158             .data(using: .utf8)
159     }
160     private func dataOfDropShipHistory() -> Data? {
161         return localData(DropShipHistory.entity)
162             .map {
163                 LFSeparateLine.empty
164                     .append($0.date)
165                     .append($0.shipName)
166                     .append($0.mapArea)
167                     .append($0.mapInfo)
168                     .append($0.mapCell)
169                     .append($0.mapAreaName)
170                     .append($0.mapInfoName)
171                     .append($0.mark)
172                     .append($0.winRank)
173                     .line
174             }
175             .joined(separator: "\n")
176             .data(using: .utf8)
177     }
178     private func registerKaihatuHistory(_ data: Data) {
179         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
180         let store = LocalDataStore.oneTimeEditor()
181         array?.forEach {
182             let attr = $0.components(separatedBy: "\t")
183             guard attr.count == 10,
184                 let date = dateFomatter.date(from: attr[0]),
185                 let fuel = Int(attr[1]),
186                 let bull = Int(attr[2]),
187                 let steel = Int(attr[3]),
188                 let bauxite = Int(attr[4]),
189                 let kaihatu = Int(attr[5]),
190                 let flagLv = Int(attr[8]),
191                 let commandLv = Int(attr[9])
192                 else { return }
193             let p = NSPredicate(format: "date = %@", argumentArray: [date])
194             guard let oo = try? store.objects(with: KaihatuHistory.entity, predicate: p),
195                 oo.count != 0
196                 else { return }
197             
198             guard let obj = store.insertNewObject(for: KaihatuHistory.entity)
199                 else { return }
200             
201             obj.date = date
202             obj.fuel = fuel
203             obj.bull = bull
204             obj.steel = steel
205             obj.bauxite = bauxite
206             obj.kaihatusizai = kaihatu
207             obj.name = attr[6]
208             obj.flagShipName = attr[7]
209             obj.flagShipLv = flagLv
210             obj.commanderLv = commandLv
211         }
212     }
213     private func registerKenzoHistory(_ data: Data) {
214         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
215         let store = LocalDataStore.oneTimeEditor()
216         array?.forEach {
217             let attr = $0.components(separatedBy: "\t")
218             guard attr.count == 11,
219                 let date = dateFomatter.date(from: attr[0]),
220                 let fuel = Int(attr[1]),
221                 let bull = Int(attr[2]),
222                 let steel = Int(attr[3]),
223                 let bauxite = Int(attr[4]),
224                 let kaihatu = Int(attr[5]),
225                 let sType = Int(attr[7]),
226                 let flagLv = Int(attr[9]),
227                 let commandLv = Int(attr[10])
228                 else { return }
229             let p = NSPredicate(format: "date = %@", argumentArray: [date])
230             guard let oo = try? store.objects(with: KenzoHistory.entity, predicate: p),
231                 oo.count != 0
232                 else { return }
233             
234             guard let obj = store.insertNewObject(for: KenzoHistory.entity)
235                 else { return }
236             
237             obj.date = date
238             obj.fuel = fuel
239             obj.bull = bull
240             obj.steel = steel
241             obj.bauxite = bauxite
242             obj.kaihatusizai = kaihatu
243             obj.name = attr[6]
244             obj.sTypeId = sType
245             obj.flagShipName = attr[8]
246             obj.flagShipLv = flagLv
247             obj.commanderLv = commandLv
248         }
249     }
250     private func registerKenzoMark( _ data: Data) {
251         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
252         let store = LocalDataStore.oneTimeEditor()
253         array?.forEach {
254             let attr = $0.components(separatedBy: "\t")
255             guard attr.count == 11,
256                 let date = dateFomatter.date(from: attr[0]),
257                 let fuel = Int(attr[1]),
258                 let bull = Int(attr[2]),
259                 let steel = Int(attr[3]),
260                 let bauxite = Int(attr[4]),
261                 let kaihatu = Int(attr[5]),
262                 let shiId = Int(attr[6]),
263                 let kDock = Int(attr[7]),
264                 let flagLv = Int(attr[9]),
265                 let commandLv = Int(attr[10])
266                 else { return }
267             let p = NSPredicate(format: "date = %@", argumentArray: [date])
268             guard let oo = try? store.objects(with: KenzoMark.entity, predicate: p),
269                 oo.count != 0
270                 else { return }
271             
272             guard let obj = store.insertNewObject(for: KenzoMark.entity)
273                 else { return }
274             
275             obj.date = date
276             obj.fuel = fuel
277             obj.bull = bull
278             obj.steel = steel
279             obj.bauxite = bauxite
280             obj.kaihatusizai = kaihatu
281             obj.created_ship_id = shiId
282             obj.kDockId = kDock
283             obj.flagShipName = attr[8]
284             obj.flagShipLv = flagLv
285             obj.commanderLv = commandLv
286         }
287     }
288     private func registerDropShipHistory( _ data: Data) {
289         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
290         let store = LocalDataStore.oneTimeEditor()
291         array?.forEach {
292             let attr = $0.components(separatedBy: "\t")
293             guard attr.count == 9,
294                 let date = dateFomatter.date(from: attr[0]),
295                 let mapInfo = Int(attr[3]),
296                 let mapCell = Int(attr[4]),
297                 let mark = Int(attr[7])
298                 else { return }
299             let p = NSPredicate(format: "date = %@", argumentArray: [date])
300             guard let oo = try? store.objects(with: DropShipHistory.entity, predicate: p),
301                 oo.count != 0
302                 else { return }
303             
304             guard let obj = store.insertNewObject(for: DropShipHistory.entity)
305                 else { return }
306             
307             obj.date = date
308             obj.shipName = attr[1]
309             obj.mapArea = attr[2]
310             obj.mapInfo = mapInfo
311             obj.mapCell = mapCell
312             obj.mapAreaName = attr[5]
313             obj.mapInfoName = attr[6]
314             obj.mark = mark != 0
315             obj.winRank = attr[8]
316         }
317     }
318 }