5 // Created by Hori,Masaki on 2017/02/05.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 private struct LFSeparateLine {
14 static let empty = LFSeparateLine(line: "", empty: true)
18 private let isEmpty: Bool
20 init(line: String, empty: Bool = false) {
26 func append(_ column: String) -> LFSeparateLine {
28 if isEmpty { return LFSeparateLine(line: column) }
30 let newLine = line + "\t" + column
32 return LFSeparateLine(line: newLine)
35 func append(_ dateCol: Date) -> LFSeparateLine {
37 return append("\(dateCol)")
40 func append(_ intCol: Int) -> LFSeparateLine {
42 return append("\(intCol)")
45 func append(_ boolCol: Bool) -> LFSeparateLine {
47 return append("\(boolCol)")
51 final class TSVSupport {
53 private let store = LocalDataStore.oneTimeEditor()
55 private var dateFomatter: DateFormatter = {
57 let formatter = DateFormatter()
58 formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'Z"
65 let panel = NSOpenPanel()
66 panel.allowedFileTypes = ["kcdlocaldata"]
69 guard $0 == .OK else {
74 panel.urls.forEach { url in
76 guard let fileW = try? FileWrapper(url: url) else {
81 fileW.fileWrappers?.forEach {
83 guard let data = $0.value.regularFileContents else {
90 case "kaihatu.tsv": self.registerKaihatuHistory(data)
92 case "kenzo.tsv": self.registerKenzoHistory(data)
94 case "kenzoMark.tsv": self.registerKenzoMark(data)
96 case "dropShip.tsv": self.registerDropShipHistory(data)
109 let panel = NSSavePanel()
110 panel.allowedFileTypes = ["kcdlocaldata"]
113 guard $0 == .OK else {
117 guard let url = panel.url else {
122 let data = self.store.sync { () -> (Data, Data, Data, Data)? in
124 guard let kaihatuHistory = self.dataOfKaihatuHistory() else {
128 guard let kenzoHistory = self.dataOfKenzoHistory() else {
132 guard let kenzoMark = self.dataOfKenzoMark() else {
136 guard let dropShipHistory = self.dataOfDropShipHistory() else {
141 return (kaihatuHistory, kenzoHistory, kenzoMark, dropShipHistory)
143 guard let (kaihatuHistory, kenzoHistory, kenzoMark, dropShipHistory) = data else {
148 let fileW = FileWrapper(directoryWithFileWrappers: [:])
149 fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
150 fileW.addRegularFile(withContents: kenzoHistory, preferredFilename: "kenzo.tsv")
151 fileW.addRegularFile(withContents: kenzoMark, preferredFilename: "kenzoMark.tsv")
152 fileW.addRegularFile(withContents: dropShipHistory, preferredFilename: "dropShip.tsv")
155 try fileW.write(to: url, originalContentsURL: nil)
159 print("Error to write")
164 private func localData<ResultType: Entity, Value>(_ type: ResultType.Type, sortBy: KeyPath<ResultType, Value>) -> [ResultType] {
166 let sortDesc = SortDescriptors(keyPath: sortBy, ascending: true)
168 guard let array = try? store.objects(of: type, sortDescriptors: sortDesc) else {
170 print("Can not get \(type)")
178 private func dataOfKaihatuHistory() -> Data? {
180 return localData(KaihatuHistory.self, sortBy: \KaihatuHistory.date)
188 .append($0.kaihatusizai)
190 .append($0.flagShipName)
191 .append($0.flagShipLv)
192 .append($0.commanderLv)
195 .joined(separator: "\n")
199 private func dataOfKenzoHistory() -> Data? {
201 return localData(KenzoHistory.self, sortBy: \KenzoHistory.date)
209 .append($0.kaihatusizai)
212 .append($0.flagShipName)
213 .append($0.flagShipLv)
214 .append($0.commanderLv)
217 .joined(separator: "\n")
221 private func dataOfKenzoMark() -> Data? {
223 return localData(KenzoMark.self, sortBy: \KenzoMark.kDockId)
231 .append($0.kaihatusizai)
232 .append($0.created_ship_id)
234 .append($0.flagShipName)
235 .append($0.flagShipLv)
236 .append($0.commanderLv)
239 .joined(separator: "\n")
243 private func dataOfDropShipHistory() -> Data? {
245 return localData(DropShipHistory.self, sortBy: \DropShipHistory.date)
253 .append($0.mapAreaName)
254 .append($0.mapInfoName)
259 .joined(separator: "\n")
263 private func registerKaihatuHistory(_ data: Data) {
265 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
268 let attr = $0.components(separatedBy: "\t")
270 guard attr.count == 10 else {
274 guard let date = dateFomatter.date(from: attr[0]) else {
278 guard let fuel = Int(attr[1]) else {
282 guard let bull = Int(attr[2]) else {
286 guard let steel = Int(attr[3]) else {
290 guard let bauxite = Int(attr[4]) else {
294 guard let kaihatu = Int(attr[5]) else {
298 guard let flagLv = Int(attr[8]) else {
302 guard let commandLv = Int(attr[9]) else {
307 let predicate = Predicate(\KaihatuHistory.date, equalTo: date)
309 guard let oo = try? store.objects(of: KaihatuHistory.self, predicate: predicate) else {
313 guard oo.count != 0 else {
317 guard let obj = store.insertNewObject(for: KaihatuHistory.self) else {
326 obj.bauxite = bauxite
327 obj.kaihatusizai = kaihatu
329 obj.flagShipName = attr[7]
330 obj.flagShipLv = flagLv
331 obj.commanderLv = commandLv
335 private func registerKenzoHistory(_ data: Data) {
337 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
341 let attr = $0.components(separatedBy: "\t")
343 guard attr.count == 11 else {
347 guard let date = dateFomatter.date(from: attr[0]) else {
351 guard let fuel = Int(attr[1]) else {
355 guard let bull = Int(attr[2]) else {
359 guard let steel = Int(attr[3]) else {
363 guard let bauxite = Int(attr[4]) else {
367 guard let kaihatu = Int(attr[5]) else {
371 guard let sType = Int(attr[7]) else {
375 guard let flagLv = Int(attr[9]) else {
379 guard let commandLv = Int(attr[10]) else {
384 let predicate = Predicate(\KenzoHistory.date, equalTo: date)
386 guard let oo = try? store.objects(of: KenzoHistory.self, predicate: predicate) else {
390 guard oo.count != 0 else {
394 guard let obj = store.insertNewObject(for: KenzoHistory.self) else {
403 obj.bauxite = bauxite
404 obj.kaihatusizai = kaihatu
407 obj.flagShipName = attr[8]
408 obj.flagShipLv = flagLv
409 obj.commanderLv = commandLv
413 private func registerKenzoMark( _ data: Data) {
415 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
419 let attr = $0.components(separatedBy: "\t")
421 guard attr.count == 11 else {
425 guard let date = dateFomatter.date(from: attr[0]) else {
429 guard let fuel = Int(attr[1]) else {
433 guard let bull = Int(attr[2]) else {
437 guard let steel = Int(attr[3]) else {
441 guard let bauxite = Int(attr[4]) else {
445 guard let kaihatu = Int(attr[5]) else {
449 guard let shiId = Int(attr[6]) else {
453 guard let kDock = Int(attr[7]) else {
457 guard let flagLv = Int(attr[9]) else {
461 guard let commandLv = Int(attr[10]) else {
466 let predicate = Predicate(\KenzoMark.date, equalTo: date)
468 guard let oo = try? store.objects(of: KenzoMark.self, predicate: predicate) else {
472 guard oo.count != 0 else {
476 guard let obj = store.insertNewObject(for: KenzoMark.self) else {
485 obj.bauxite = bauxite
486 obj.kaihatusizai = kaihatu
487 obj.created_ship_id = shiId
489 obj.flagShipName = attr[8]
490 obj.flagShipLv = flagLv
491 obj.commanderLv = commandLv
495 private func registerDropShipHistory( _ data: Data) {
497 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
501 let attr = $0.components(separatedBy: "\t")
503 guard attr.count == 9 else {
507 guard let date = dateFomatter.date(from: attr[0]) else {
511 guard let mapInfo = Int(attr[3]) else {
515 guard let mapCell = Int(attr[4]) else {
519 guard let mark = Int(attr[7]) else {
524 let predicate = Predicate(\DropShipHistory.date, equalTo: date)
526 guard let oo = try? store.objects(of: DropShipHistory.self, predicate: predicate) else {
530 guard oo.count != 0 else {
534 guard let obj = store.insertNewObject(for: DropShipHistory.self) else {
540 obj.shipName = attr[1]
541 obj.mapArea = attr[2]
542 obj.mapInfo = mapInfo
543 obj.mapCell = mapCell
544 obj.mapAreaName = attr[5]
545 obj.mapInfoName = attr[6]
547 obj.winRank = attr[8]