OSDN Git Service

Entityをジェネリクスにし、それに伴いCoreData関連もジェネリクスにした
[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 { try fileW.write(to: url, originalContentsURL: nil) }
86             catch { print("Error to write") }
87         }
88     }
89     
90     private func localData<T>(_ entity: Entity<T>, sortBy: String = "date") -> [T] {
91         let sortDesc = NSSortDescriptor(key: sortBy, ascending: true)
92         guard let array = try? store.objects(with: entity, sortDescriptors: [sortDesc])
93             else {
94                 print("Can not get \(entity.name)")
95                 return []
96         }
97         return array
98     }
99     private func dataOfKaihatuHistory() -> Data? {
100         return localData(KaihatuHistory.entity)
101             .map {
102                 LFSeparateLine.empty
103                     .append($0.date)
104                     .append($0.fuel)
105                     .append($0.bull)
106                     .append($0.steel)
107                     .append($0.bauxite)
108                     .append($0.kaihatusizai)
109                     .append($0.name)
110                     .append($0.flagShipName)
111                     .append($0.flagShipLv)
112                     .append($0.commanderLv)
113                     .line
114             }
115             .joined(separator: "\n")
116             .data(using: .utf8)
117     }
118     private func dataOfKenzoHistory() -> Data? {
119         return localData(KenzoHistory.entity)
120             .map {
121             LFSeparateLine.empty
122                 .append($0.date)
123                 .append($0.fuel)
124                 .append($0.bull)
125                 .append($0.steel)
126                 .append($0.bauxite)
127                 .append($0.kaihatusizai)
128                 .append($0.name)
129                 .append($0.sTypeId)
130                 .append($0.flagShipName)
131                 .append($0.flagShipLv)
132                 .append($0.commanderLv)
133                 .line
134             }
135             .joined(separator: "\n")
136             .data(using: .utf8)
137     }
138     private func dataOfKenzoMark() -> Data? {
139         return localData(KenzoMark.entity, sortBy: "kDockId")
140             .map {
141             LFSeparateLine.empty
142                 .append($0.date)
143                 .append($0.fuel)
144                 .append($0.bull)
145                 .append($0.steel)
146                 .append($0.bauxite)
147                 .append($0.kaihatusizai)
148                 .append($0.created_ship_id)
149                 .append($0.kDockId)
150                 .append($0.flagShipName)
151                 .append($0.flagShipLv)
152                 .append($0.commanderLv)
153                 .line
154             }
155             .joined(separator: "\n")
156             .data(using: .utf8)
157     }
158     private func dataOfDropShipHistory() -> Data? {
159         return localData(DropShipHistory.entity)
160             .map {
161                 LFSeparateLine.empty
162                     .append($0.date)
163                     .append($0.shipName)
164                     .append($0.mapArea)
165                     .append($0.mapInfo)
166                     .append($0.mapCell)
167                     .append($0.mapAreaName)
168                     .append($0.mapInfoName)
169                     .append($0.mark)
170                     .append($0.winRank)
171                     .line
172             }
173             .joined(separator: "\n")
174             .data(using: .utf8)
175     }
176     private func registerKaihatuHistory(_ data: Data) {
177         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
178         let store = LocalDataStore.oneTimeEditor()
179         array?.forEach {
180             let attr = $0.components(separatedBy: "\t")
181             guard attr.count == 10,
182                 let date = dateFomatter.date(from: attr[0]),
183                 let fuel = Int(attr[1]),
184                 let bull = Int(attr[2]),
185                 let steel = Int(attr[3]),
186                 let bauxite = Int(attr[4]),
187                 let kaihatu = Int(attr[5]),
188                 let flagLv = Int(attr[8]),
189                 let commandLv = Int(attr[9])
190                 else { return }
191             let p = NSPredicate(format: "date = %@", argumentArray: [date])
192             guard let oo = try? store.objects(with: KaihatuHistory.entity, predicate: p),
193                 oo.count != 0
194                 else { return }
195             
196             guard let obj = store.insertNewObject(for: KaihatuHistory.entity)
197                 else { return }
198             
199             obj.date = date
200             obj.fuel = fuel
201             obj.bull = bull
202             obj.steel = steel
203             obj.bauxite = bauxite
204             obj.kaihatusizai = kaihatu
205             obj.name = attr[6]
206             obj.flagShipName = attr[7]
207             obj.flagShipLv = flagLv
208             obj.commanderLv = commandLv
209         }
210     }
211     private func registerKenzoHistory(_ data: Data) {
212         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
213         let store = LocalDataStore.oneTimeEditor()
214         array?.forEach {
215             let attr = $0.components(separatedBy: "\t")
216             guard attr.count == 11,
217                 let date = dateFomatter.date(from: attr[0]),
218                 let fuel = Int(attr[1]),
219                 let bull = Int(attr[2]),
220                 let steel = Int(attr[3]),
221                 let bauxite = Int(attr[4]),
222                 let kaihatu = Int(attr[5]),
223                 let sType = Int(attr[7]),
224                 let flagLv = Int(attr[9]),
225                 let commandLv = Int(attr[10])
226                 else { return }
227             let p = NSPredicate(format: "date = %@", argumentArray: [date])
228             guard let oo = try? store.objects(with: KenzoHistory.entity, predicate: p),
229                 oo.count != 0
230                 else { return }
231             
232             guard let obj = store.insertNewObject(for: KenzoHistory.entity)
233                 else { return }
234             
235             obj.date = date
236             obj.fuel = fuel
237             obj.bull = bull
238             obj.steel = steel
239             obj.bauxite = bauxite
240             obj.kaihatusizai = kaihatu
241             obj.name = attr[6]
242             obj.sTypeId = sType
243             obj.flagShipName = attr[8]
244             obj.flagShipLv = flagLv
245             obj.commanderLv = commandLv
246         }
247     }
248     private func registerKenzoMark( _ data: Data) {
249         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
250         let store = LocalDataStore.oneTimeEditor()
251         array?.forEach {
252             let attr = $0.components(separatedBy: "\t")
253             guard attr.count == 11,
254                 let date = dateFomatter.date(from: attr[0]),
255                 let fuel = Int(attr[1]),
256                 let bull = Int(attr[2]),
257                 let steel = Int(attr[3]),
258                 let bauxite = Int(attr[4]),
259                 let kaihatu = Int(attr[5]),
260                 let shiId = Int(attr[6]),
261                 let kDock = Int(attr[7]),
262                 let flagLv = Int(attr[9]),
263                 let commandLv = Int(attr[10])
264                 else { return }
265             let p = NSPredicate(format: "date = %@", argumentArray: [date])
266             guard let oo = try? store.objects(with: KenzoMark.entity, predicate: p),
267                 oo.count != 0
268                 else { return }
269             
270             guard let obj = store.insertNewObject(for: KenzoMark.entity)
271                 else { return }
272             
273             obj.date = date
274             obj.fuel = fuel
275             obj.bull = bull
276             obj.steel = steel
277             obj.bauxite = bauxite
278             obj.kaihatusizai = kaihatu
279             obj.created_ship_id = shiId
280             obj.kDockId = kDock
281             obj.flagShipName = attr[8]
282             obj.flagShipLv = flagLv
283             obj.commanderLv = commandLv
284         }
285     }
286     private func registerDropShipHistory( _ data: Data) {
287         let array = String(data: data, encoding: .utf8)?.components(separatedBy: "\n")
288         let store = LocalDataStore.oneTimeEditor()
289         array?.forEach {
290             let attr = $0.components(separatedBy: "\t")
291             guard attr.count == 9,
292                 let date = dateFomatter.date(from: attr[0]),
293                 let mapInfo = Int(attr[3]),
294                 let mapCell = Int(attr[4]),
295                 let mark = Int(attr[7])
296                 else { return }
297             let p = NSPredicate(format: "date = %@", argumentArray: [date])
298             guard let oo = try? store.objects(with: DropShipHistory.entity, predicate: p),
299                 oo.count != 0
300                 else { return }
301             
302             guard let obj = store.insertNewObject(for: DropShipHistory.entity)
303                 else { return }
304             
305             obj.date = date
306             obj.shipName = attr[1]
307             obj.mapArea = attr[2]
308             obj.mapInfo = mapInfo
309             obj.mapCell = mapCell
310             obj.mapAreaName = attr[5]
311             obj.mapInfoName = attr[6]
312             obj.mark = mark != 0
313             obj.winRank = attr[8]
314         }
315     }
316 }