@@ -5,33 +5,104 @@ import com.mojang.brigadier.CommandDispatcher
55import com.mojang.brigadier.arguments.FloatArgumentType
66import com.mojang.brigadier.context.CommandContext
77import dev.chasem.cobblemonextras.CobblemonExtras
8+ import dev.chasem.cobblemonextras.config.CobblemonExtrasConfig
89import dev.chasem.cobblemonextras.permissions.CobblemonExtrasPermissions
910import net.minecraft.ChatFormatting
1011import net.minecraft.commands.CommandSourceStack
1112import net.minecraft.commands.Commands
1213import net.minecraft.network.chat.Component
14+ import java.io.File
15+ import java.io.FileReader
16+ import java.io.FileWriter
17+ import com.google.gson.JsonObject
18+ import com.google.gson.JsonParser
1319
1420class PokeOdds {
1521 fun register (dispatcher : CommandDispatcher <CommandSourceStack >) {
16- // Register /pokeodds to get the current shiny rate no permission required, and /pokeodds setRate <rate> to set the shiny rate, requires permission
17- dispatcher.register(Commands .literal(" pokeodds" )
18- .then(Commands .literal(" setRate" )
19- .requires { source: CommandSourceStack ? -> CobblemonExtrasPermissions .checkPermission(source, CobblemonExtras .permissions.POKEODDS_PERMISSION ) }
20- .then(Commands .argument<Float >(" rate" , FloatArgumentType .floatArg(1.0f , 10000.0f ))
21- .executes { ctx: CommandContext <CommandSourceStack > -> setRate(ctx, FloatArgumentType .getFloat(ctx, " rate" )) }))
22- .executes { ctx: CommandContext <CommandSourceStack > -> this .execute(ctx) })
22+ dispatcher.register(
23+ Commands .literal(" pokeodds" )
24+ // anyone can read the current rate
25+ .executes { ctx -> execute(ctx) }
26+ .then(
27+ Commands .literal(" setRate" )
28+ // Allow if OP level >= 2, or the explicit permission is granted, or it's the console
29+ .requires { src ->
30+ val isConsole = src.entity == null
31+ val isOp = src.hasPermission(2 ) // vanilla admin level gate
32+ val hasNode = CobblemonExtrasPermissions .checkPermission(
33+ src, CobblemonExtras .permissions.POKEODDS_PERMISSION
34+ )
35+ isConsole || isOp || hasNode
36+ }
37+ .then(
38+ Commands .argument(" rate" , FloatArgumentType .floatArg(1.0f , 10000.0f ))
39+ .executes { ctx ->
40+ setRate(ctx, FloatArgumentType .getFloat(ctx, " rate" ))
41+ }
42+ )
43+ )
44+ )
2345 }
2446
2547 private fun setRate (ctx : CommandContext <CommandSourceStack >, rate : Float ): Int {
26- ctx.getSource().sendSystemMessage(Component .literal(" The shiny rate has been set to: " ).withStyle(ChatFormatting .GOLD )
27- .append(Component .literal(rate.toString()).withStyle(ChatFormatting .AQUA )))
2848 Cobblemon .config.shinyRate = rate
49+
50+ // Save the Cobblemon config to persist changes across restarts
51+ try {
52+ saveCobblemonConfig(rate)
53+ ctx.source.sendSystemMessage(
54+ Component .literal(" The shiny rate has been set to: " ).withStyle(ChatFormatting .GOLD )
55+ .append(Component .literal(rate.toString()).withStyle(ChatFormatting .AQUA ))
56+ .append(Component .literal(" (saved to config)" ).withStyle(ChatFormatting .GREEN ))
57+ )
58+ } catch (e: Exception ) {
59+ ctx.source.sendSystemMessage(
60+ Component .literal(" The shiny rate has been set to: " ).withStyle(ChatFormatting .GOLD )
61+ .append(Component .literal(rate.toString()).withStyle(ChatFormatting .AQUA ))
62+ .append(Component .literal(" (WARNING: failed to save to config)" ).withStyle(ChatFormatting .RED ))
63+ )
64+ CobblemonExtras .getLogger().error(" Failed to save Cobblemon config after setting shiny rate" , e)
65+ }
66+
2967 return 1
3068 }
3169
70+ private fun saveCobblemonConfig (newShinyRate : Float ) {
71+ val configFileLoc = System .getProperty(" user.dir" ) + File .separator + " config" + File .separator + " cobblemon" + File .separator + " main.json"
72+ val configFile = File (configFileLoc)
73+
74+ if (! configFile.exists()) {
75+ CobblemonExtras .getLogger().warn(" Cobblemon config file not found at: $configFileLoc " )
76+ return
77+ }
78+
79+ try {
80+ // Read the existing config
81+ val fileReader = FileReader (configFile)
82+ val configJson = JsonParser .parseReader(fileReader).asJsonObject
83+ fileReader.close()
84+
85+ // Update the shiny rate directly at the root level
86+ configJson.addProperty(" shinyRate" , newShinyRate)
87+
88+ // Write the updated config back to file
89+ val fileWriter = FileWriter (configFile)
90+ CobblemonExtrasConfig .GSON .toJson(configJson, fileWriter)
91+ fileWriter.flush()
92+ fileWriter.close()
93+
94+ CobblemonExtras .getLogger().info(" Successfully saved shiny rate $newShinyRate to Cobblemon config" )
95+ } catch (e: Exception ) {
96+ CobblemonExtras .getLogger().error(" Failed to save Cobblemon config" , e)
97+ throw e
98+ }
99+ }
100+
32101 private fun execute (ctx : CommandContext <CommandSourceStack >): Int {
33- ctx.getSource().sendSystemMessage(Component .literal(" The current shiny rate is: " ).withStyle(ChatFormatting .GOLD )
34- .append(Component .literal(Cobblemon .config.shinyRate.toString()).withStyle(ChatFormatting .AQUA )))
102+ ctx.source.sendSystemMessage(
103+ Component .literal(" The current shiny rate is: " ).withStyle(ChatFormatting .GOLD )
104+ .append(Component .literal(Cobblemon .config.shinyRate.toString()).withStyle(ChatFormatting .AQUA ))
105+ )
35106 return 1
36107 }
37108}
0 commit comments