diff --git a/KissMeConsole/Sources/KissConsole+Candle.swift b/KissMeConsole/Sources/KissConsole+Candle.swift index f51960e..0752f6d 100644 --- a/KissMeConsole/Sources/KissConsole+Candle.swift +++ b/KissMeConsole/Sources/KissConsole+Candle.swift @@ -18,6 +18,9 @@ let PreferredNowTPS: UInt64 = 10 /// Limit to request a short query let PreferredShortsTPS: UInt64 = 5 +/// Limit to request a top query +let PreferredTopTPS: UInt64 = 5 + /// How many seconds does 1 day have? let SecondsForOneDay: TimeInterval = 60 * 60 * 24 @@ -162,7 +165,7 @@ extension KissConsole { print("wrote \(fileUrl.lastPathComponent) with \(candles.count)") return true } catch { - print("\(error)") + print(error) return false } } @@ -185,7 +188,7 @@ extension KissConsole { let result = try await account!.getHolyday(baseDate: day) do { - var olds = try [HolidyResult.OutputDetail].readCsv(fromFile: KissConsole.holidayUrl) + let olds = try [HolidyResult.OutputDetail].readCsv(fromFile: KissConsole.holidayUrl) if let output = result.output { /// Merge current holidays and new holidays var recents = output.map { $0 } diff --git a/KissMeConsole/Sources/KissConsole.swift b/KissMeConsole/Sources/KissConsole.swift index 6a35b96..ecaa42c 100644 --- a/KissMeConsole/Sources/KissConsole.swift +++ b/KissMeConsole/Sources/KissConsole.swift @@ -38,6 +38,7 @@ class KissConsole { // 랭킹 case top = "top" + case topAll = "top all" // 매매 case buy = "buy" @@ -91,7 +92,7 @@ class KissConsole { switch self { case .quit, .loginMock, .loginReal: return false - case .logout, .top, .buy, .buyCheck, .sell, .cancel, .modify: + case .logout, .top, .topAll, .buy, .buyCheck, .sell, .cancel, .modify: return true case .openBag: return true @@ -206,6 +207,7 @@ class KissConsole { case .loginReal: await onLogin(isMock: false) case .logout: await onLogout() case .top: await onTop(args) + case .topAll: onTopAll() case .buy: await onBuy(args) case .buyCheck: await onBuyCheck(args) @@ -323,7 +325,7 @@ extension KissConsole { print("resume \(isMock ? "mock login": "real login") expired at \(expiredAt)") } } catch { - print("\(error)") + print(error) } } @@ -357,7 +359,7 @@ extension KissConsole { print("Success") } } catch { - print("\(error)") + print(error) } } @@ -369,7 +371,7 @@ extension KissConsole { account = nil print("Success") } catch { - print("\(error)") + print(error) } } @@ -402,11 +404,41 @@ extension KissConsole { try output.writeCsv(toFile: fileUrl, localized: localized) print("wrote \(fileUrl.lastPathComponent) with \(output.count)") } catch { - print("\(error)") + print(error) } } + private func onTopAll() { + let belongs: [BelongClassCode] = [.averageVolume, .volumeIncreaseRate, .averageVolumeTurnoverRate, .transactionValue, .averageTransactionValueTurnoverRate] + + for belong in belongs { + let option = RankingOption(divisionClass: .all, belongClass: belong) + let semaphore = DispatchSemaphore(value: 0) + Task { + do { + let curDate = Date() + let rank = try await account!.getVolumeRanking(option: option) + guard let output = rank.output else { + print("Error \(rank.messageCode) \(rank.message)") + return + } + + let fileUrl = KissConsole.topProductsUrl(belong, date: curDate) + try output.writeCsv(toFile: fileUrl, localized: localized) + print("wrote \(fileUrl.lastPathComponent) with \(output.count)") + try await Task.sleep(nanoseconds: 1_000_000_000 / PreferredTopTPS) + } catch { + print(error) + } + semaphore.signal() + } + semaphore.wait() + } + print("FINISHED") + } + + private func onBuy(_ args: [String]) async { guard args.count == 3 else { print("Missing buy paramters: buy (PNO) (PRICE) (QUANTITY)") @@ -440,7 +472,7 @@ extension KissConsole { print("Failed \(result.resultCode) \(result.messageCode) \(result.message)") } } catch { - print("\(error)") + print(error) } } @@ -469,7 +501,7 @@ extension KissConsole { print("Failed \(result.resultCode) \(result.messageCode) \(result.message)") } } catch { - print("\(error)") + print(error) } } @@ -507,7 +539,7 @@ extension KissConsole { print("Failed \(result.resultCode) \(result.messageCode) \(result.message)") } } catch { - print("\(error)") + print(error) } } @@ -544,7 +576,7 @@ extension KissConsole { print("Failed \(result.resultCode) \(result.messageCode) \(result.message)") } } catch { - print("\(error)") + print(error) } } @@ -576,7 +608,7 @@ extension KissConsole { print("wrote \(fileUrl.lastPathComponent) with \(amounts.count)") } } catch { - print("\(error)") + print(error) } } @@ -915,7 +947,7 @@ extension KissConsole { } } } catch { - print("\(error)") + print(error) } return shopItems } diff --git a/KissMeConsole/Sources/test.swift b/KissMeConsole/Sources/test.swift index 0ab265d..13e2dec 100644 --- a/KissMeConsole/Sources/test.swift +++ b/KissMeConsole/Sources/test.swift @@ -31,7 +31,7 @@ private func test_login_get_volume_ranking() async { /// credential = try KissCredential(isMock: isMock) } catch { - print("\(error)") + print(error) return } @@ -44,7 +44,7 @@ private func test_login_get_volume_ranking() async { print("\(result)") } } catch { - print("\(error)") + print(error) return } } @@ -62,7 +62,7 @@ private func test_json_result() { print("\(result)") } catch { - print("\(error)") + print(error) } } diff --git a/bin/data b/bin/data index 239afe4..1117afa 160000 --- a/bin/data +++ b/bin/data @@ -1 +1 @@ -Subproject commit 239afe4f22e558a5457da5a2c965ad98710cc4ad +Subproject commit 1117afa184691a6c3bb9ad34b0c3aa23cb41e1ff