OSDN Git Service

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