5 // Created by Hori,Masaki on 2017/02/05.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private struct LFSeparateLine {
13 static let empty = LFSeparateLine(line: "", empty: true)
17 private let isEmpty: Bool
19 init(line: String, empty: Bool = false) {
25 func append(_ column: String) -> LFSeparateLine {
27 if isEmpty { return LFSeparateLine(line: column) }
29 let newLine = line + "\t" + column
31 return LFSeparateLine(line: newLine)
34 func append(_ dateCol: Date) -> LFSeparateLine {
36 return append("\(dateCol)")
39 func append(_ intCol: Int) -> LFSeparateLine {
41 return append("\(intCol)")
44 func append(_ boolCol: Bool) -> LFSeparateLine {
46 return append("\(boolCol)")
50 // swiftlint:disable type_body_length
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"
64 let panel = NSOpenPanel()
65 panel.allowedFileTypes = ["kcdlocaldata"]
68 guard $0 == .OK else { return }
70 panel.urls.forEach { url in
72 guard let fileW = try? FileWrapper(url: url) else { return }
74 fileW.fileWrappers?.forEach {
76 guard let data = $0.value.regularFileContents else { return }
79 case "kaihatu.tsv": self.registerKaihatuHistory(data)
80 case "kenzo.tsv": self.registerKenzoHistory(data)
81 case "kenzoMark.tsv": self.registerKenzoMark(data)
82 case "dropShip.tsv": self.registerDropShipHistory(data)
93 let panel = NSSavePanel()
94 panel.allowedFileTypes = ["kcdlocaldata"]
97 guard $0 == .OK else { return }
98 guard let url = panel.url else { return }
99 guard let kaihatuHistory = self.dataOfKaihatuHistory() else { return }
100 guard let kenzoHistory = self.dataOfKenzoHistory() else { return }
101 guard let kenzoMark = self.dataOfKenzoMark() else { return }
102 guard let dropShipHistory = self.dataOfDropShipHistory() else { return }
104 let fileW = FileWrapper(directoryWithFileWrappers: [:])
105 fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
106 fileW.addRegularFile(withContents: kenzoHistory, preferredFilename: "kenzo.tsv")
107 fileW.addRegularFile(withContents: kenzoMark, preferredFilename: "kenzoMark.tsv")
108 fileW.addRegularFile(withContents: dropShipHistory, preferredFilename: "dropShip.tsv")
111 try fileW.write(to: url, originalContentsURL: nil)
115 print("Error to write")
120 private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
122 let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
124 guard let array = try? store.objects(of: entity, sortDescriptors: [sortDesc]) else {
126 print("Can not get \(entity.name)")
133 private func dataOfKaihatuHistory() -> Data? {
135 return localData(KaihatuHistory.entity)
143 .append($0.kaihatusizai)
145 .append($0.flagShipName)
146 .append($0.flagShipLv)
147 .append($0.commanderLv)
150 .joined(separator: "\n")
154 private func dataOfKenzoHistory() -> Data? {
156 return localData(KenzoHistory.entity)
164 .append($0.kaihatusizai)
167 .append($0.flagShipName)
168 .append($0.flagShipLv)
169 .append($0.commanderLv)
172 .joined(separator: "\n")
176 private func dataOfKenzoMark() -> Data? {
178 return localData(KenzoMark.entity, sortBy: "kDockId")
186 .append($0.kaihatusizai)
187 .append($0.created_ship_id)
189 .append($0.flagShipName)
190 .append($0.flagShipLv)
191 .append($0.commanderLv)
194 .joined(separator: "\n")
198 private func dataOfDropShipHistory() -> Data? {
200 return localData(DropShipHistory.entity)
208 .append($0.mapAreaName)
209 .append($0.mapInfoName)
214 .joined(separator: "\n")
218 private func registerKaihatuHistory(_ data: Data) {
220 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
221 let store = LocalDataStore.oneTimeEditor()
224 let attr = $0.components(separatedBy: "\t")
226 guard attr.count == 10 else { return }
227 guard let date = dateFomatter.date(from: attr[0]) else { return }
228 guard let fuel = Int(attr[1]) else { return }
229 guard let bull = Int(attr[2]) else { return }
230 guard let steel = Int(attr[3]) else { return }
231 guard let bauxite = Int(attr[4]) else { return }
232 guard let kaihatu = Int(attr[5]) else { return }
233 guard let flagLv = Int(attr[8]) else { return }
234 guard let commandLv = Int(attr[9]) else { return }
236 let p = NSPredicate(#keyPath(KaihatuHistory.date), equal: date)
238 guard let oo = try? store.objects(of: KaihatuHistory.entity, predicate: p) else { return }
239 guard oo.count != 0 else { return }
240 guard let obj = store.insertNewObject(for: KaihatuHistory.entity) else { return }
246 obj.bauxite = bauxite
247 obj.kaihatusizai = kaihatu
249 obj.flagShipName = attr[7]
250 obj.flagShipLv = flagLv
251 obj.commanderLv = commandLv
255 private func registerKenzoHistory(_ data: Data) {
257 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
258 let store = LocalDataStore.oneTimeEditor()
262 let attr = $0.components(separatedBy: "\t")
264 guard attr.count == 11 else { return }
265 guard let date = dateFomatter.date(from: attr[0]) else { return }
266 guard let fuel = Int(attr[1]) else { return }
267 guard let bull = Int(attr[2]) else { return }
268 guard let steel = Int(attr[3]) else { return }
269 guard let bauxite = Int(attr[4]) else { return }
270 guard let kaihatu = Int(attr[5]) else { return }
271 guard let sType = Int(attr[7]) else { return }
272 guard let flagLv = Int(attr[9]) else { return }
273 guard let commandLv = Int(attr[10]) else { return }
275 let p = NSPredicate(#keyPath(KenzoHistory.date), equal: date)
277 guard let oo = try? store.objects(of: KenzoHistory.entity, predicate: p) else { return }
278 guard oo.count != 0 else { return }
279 guard let obj = store.insertNewObject(for: KenzoHistory.entity) else { return }
285 obj.bauxite = bauxite
286 obj.kaihatusizai = kaihatu
289 obj.flagShipName = attr[8]
290 obj.flagShipLv = flagLv
291 obj.commanderLv = commandLv
295 private func registerKenzoMark( _ data: Data) {
297 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
298 let store = LocalDataStore.oneTimeEditor()
302 let attr = $0.components(separatedBy: "\t")
304 guard attr.count == 11 else { return }
305 guard let date = dateFomatter.date(from: attr[0]) else { return }
306 guard let fuel = Int(attr[1]) else { return }
307 guard let bull = Int(attr[2]) else { return }
308 guard let steel = Int(attr[3]) else { return }
309 guard let bauxite = Int(attr[4]) else { return }
310 guard let kaihatu = Int(attr[5]) else { return }
311 guard let shiId = Int(attr[6]) else { return }
312 guard let kDock = Int(attr[7]) else { return }
313 guard let flagLv = Int(attr[9]) else { return }
314 guard let commandLv = Int(attr[10]) else { return }
316 let p = NSPredicate(#keyPath(KenzoMark.date), equal: date)
318 guard let oo = try? store.objects(of: KenzoMark.entity, predicate: p) else { return }
319 guard oo.count != 0 else { return }
320 guard let obj = store.insertNewObject(for: KenzoMark.entity) else { return }
326 obj.bauxite = bauxite
327 obj.kaihatusizai = kaihatu
328 obj.created_ship_id = shiId
330 obj.flagShipName = attr[8]
331 obj.flagShipLv = flagLv
332 obj.commanderLv = commandLv
336 private func registerDropShipHistory( _ data: Data) {
338 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
339 let store = LocalDataStore.oneTimeEditor()
343 let attr = $0.components(separatedBy: "\t")
345 guard attr.count == 9 else { return }
346 guard let date = dateFomatter.date(from: attr[0]) else { return }
347 guard let mapInfo = Int(attr[3]) else { return }
348 guard let mapCell = Int(attr[4]) else { return }
349 guard let mark = Int(attr[7]) else { return }
351 let p = NSPredicate(#keyPath(DropShipHistory.date), equal: date)
353 guard let oo = try? store.objects(of: DropShipHistory.entity, predicate: p) else { return }
354 guard oo.count != 0 else { return }
355 guard let obj = store.insertNewObject(for: DropShipHistory.entity) else { return }
358 obj.shipName = attr[1]
359 obj.mapArea = attr[2]
360 obj.mapInfo = mapInfo
361 obj.mapCell = mapCell
362 obj.mapAreaName = attr[5]
363 obj.mapInfoName = attr[6]
365 obj.winRank = attr[8]