aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin')
-rw-r--r--src/main/kotlin/moe/nea/ledger/DungeonChestDetection.kt110
-rw-r--r--src/main/kotlin/moe/nea/ledger/Ledger.kt190
-rw-r--r--src/main/kotlin/moe/nea/ledger/LedgerLogger.kt4
-rw-r--r--src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt27
-rw-r--r--src/main/kotlin/moe/nea/ledger/config/Synchronization.kt11
5 files changed, 268 insertions, 74 deletions
diff --git a/src/main/kotlin/moe/nea/ledger/DungeonChestDetection.kt b/src/main/kotlin/moe/nea/ledger/DungeonChestDetection.kt
new file mode 100644
index 0000000..2418354
--- /dev/null
+++ b/src/main/kotlin/moe/nea/ledger/DungeonChestDetection.kt
@@ -0,0 +1,110 @@
+package moe.nea.ledger
+
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
+import java.time.Instant
+import java.util.regex.Pattern
+
+class DungeonChestDetection(val logger: LedgerLogger) {
+
+ /*{
+ id: "minecraft:chest",
+ Count: 1b,
+ tag: {
+ display: {
+ Lore: ["§7Purchase this chest to receive the", "§7rewards above. You can only open", "§7one chest per Dungeons run -", "§7choose wisely!", "", "§7Cost", "§625,000 Coins", "§9Dungeon Chest Key", "", "§7§cNOTE: Coins are withdrawn from your", "§cbank if you don't have enough in", "§cyour purse."],
+ Name: "§aOpen Reward Chest"
+ }
+ },
+ Damage: 0s
+ }
+
+ {
+ id: "minecraft:feather",
+ Count: 1b,
+ tag: {
+ overrideMeta: 1b,
+ ench: [],
+ HideFlags: 254,
+ display: {
+ Lore: ["§7Consume a §9Kismet Feather §7to reroll", "§7the loot within this chest.", "", "§7You may only use a feather once", "§7per dungeon run.", "", "§eClick to reroll this chest!"],
+ Name: "§aReroll Chest"
+ },
+ AttributeModifiers: []
+ },
+ Damage: 0s
+}
+ */
+ val costPattern = Pattern.compile("(?<cost>$SHORT_NUMBER_PATTERN) Coins")
+
+
+ data class ChestCost(
+ val cost: Double,
+ val openTimestamp: Long,
+ val hasKey: Boolean,
+ )
+
+ var lastOpenedChest: ChestCost? = null
+
+ @SubscribeEvent
+ fun onKismetClick(event: GuiClickEvent) {
+ val slot = event.slotIn ?: return
+ if (!slot.inventory.displayName.unformattedText.unformattedString().endsWith(" Chest")) return
+ val stack = slot.stack ?: return
+ if (stack.getDisplayNameU() == "§aReroll Chest") {
+ logger.logEntry(
+ LedgerEntry(
+ "KISMET_REROLL",
+ Instant.now(),
+ 0.0,
+ itemId = "KISMET_FEATHER",
+ itemAmount = 1
+ )
+ )
+ }
+ }
+
+ @SubscribeEvent
+ fun onRewardChestClick(event: GuiClickEvent) {
+ val slot = event.slotIn ?: return
+ if (!slot.inventory.displayName.unformattedText.unformattedString().endsWith(" Chest")) return
+ val stack = slot.stack ?: return
+ val name = stack.getDisplayNameU()
+ if (name != "§aOpen Reward Chest") return
+ val lore = stack.getLore()
+ val costIndex = lore.indexOf("§7Cost")
+ if (costIndex < 0 || costIndex + 1 !in lore.indices) return
+ val cost = costPattern.useMatcher(lore[costIndex + 1].unformattedString()) {
+ parseShortNumber(group("cost"))
+ } ?: 0.0 // Free chest!
+ val hasKey = lore.contains("§9Dungeon Chest Key")
+ lastOpenedChest?.let(::completeTransaction)
+ lastOpenedChest = ChestCost(cost, System.currentTimeMillis(), hasKey)
+ }
+
+ @SubscribeEvent
+ fun onChatMessage(event: ChatReceived) {
+ if (event.message == "You don't have that many coins in the bank!")
+ lastOpenedChest = null
+ }
+
+ fun completeTransaction(toOpen: ChestCost) {
+ lastOpenedChest = null
+ logger.logEntry(
+ LedgerEntry(
+ "DUNGEON_CHEST_OPEN",
+ Instant.ofEpochMilli(toOpen.openTimestamp),
+ toOpen.cost,
+ itemId = if (toOpen.hasKey) "DUNGEON_CHEST_KEY" else null
+ )
+ )
+ }
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent) {
+ val toOpen = lastOpenedChest
+ if (toOpen != null && toOpen.openTimestamp + 1000L < System.currentTimeMillis()) {
+ completeTransaction(toOpen)
+ }
+ }
+}
diff --git a/src/main/kotlin/moe/nea/ledger/Ledger.kt b/src/main/kotlin/moe/nea/ledger/Ledger.kt
index 3745f36..f27eba1 100644
--- a/src/main/kotlin/moe/nea/ledger/Ledger.kt
+++ b/src/main/kotlin/moe/nea/ledger/Ledger.kt
@@ -1,7 +1,11 @@
package moe.nea.ledger
+import io.github.notenoughupdates.moulconfig.common.IMinecraft
+import io.github.notenoughupdates.moulconfig.managed.ManagedConfig
+import moe.nea.ledger.config.LedgerConfig
import net.minecraft.client.Minecraft
import net.minecraft.command.CommandBase
+import net.minecraft.command.ICommandSender
import net.minecraftforge.client.ClientCommandHandler
import net.minecraftforge.client.event.ClientChatReceivedEvent
import net.minecraftforge.common.MinecraftForge
@@ -13,81 +17,119 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
import org.apache.logging.log4j.LogManager
+import java.io.File
+import java.util.concurrent.ConcurrentLinkedQueue
@Mod(modid = "ledger", useMetadata = true)
class Ledger {
- /*
- You have withdrawn 1M coins! You now have 518M coins in your account!
- You have deposited 519M coins! You now have 519M coins in your account!
-
- // ORDERS:
-
- [Bazaar] Buy Order Setup! 160x Wheat for 720.0 coins.
- [Bazaar] Claimed 160x Wheat worth 720.0 coins bought for 4.5 each!
-
- [Bazaar] Sell Offer Setup! 160x Wheat for 933.4 coins.
- [Bazaar] Claimed 34,236,799 coins from selling 176x Hyper Catalyst at 196,741 each!
-
- // INSTABUY:
-
- [Bazaar] Bought 64x Wheat for 377.6 coins!
- [Bazaar] Sold 64x Wheat for 268.8 coins!
-
- // AUCTION HOUSE:
-
- You collected 8,712,000 coins from selling Ultimate Carrot Candy Upgrade to [VIP] kodokush in an auction!
- You purchased 2x Walnut for 69 coins!
- You purchased ◆ Ice Rune I for 4,000 coins!
-
- TODO: TRADING, FORGE, COOKIE_EATEN, NPC_SELL, NPC_BUY
- */
- companion object {
- val logger = LogManager.getLogger("MoneyLedger")
- }
-
- @Mod.EventHandler
- fun init(event: FMLInitializationEvent) {
- logger.info("Initializing ledger")
- val ledger = LedgerLogger()
- val ids = ItemIdProvider()
- listOf(
- this,
- ids,
- ledger,
- BankDetection(ledger),
- BazaarDetection(ledger, ids),
- DungeonChestDetection(ledger),
- BazaarOrderDetection(ledger, ids),
- AuctionHouseDetection(ledger, ids),
- BitsDetection(ledger),
- BitsShop(ledger),
- ).forEach(MinecraftForge.EVENT_BUS::register)
- }
-
- var lastJoin = -1L
-
- @SubscribeEvent
- fun worldSwitchEvent(event: EntityJoinWorldEvent) {
- if (event.entity == Minecraft.getMinecraft().thePlayer) {
- lastJoin = System.currentTimeMillis()
- }
- }
-
- @SubscribeEvent
- fun tickEvent(event: ClientTickEvent) {
- if (event.phase == TickEvent.Phase.END
- && lastJoin > 0
- && System.currentTimeMillis() - lastJoin > 10_000
- && Minecraft.getMinecraft().thePlayer != null
- ) {
- lastJoin = -1
- MinecraftForge.EVENT_BUS.post(LateWorldLoadEvent())
- }
- }
-
- @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST)
- fun onChat(event: ClientChatReceivedEvent) {
- if (event.type != 2.toByte())
- MinecraftForge.EVENT_BUS.post(ChatReceived(event))
- }
+ /*
+ You have withdrawn 1M coins! You now have 518M coins in your account!
+ You have deposited 519M coins! You now have 519M coins in your account!
+
+ // ORDERS:
+
+ [Bazaar] Buy Order Setup! 160x Wheat for 720.0 coins.
+ [Bazaar] Claimed 160x Wheat worth 720.0 coins bought for 4.5 each!
+
+ [Bazaar] Sell Offer Setup! 160x Wheat for 933.4 coins.
+ [Bazaar] Claimed 34,236,799 coins from selling 176x Hyper Catalyst at 196,741 each!
+
+ // INSTABUY:
+
+ [Bazaar] Bought 64x Wheat for 377.6 coins!
+ [Bazaar] Sold 64x Wheat for 268.8 coins!
+
+ // AUCTION HOUSE:
+
+ You collected 8,712,000 coins from selling Ultimate Carrot Candy Upgrade to [VIP] kodokush in an auction!
+ You purchased 2x Walnut for 69 coins!
+ You purchased ◆ Ice Rune I for 4,000 coins!
+
+ TODO: TRADING, FORGE, COOKIE_EATEN, NPC_SELL, NPC_BUY
+ */
+ companion object {
+ val logger = LogManager.getLogger("MoneyLedger")
+ val managedConfig = ManagedConfig.create(File("config/money-ledger/config.json"), LedgerConfig::class.java) {
+ checkExpose = false
+ }
+ private val tickQueue = ConcurrentLinkedQueue<Runnable>()
+ fun runLater(runnable: Runnable) {
+ tickQueue.add(runnable)
+ }
+ }
+
+ @Mod.EventHandler
+ fun init(event: FMLInitializationEvent) {
+ logger.info("Initializing ledger")
+ ClientCommandHandler.instance.registerCommand(object : CommandBase() {
+ override fun canCommandSenderUseCommand(sender: ICommandSender?): Boolean {
+ return true
+ }
+
+ override fun getCommandName(): String {
+ return "ledger"
+ }
+
+ override fun getCommandUsage(sender: ICommandSender?): String {
+ return ""
+ }
+
+ override fun processCommand(sender: ICommandSender?, args: Array<out String>) {
+ val editor = managedConfig.getEditor()
+ editor.search(args.joinToString(" "))
+ runLater {
+ IMinecraft.instance.openWrappedScreen(editor)
+ }
+ }
+
+ override fun getCommandAliases(): List<String> {
+ return listOf("moneyledger")
+ }
+ })
+ val ledger = LedgerLogger()
+ val ids = ItemIdProvider()
+ listOf(
+ this,
+ ids,
+ ledger,
+ BankDetection(ledger),
+ BazaarDetection(ledger, ids),
+ DungeonChestDetection(ledger),
+ BazaarOrderDetection(ledger, ids),
+ AuctionHouseDetection(ledger, ids),
+ BitsDetection(ledger),
+ BitsShop(ledger),
+ ).forEach(MinecraftForge.EVENT_BUS::register)
+ }
+
+ var lastJoin = -1L
+
+ @SubscribeEvent
+ fun worldSwitchEvent(event: EntityJoinWorldEvent) {
+ if (event.entity == Minecraft.getMinecraft().thePlayer) {
+ lastJoin = System.currentTimeMillis()
+ }
+ }
+
+ @SubscribeEvent
+ fun tickEvent(event: ClientTickEvent) {
+ if (event.phase == TickEvent.Phase.END
+ && lastJoin > 0
+ && System.currentTimeMillis() - lastJoin > 10_000
+ && Minecraft.getMinecraft().thePlayer != null
+ ) {
+ lastJoin = -1
+ MinecraftForge.EVENT_BUS.post(LateWorldLoadEvent())
+ }
+ while (true) {
+ val queued = tickQueue.poll() ?: break
+ queued.run()
+ }
+ }
+
+ @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST)
+ fun onChat(event: ClientChatReceivedEvent) {
+ if (event.type != 2.toByte())
+ MinecraftForge.EVENT_BUS.post(ChatReceived(event))
+ }
}
diff --git a/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt b/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt
index 4d21e5d..c32caf4 100644
--- a/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt
+++ b/src/main/kotlin/moe/nea/ledger/LedgerLogger.kt
@@ -11,6 +11,8 @@ import net.minecraftforge.client.ClientCommandHandler
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
import java.io.File
+import java.sql.Connection
+import java.sql.DriverManager
import java.text.SimpleDateFormat
import java.time.Instant
import java.util.*
@@ -20,6 +22,8 @@ class LedgerLogger {
Minecraft.getMinecraft().ingameGUI?.chatGUI?.printChatMessage(ChatComponentText(text))
}
+ val connection = DriverManager.getConnection("jdbc:sqlite:money-ledger/database.db")
+
val profileIdPattern =
"Profile ID: (?<profile>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})".toPattern()
diff --git a/src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt b/src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt
new file mode 100644
index 0000000..7ba5abf
--- /dev/null
+++ b/src/main/kotlin/moe/nea/ledger/config/LedgerConfig.kt
@@ -0,0 +1,27 @@
+package moe.nea.ledger.config
+
+import io.github.notenoughupdates.moulconfig.Config
+import io.github.notenoughupdates.moulconfig.DescriptionRendereringBehaviour
+import io.github.notenoughupdates.moulconfig.annotations.Category
+import io.github.notenoughupdates.moulconfig.processor.ProcessedOption
+import moe.nea.ledger.Ledger
+
+class LedgerConfig : Config() {
+ override fun getTitle(): String {
+ return "§6Ledger §7- §6Hypixel SkyBlock data logger §7by §anea89o"
+ }
+
+ override fun saveNow() {
+ super.saveNow()
+ Ledger.managedConfig.saveToFile()
+ }
+
+ override fun getDescriptionBehaviour(option: ProcessedOption?): DescriptionRendereringBehaviour {
+ return DescriptionRendereringBehaviour.EXPAND_PANEL
+ }
+
+ @Category(name = "Synchronization", desc = "")
+ @JvmField
+ val synchronization = Synchronization()
+
+} \ No newline at end of file
diff --git a/src/main/kotlin/moe/nea/ledger/config/Synchronization.kt b/src/main/kotlin/moe/nea/ledger/config/Synchronization.kt
new file mode 100644
index 0000000..e8d5906
--- /dev/null
+++ b/src/main/kotlin/moe/nea/ledger/config/Synchronization.kt
@@ -0,0 +1,11 @@
+package moe.nea.ledger.config
+
+import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean
+import io.github.notenoughupdates.moulconfig.annotations.ConfigOption
+
+class Synchronization {
+ @ConfigOption(name = "Test Option", desc = "Test Description")
+ @ConfigEditorBoolean
+ @JvmField
+ var testOption = false
+} \ No newline at end of file