look command
This commit is contained in:
@@ -9,23 +9,27 @@ import Foundation
|
|||||||
|
|
||||||
|
|
||||||
extension Date {
|
extension Date {
|
||||||
var yyyyMMdd: String {
|
public var yyyyMMdd: String {
|
||||||
let dateFormatter = DateFormatter()
|
let dateFormatter = DateFormatter()
|
||||||
dateFormatter.dateFormat = "yyyy-MM-dd"
|
dateFormatter.dateFormat = "yyyy-MM-dd"
|
||||||
return dateFormatter.string(from: self)
|
return dateFormatter.string(from: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
var yyyyMMdd_HHmmss: String {
|
public var yyyyMMdd_HHmmss: String {
|
||||||
let dateFormatter = DateFormatter()
|
let dateFormatter = DateFormatter()
|
||||||
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
|
||||||
return dateFormatter.string(from: self)
|
return dateFormatter.string(from: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
var yyyyMMdd_HHmmssSSSS_forFile: String {
|
public var yyyyMMdd_HHmmssSSSS_forFile: String {
|
||||||
let dateFormatter = DateFormatter()
|
let dateFormatter = DateFormatter()
|
||||||
dateFormatter.dateFormat = "yyyyMMdd_HHmmss_SSSS"
|
dateFormatter.dateFormat = "yyyyMMdd_HHmmss_SSSS"
|
||||||
return dateFormatter.string(from: self)
|
return dateFormatter.string(from: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static var appTime: TimeInterval {
|
||||||
|
ProcessInfo.processInfo.systemUptime
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class KissConsole {
|
|||||||
var shop: KissShop? = nil
|
var shop: KissShop? = nil
|
||||||
|
|
||||||
var productsLock = NSLock()
|
var productsLock = NSLock()
|
||||||
var products: [DomesticShop.Product] = []
|
var products = [String: [DomesticShop.Product]]()
|
||||||
|
|
||||||
enum KissCommand: String {
|
enum KissCommand: String {
|
||||||
case quit = "quit"
|
case quit = "quit"
|
||||||
@@ -27,6 +27,7 @@ class KissConsole {
|
|||||||
case sell = "sell"
|
case sell = "sell"
|
||||||
case loadShop = "load shop"
|
case loadShop = "load shop"
|
||||||
case updateShop = "update shop"
|
case updateShop = "update shop"
|
||||||
|
case look = "look"
|
||||||
|
|
||||||
var needLogin: Bool {
|
var needLogin: Bool {
|
||||||
switch self {
|
switch self {
|
||||||
@@ -34,7 +35,7 @@ class KissConsole {
|
|||||||
return false
|
return false
|
||||||
case .logout, .search, .buy, .sell:
|
case .logout, .search, .buy, .sell:
|
||||||
return true
|
return true
|
||||||
case .loadShop, .updateShop:
|
case .loadShop, .updateShop, .look:
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -50,6 +51,7 @@ class KissConsole {
|
|||||||
|
|
||||||
createSubpath("log")
|
createSubpath("log")
|
||||||
createSubpath("data")
|
createSubpath("data")
|
||||||
|
onLoadShop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func run() {
|
func run() {
|
||||||
@@ -83,6 +85,7 @@ class KissConsole {
|
|||||||
case .sell: await onSell(args.suffixStrings(from: 1))
|
case .sell: await onSell(args.suffixStrings(from: 1))
|
||||||
case .loadShop: onLoadShop()
|
case .loadShop: onLoadShop()
|
||||||
case .updateShop: await onUpdateShop()
|
case .updateShop: await onUpdateShop()
|
||||||
|
case .look: await onLook(args.suffixStrings(from: 1))
|
||||||
default:
|
default:
|
||||||
print("Unknown command: \(single)")
|
print("Unknown command: \(single)")
|
||||||
}
|
}
|
||||||
@@ -106,22 +109,58 @@ extension KissConsole {
|
|||||||
URL.currentDirectory().appending(path: "data/shop-products.csv")
|
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 {
|
guard let stringCsv = try? String(contentsOfFile: shopProducts.path) else {
|
||||||
return
|
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 rows = stringCsv.split(separator: "\n")
|
||||||
|
|
||||||
|
let appTime3 = Date.appTime
|
||||||
|
if profile {
|
||||||
|
print("\trow split \(appTime3 - appTime2) elapsed")
|
||||||
|
}
|
||||||
|
|
||||||
for row in rows {
|
for row in rows {
|
||||||
let array = row.split(separator: ",").map { String($0) }
|
let array = row.split(separator: ",").map { String($0) }
|
||||||
let product = DomesticShop.Product(array)
|
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()
|
let appTime4 = Date.appTime
|
||||||
self.products = products
|
if profile {
|
||||||
self.productsLock.unlock()
|
print("\tparse product \(appTime4 - appTime3) elapsed")
|
||||||
print("load products \(products.count)")
|
}
|
||||||
|
|
||||||
|
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)")
|
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