5 // Created by Hori,Masaki on 2017/02/05.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 fileprivate 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 == NSModalResponseOK
71 panel.urls.forEach { url in
73 guard let fileW = try? FileWrapper(url: url)
76 fileW.fileWrappers?.forEach {
78 guard let data = $0.value.regularFileContents
82 case "kaihatu.tsv": self.registerKaihatuHistory(data)
83 case "kenzo.tsv": self.registerKenzoHistory(data)
84 case "kenzoMark.tsv": self.registerKenzoMark(data)
85 case "dropShip.tsv": self.registerDropShipHistory(data)
96 let panel = NSSavePanel()
97 panel.allowedFileTypes = ["kcdlocaldata"]
100 guard $0 == NSModalResponseOK,
103 guard let kaihatuHistory = self.dataOfKaihatuHistory(),
104 let kenzoHistory = self.dataOfKenzoHistory(),
105 let kenzoMark = self.dataOfKenzoMark(),
106 let dropShipHistory = self.dataOfDropShipHistory()
109 let fileW = FileWrapper(directoryWithFileWrappers: [:])
110 fileW.addRegularFile(withContents: kaihatuHistory, preferredFilename: "kaihatu.tsv")
111 fileW.addRegularFile(withContents: kenzoHistory, preferredFilename: "kenzo.tsv")
112 fileW.addRegularFile(withContents: kenzoMark, preferredFilename: "kenzoMark.tsv")
113 fileW.addRegularFile(withContents: dropShipHistory, preferredFilename: "dropShip.tsv")
116 try fileW.write(to: url, originalContentsURL: nil)
120 print("Error to write")
125 private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
127 let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
129 guard let array = try? store.objects(of: entity, sortDescriptors: [sortDesc])
131 print("Can not get \(entity.name)")
138 private func dataOfKaihatuHistory() -> Data? {
140 return localData(KaihatuHistory.entity)
148 .append($0.kaihatusizai)
150 .append($0.flagShipName)
151 .append($0.flagShipLv)
152 .append($0.commanderLv)
155 .joined(separator: "\n")
159 private func dataOfKenzoHistory() -> Data? {
161 return localData(KenzoHistory.entity)
169 .append($0.kaihatusizai)
172 .append($0.flagShipName)
173 .append($0.flagShipLv)
174 .append($0.commanderLv)
177 .joined(separator: "\n")
181 private func dataOfKenzoMark() -> Data? {
183 return localData(KenzoMark.entity, sortBy: "kDockId")
191 .append($0.kaihatusizai)
192 .append($0.created_ship_id)
194 .append($0.flagShipName)
195 .append($0.flagShipLv)
196 .append($0.commanderLv)
199 .joined(separator: "\n")
203 private func dataOfDropShipHistory() -> Data? {
205 return localData(DropShipHistory.entity)
213 .append($0.mapAreaName)
214 .append($0.mapInfoName)
219 .joined(separator: "\n")
223 private func registerKaihatuHistory(_ data: Data) {
225 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
226 let store = LocalDataStore.oneTimeEditor()
229 let attr = $0.components(separatedBy: "\t")
231 guard attr.count == 10,
232 let date = dateFomatter.date(from: attr[0]),
233 let fuel = Int(attr[1]),
234 let bull = Int(attr[2]),
235 let steel = Int(attr[3]),
236 let bauxite = Int(attr[4]),
237 let kaihatu = Int(attr[5]),
238 let flagLv = Int(attr[8]),
239 let commandLv = Int(attr[9])
242 let p = NSPredicate(format: "date = %@", argumentArray: [date])
244 guard let oo = try? store.objects(of: KaihatuHistory.entity, predicate: p),
248 guard let obj = store.insertNewObject(for: KaihatuHistory.entity)
255 obj.bauxite = bauxite
256 obj.kaihatusizai = kaihatu
258 obj.flagShipName = attr[7]
259 obj.flagShipLv = flagLv
260 obj.commanderLv = commandLv
264 private func registerKenzoHistory(_ data: Data) {
266 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
267 let store = LocalDataStore.oneTimeEditor()
271 let attr = $0.components(separatedBy: "\t")
273 guard attr.count == 11,
274 let date = dateFomatter.date(from: attr[0]),
275 let fuel = Int(attr[1]),
276 let bull = Int(attr[2]),
277 let steel = Int(attr[3]),
278 let bauxite = Int(attr[4]),
279 let kaihatu = Int(attr[5]),
280 let sType = Int(attr[7]),
281 let flagLv = Int(attr[9]),
282 let commandLv = Int(attr[10])
285 let p = NSPredicate(format: "date = %@", argumentArray: [date])
287 guard let oo = try? store.objects(of: KenzoHistory.entity, predicate: p),
291 guard let obj = store.insertNewObject(for: KenzoHistory.entity)
298 obj.bauxite = bauxite
299 obj.kaihatusizai = kaihatu
302 obj.flagShipName = attr[8]
303 obj.flagShipLv = flagLv
304 obj.commanderLv = commandLv
308 private func registerKenzoMark( _ data: Data) {
310 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
311 let store = LocalDataStore.oneTimeEditor()
315 let attr = $0.components(separatedBy: "\t")
317 guard attr.count == 11,
318 let date = dateFomatter.date(from: attr[0]),
319 let fuel = Int(attr[1]),
320 let bull = Int(attr[2]),
321 let steel = Int(attr[3]),
322 let bauxite = Int(attr[4]),
323 let kaihatu = Int(attr[5]),
324 let shiId = Int(attr[6]),
325 let kDock = Int(attr[7]),
326 let flagLv = Int(attr[9]),
327 let commandLv = Int(attr[10])
330 let p = NSPredicate(format: "date = %@", argumentArray: [date])
332 guard let oo = try? store.objects(of: KenzoMark.entity, predicate: p),
336 guard let obj = store.insertNewObject(for: KenzoMark.entity)
343 obj.bauxite = bauxite
344 obj.kaihatusizai = kaihatu
345 obj.created_ship_id = shiId
347 obj.flagShipName = attr[8]
348 obj.flagShipLv = flagLv
349 obj.commanderLv = commandLv
353 private func registerDropShipHistory( _ data: Data) {
355 let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
356 let store = LocalDataStore.oneTimeEditor()
360 let attr = $0.components(separatedBy: "\t")
362 guard attr.count == 9,
363 let date = dateFomatter.date(from: attr[0]),
364 let mapInfo = Int(attr[3]),
365 let mapCell = Int(attr[4]),
366 let mark = Int(attr[7])
369 let p = NSPredicate(format: "date = %@", argumentArray: [date])
371 guard let oo = try? store.objects(of: DropShipHistory.entity, predicate: p),
375 guard let obj = store.insertNewObject(for: DropShipHistory.entity)
379 obj.shipName = attr[1]
380 obj.mapArea = attr[2]
381 obj.mapInfo = mapInfo
382 obj.mapCell = mapCell
383 obj.mapAreaName = attr[5]
384 obj.mapInfoName = attr[6]
386 obj.winRank = attr[8]