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 final class TSVSupport {
52 private let store = LocalDataStore.oneTimeEditor()
54 private var dateFomatter: DateFormatter = {
56 let formatter = DateFormatter()
57 formatter.dateFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'Z"
63 let panel = NSOpenPanel()
64 panel.allowedFileTypes = ["kcdlocaldata"]
67 guard $0 == .OK else { return }
69 panel.urls.forEach { url in
71 guard let fileW = try? FileWrapper(url: url) else { return }
73 fileW.fileWrappers?.forEach {
75 guard let data = $0.value.regularFileContents else { return }
78 case "kaihatu.tsv": self.registerKaihatuHistory(data)
79 case "kenzo.tsv": self.registerKenzoHistory(data)
80 case "kenzoMark.tsv": self.registerKenzoMark(data)
81 case "dropShip.tsv": self.registerDropShipHistory(data)
92 let panel = NSSavePanel()
93 panel.allowedFileTypes = ["kcdlocaldata"]
96 guard $0 == .OK else { return }
97 guard let url = panel.url else { return }
98 guard let kaihatuHistory = self.dataOfKaihatuHistory() else { return }
99 guard let kenzoHistory = self.dataOfKenzoHistory() else { return }
100 guard let kenzoMark = self.dataOfKenzoMark() else { return }
101 guard let dropShipHistory = self.dataOfDropShipHistory() else { return }
103 let fileW = FileWrapper(directoryWithFileWrappers: [:])
104 fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
105 fileW.addRegularFile(withContents: kenzoHistory, preferredFilename: "kenzo.tsv")
106 fileW.addRegularFile(withContents: kenzoMark, preferredFilename: "kenzoMark.tsv")
107 fileW.addRegularFile(withContents: dropShipHistory, preferredFilename: "dropShip.tsv")
110 try fileW.write(to: url, originalContentsURL: nil)
114 print("Error to write")
119 private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
121 let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
123 guard let array = try? store.objects(of: entity, sortDescriptors: [sortDesc]) else {
125 print("Can not get \(entity.name)")
132 private func dataOfKaihatuHistory() -> Data? {
134 return localData(KaihatuHistory.entity)
142 .append($0.kaihatusizai)
144 .append($0.flagShipName)
145 .append($0.flagShipLv)
146 .append($0.commanderLv)
149 .joined(separator: "\n")
153 private func dataOfKenzoHistory() -> Data? {
155 return localData(KenzoHistory.entity)
163 .append($0.kaihatusizai)
166 .append($0.flagShipName)
167 .append($0.flagShipLv)
168 .append($0.commanderLv)
171 .joined(separator: "\n")
175 private func dataOfKenzoMark() -> Data? {
177 return localData(KenzoMark.entity, sortBy: "kDockId")
185 .append($0.kaihatusizai)
186 .append($0.created_ship_id)
188 .append($0.flagShipName)
189 .append($0.flagShipLv)
190 .append($0.commanderLv)
193 .joined(separator: "\n")
197 private func dataOfDropShipHistory() -> Data? {
199 return localData(DropShipHistory.entity)
207 .append($0.mapAreaName)
208 .append($0.mapInfoName)
213 .joined(separator: "\n")
217 private func registerKaihatuHistory(_ data: Data) {
219 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
220 let store = LocalDataStore.oneTimeEditor()
223 let attr = $0.components(separatedBy: "\t")
225 guard attr.count == 10 else { return }
226 guard let date = dateFomatter.date(from: attr[0]) else { return }
227 guard let fuel = Int(attr[1]) else { return }
228 guard let bull = Int(attr[2]) else { return }
229 guard let steel = Int(attr[3]) else { return }
230 guard let bauxite = Int(attr[4]) else { return }
231 guard let kaihatu = Int(attr[5]) else { return }
232 guard let flagLv = Int(attr[8]) else { return }
233 guard let commandLv = Int(attr[9]) else { return }
235 let p = NSPredicate(#keyPath(KaihatuHistory.date), equal: date)
237 guard let oo = try? store.objects(of: KaihatuHistory.entity, predicate: p) else { return }
238 guard oo.count != 0 else { return }
239 guard let obj = store.insertNewObject(for: KaihatuHistory.entity) else { return }
245 obj.bauxite = bauxite
246 obj.kaihatusizai = kaihatu
248 obj.flagShipName = attr[7]
249 obj.flagShipLv = flagLv
250 obj.commanderLv = commandLv
254 private func registerKenzoHistory(_ data: Data) {
256 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
257 let store = LocalDataStore.oneTimeEditor()
261 let attr = $0.components(separatedBy: "\t")
263 guard attr.count == 11 else { return }
264 guard let date = dateFomatter.date(from: attr[0]) else { return }
265 guard let fuel = Int(attr[1]) else { return }
266 guard let bull = Int(attr[2]) else { return }
267 guard let steel = Int(attr[3]) else { return }
268 guard let bauxite = Int(attr[4]) else { return }
269 guard let kaihatu = Int(attr[5]) else { return }
270 guard let sType = Int(attr[7]) else { return }
271 guard let flagLv = Int(attr[9]) else { return }
272 guard let commandLv = Int(attr[10]) else { return }
274 let p = NSPredicate(#keyPath(KenzoHistory.date), equal: date)
276 guard let oo = try? store.objects(of: KenzoHistory.entity, predicate: p) else { return }
277 guard oo.count != 0 else { return }
278 guard let obj = store.insertNewObject(for: KenzoHistory.entity) else { return }
284 obj.bauxite = bauxite
285 obj.kaihatusizai = kaihatu
288 obj.flagShipName = attr[8]
289 obj.flagShipLv = flagLv
290 obj.commanderLv = commandLv
294 private func registerKenzoMark( _ data: Data) {
296 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
297 let store = LocalDataStore.oneTimeEditor()
301 let attr = $0.components(separatedBy: "\t")
303 guard attr.count == 11 else { return }
304 guard let date = dateFomatter.date(from: attr[0]) else { return }
305 guard let fuel = Int(attr[1]) else { return }
306 guard let bull = Int(attr[2]) else { return }
307 guard let steel = Int(attr[3]) else { return }
308 guard let bauxite = Int(attr[4]) else { return }
309 guard let kaihatu = Int(attr[5]) else { return }
310 guard let shiId = Int(attr[6]) else { return }
311 guard let kDock = Int(attr[7]) else { return }
312 guard let flagLv = Int(attr[9]) else { return }
313 guard let commandLv = Int(attr[10]) else { return }
315 let p = NSPredicate(#keyPath(KenzoMark.date), equal: date)
317 guard let oo = try? store.objects(of: KenzoMark.entity, predicate: p) else { return }
318 guard oo.count != 0 else { return }
319 guard let obj = store.insertNewObject(for: KenzoMark.entity) else { return }
325 obj.bauxite = bauxite
326 obj.kaihatusizai = kaihatu
327 obj.created_ship_id = shiId
329 obj.flagShipName = attr[8]
330 obj.flagShipLv = flagLv
331 obj.commanderLv = commandLv
335 private func registerDropShipHistory( _ data: Data) {
337 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
338 let store = LocalDataStore.oneTimeEditor()
342 let attr = $0.components(separatedBy: "\t")
344 guard attr.count == 9 else { return }
345 guard let date = dateFomatter.date(from: attr[0]) else { return }
346 guard let mapInfo = Int(attr[3]) else { return }
347 guard let mapCell = Int(attr[4]) else { return }
348 guard let mark = Int(attr[7]) else { return }
350 let p = NSPredicate(#keyPath(DropShipHistory.date), equal: date)
352 guard let oo = try? store.objects(of: DropShipHistory.entity, predicate: p) else { return }
353 guard oo.count != 0 else { return }
354 guard let obj = store.insertNewObject(for: DropShipHistory.entity) else { return }
357 obj.shipName = attr[1]
358 obj.mapArea = attr[2]
359 obj.mapInfo = mapInfo
360 obj.mapCell = mapCell
361 obj.mapAreaName = attr[5]
362 obj.mapInfoName = attr[6]
364 obj.winRank = attr[8]