1717
1818package com.lambda.command.commands
1919
20+ import com.google.gson.JsonParser
21+ import com.lambda.brigadier.CommandResult
22+ import com.lambda.brigadier.CommandResult.Companion.failure
2023import com.lambda.brigadier.CommandResult.Companion.success
2124import com.lambda.brigadier.argument.literal
25+ import com.lambda.brigadier.argument.string
26+ import com.lambda.brigadier.argument.value
27+ import com.lambda.brigadier.argument.word
2228import com.lambda.brigadier.executeWithResult
2329import com.lambda.brigadier.required
2430import com.lambda.command.LambdaCommand
@@ -28,8 +34,8 @@ import com.lambda.util.extension.CommandBuilder
2834
2935object ConfigCommand : LambdaCommand(
3036 name = " config" ,
31- aliases = setOf("cfg"),
32- usage = " config <save | load>" ,
37+ aliases = setOf("cfg", "settings", "setting" ),
38+ usage = " config <save | load | set> <configurable> <setting> <value >" ,
3339 description = " Save or load the configuration files"
3440) {
3541 override fun CommandBuilder.create () {
@@ -51,5 +57,51 @@ object ConfigCommand : LambdaCommand(
5157 return @executeWithResult success()
5258 }
5359 }
60+ required(literal(" set" )) {
61+ required(string(" configurable" )) { config ->
62+ suggests { _, builder ->
63+ Configuration .configurables.forEach {
64+ builder.suggest(" \" ${it.name} \" " )
65+ }
66+ builder.buildFuture()
67+ }
68+ required(string(" setting" )) { setting ->
69+ suggests { ctx, builder ->
70+ val conf = config(ctx).value()
71+ Configuration .configurableByName(conf)?.let { configurable ->
72+ configurable.settings.forEach {
73+ builder.suggest(" \" ${it.name} \" " )
74+ }
75+ }
76+ builder.buildFuture()
77+ }
78+ required(string(" value as JSON" )) { value ->
79+ executeWithResult {
80+ val valueString = value().value()
81+ val confName = config().value()
82+ val settingName = setting().value()
83+ val conf = Configuration .configurableByName(confName) ? : run {
84+ return @executeWithResult failure(" $confName is not a valid configurable." )
85+ }
86+ val set = Configuration .settingByName(conf, settingName) ? : run {
87+ return @executeWithResult failure(" $settingName is not a valid setting for $confName ." )
88+ }
89+ val parsed = try {
90+ JsonParser .parseString(" \" $valueString \" " )
91+ } catch (e: Exception ) {
92+ return @executeWithResult failure(" $valueString is not a valid JSON string." )
93+ }
94+ try {
95+ set.loadFromJson(parsed)
96+ } catch (e: Exception ) {
97+ return @executeWithResult failure(" Failed to load $valueString as a ${set.type::class .simpleName} for $settingName in $confName ." )
98+ }
99+ this @ConfigCommand.info(" Set $settingName to ${set.value} for $confName ." )
100+ return @executeWithResult success()
101+ }
102+ }
103+ }
104+ }
105+ }
54106 }
55107}
0 commit comments