package moe.nea.ledger import com.google.gson.Gson import com.google.gson.JsonArray import com.google.gson.JsonObject import net.minecraft.client.Minecraft import net.minecraft.util.ChatComponentText import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent import java.io.File import java.text.SimpleDateFormat import java.time.Instant import java.util.* class LedgerLogger { fun printOut(text: String) { Minecraft.getMinecraft().ingameGUI?.chatGUI?.printChatMessage(ChatComponentText(text)) } fun printToChat(entry: LedgerEntry) { printOut( """ §e================= TRANSACTION START §eTYPE: §a${entry.transactionType} §eTIMESTAMP: §a${entry.timestamp} §eTOTAL VALUE: §a${entry.totalTransactionCoins} §eITEM ID: §a${entry.itemId} §eITEM AMOUNT: §a${entry.itemAmount} §e================= TRANSACTION END """.trimIndent() ) } val entries = JsonArray() var hasRecentlyMerged = false var lastMergeTime = System.currentTimeMillis() fun doMerge() { val allFiles = folder.listFiles()?.toList() ?: emptyList() val mergedJson = allFiles .filter { it.name != "merged.json" && it.extension == "json" } .sortedDescending() .map { it.readText().trim().removePrefix("[").removeSuffix("]") } .joinToString(",", "[", "]") folder.resolve("merged.json").writeText(mergedJson) hasRecentlyMerged = true } init { Runtime.getRuntime().addShutdownHook(Thread { doMerge() }) } @SubscribeEvent fun onTick(event: ClientTickEvent) { if (!hasRecentlyMerged && (System.currentTimeMillis() - lastMergeTime) > 60_000L) { lastMergeTime = System.currentTimeMillis() doMerge() } } fun logEntry(entry: LedgerEntry) { Ledger.logger.info("Logging entry of type ${entry.transactionType}") entries.add(entry.intoJson()) commit() } fun commit() { try { hasRecentlyMerged = false file.writeText(gson.toJson(entries)) } catch (ex: Exception) { Ledger.logger.error("Could not save file", ex) } } val gson = Gson() val folder = File("money-ledger").also { it.mkdirs() } val file: File = run { val date = SimpleDateFormat("yyyy.MM.dd").format(Date()) generateSequence(0) { it + 1 } .map { if (it == 0) folder.resolve("$date.json") else folder.resolve("$date-$it.json") } .filter { !it.exists() } .first() } } data class LedgerEntry( val transactionType: String, val timestamp: Instant, val totalTransactionCoins: Double, val itemId: String? = null, val itemAmount: Int? = null, ) { fun intoJson(): JsonObject { return JsonObject().apply { addProperty("transactionType", transactionType) addProperty("timestamp", timestamp.toEpochMilli().toString()) addProperty("totalTransactionValue", totalTransactionCoins) addProperty("itemId", itemId ?: "") addProperty("itemAmount", itemAmount ?: 0) } } }