look command
This commit is contained in:
@@ -9,23 +9,27 @@ import Foundation
|
||||
|
||||
|
||||
extension Date {
|
||||
var yyyyMMdd: String {
|
||||
public var yyyyMMdd: String {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.dateFormat = "yyyy-MM-dd"
|
||||
return dateFormatter.string(from: self)
|
||||
}
|
||||
|
||||
var yyyyMMdd_HHmmss: String {
|
||||
public var yyyyMMdd_HHmmss: String {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
||||
return dateFormatter.string(from: self)
|
||||
}
|
||||
|
||||
var yyyyMMdd_HHmmssSSSS_forFile: String {
|
||||
public var yyyyMMdd_HHmmssSSSS_forFile: String {
|
||||
let dateFormatter = DateFormatter()
|
||||
dateFormatter.dateFormat = "yyyyMMdd_HHmmss_SSSS"
|
||||
return dateFormatter.string(from: self)
|
||||
}
|
||||
|
||||
public static var appTime: TimeInterval {
|
||||
ProcessInfo.processInfo.systemUptime
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class KissConsole {
|
||||
var shop: KissShop? = nil
|
||||
|
||||
var productsLock = NSLock()
|
||||
var products: [DomesticShop.Product] = []
|
||||
var products = [String: [DomesticShop.Product]]()
|
||||
|
||||
enum KissCommand: String {
|
||||
case quit = "quit"
|
||||
@@ -27,6 +27,7 @@ class KissConsole {
|
||||
case sell = "sell"
|
||||
case loadShop = "load shop"
|
||||
case updateShop = "update shop"
|
||||
case look = "look"
|
||||
|
||||
var needLogin: Bool {
|
||||
switch self {
|
||||
@@ -34,7 +35,7 @@ class KissConsole {
|
||||
return false
|
||||
case .logout, .search, .buy, .sell:
|
||||
return true
|
||||
case .loadShop, .updateShop:
|
||||
case .loadShop, .updateShop, .look:
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -50,6 +51,7 @@ class KissConsole {
|
||||
|
||||
createSubpath("log")
|
||||
createSubpath("data")
|
||||
onLoadShop()
|
||||
}
|
||||
|
||||
func run() {
|
||||
@@ -83,6 +85,7 @@ class KissConsole {
|
||||
case .sell: await onSell(args.suffixStrings(from: 1))
|
||||
case .loadShop: onLoadShop()
|
||||
case .updateShop: await onUpdateShop()
|
||||
case .look: await onLook(args.suffixStrings(from: 1))
|
||||
default:
|
||||
print("Unknown command: \(single)")
|
||||
}
|
||||
@@ -106,22 +109,58 @@ extension KissConsole {
|
||||
URL.currentDirectory().appending(path: "data/shop-products.csv")
|
||||
}
|
||||
|
||||
private func loadShop() {
|
||||
private func setProducts(_ products: [String: [DomesticShop.Product]]) {
|
||||
productsLock.lock()
|
||||
self.products = products
|
||||
productsLock.unlock()
|
||||
}
|
||||
|
||||
private func getProducts(similarName: String) -> [String: [DomesticShop.Product]]? {
|
||||
productsLock.lock()
|
||||
defer {
|
||||
productsLock.unlock()
|
||||
}
|
||||
return products.filter { $0.key.contains(similarName) }
|
||||
}
|
||||
|
||||
private func loadShop(_ profile: Bool = true) {
|
||||
let appTime1 = Date.appTime
|
||||
guard let stringCsv = try? String(contentsOfFile: shopProducts.path) else {
|
||||
return
|
||||
}
|
||||
|
||||
let appTime2 = Date.appTime
|
||||
if profile {
|
||||
print("\tloading file \(appTime2 - appTime1) elapsed")
|
||||
}
|
||||
|
||||
var products = [DomesticShop.Product]()
|
||||
var products = [String: [DomesticShop.Product]]()
|
||||
let rows = stringCsv.split(separator: "\n")
|
||||
|
||||
let appTime3 = Date.appTime
|
||||
if profile {
|
||||
print("\trow split \(appTime3 - appTime2) elapsed")
|
||||
}
|
||||
|
||||
for row in rows {
|
||||
let array = row.split(separator: ",").map { String($0) }
|
||||
let product = DomesticShop.Product(array)
|
||||
products.append(product)
|
||||
if var value = products[product.itemName] {
|
||||
value.append(product)
|
||||
products.updateValue(value, forKey: product.itemName)
|
||||
}
|
||||
else {
|
||||
products[product.itemName] = [product]
|
||||
}
|
||||
}
|
||||
self.productsLock.lock()
|
||||
self.products = products
|
||||
self.productsLock.unlock()
|
||||
print("load products \(products.count)")
|
||||
let appTime4 = Date.appTime
|
||||
if profile {
|
||||
print("\tparse product \(appTime4 - appTime3) elapsed")
|
||||
}
|
||||
|
||||
setProducts(products)
|
||||
let totalCount = products.reduce(0, { $0 + $1.value.count })
|
||||
print("load products \(totalCount) with \(products.count) key")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,6 +264,23 @@ extension KissConsole {
|
||||
print("\(error)")
|
||||
}
|
||||
}
|
||||
|
||||
private func onLook(_ args: [String]) async {
|
||||
guard args.count >= 1 else {
|
||||
print("No product name")
|
||||
return
|
||||
}
|
||||
guard let items = getProducts(similarName: args[0]) else {
|
||||
print("")
|
||||
return
|
||||
}
|
||||
for item in items {
|
||||
print("Product \(item.key)")
|
||||
for value in item.value {
|
||||
print("\t\(value.shortCode) \(value.baseDate)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user