Skip to content

Commit 18c77c6

Browse files
committed
feat(command): implement command suggestion provider interface and default implementation
1 parent cc01ea3 commit 18c77c6

File tree

6 files changed

+145
-39
lines changed

6 files changed

+145
-39
lines changed

common-platform-api/src/main/kotlin/taboolib/common/platform/command/ExtraComponent.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package taboolib.common.platform.command
22

33
import taboolib.common.platform.command.component.CommandComponent
44
import taboolib.common.platform.command.component.CommandComponentDynamic
5+
import taboolib.common.platform.command.component.CommandSuggestProviderLoader
56

67
/**
78
* 添加一层整型节点(自动约束)
@@ -16,7 +17,7 @@ fun CommandComponent.int(
1617
dynamic: CommandComponentDynamic.() -> Unit = {}
1718
): CommandComponentDynamic {
1819
return dynamic(comment, optional, permission, dynamic).also {
19-
CommandComponent.intSuggestProvider(it, comment, suggest)
20+
CommandSuggestProviderLoader.getProvider().provideIntSuggest(it, comment, suggest)
2021
}
2122
}
2223

@@ -33,7 +34,7 @@ fun CommandComponent.decimal(
3334
dynamic: CommandComponentDynamic.() -> Unit = {}
3435
): CommandComponentDynamic {
3536
return dynamic(comment, optional, permission, dynamic).also {
36-
CommandComponent.decimalSuggestProvider(it, comment, suggest)
37+
CommandSuggestProviderLoader.getProvider().provideDecimalSuggest(it, comment, suggest)
3738
}
3839
}
3940

@@ -47,7 +48,7 @@ fun CommandComponent.bool(
4748
dynamic: CommandComponentDynamic.() -> Unit = {}
4849
): CommandComponentDynamic {
4950
return dynamic(comment, optional, permission, dynamic).also {
50-
CommandComponent.boolSuggestProvider(it, comment)
51+
CommandSuggestProviderLoader.getProvider().provideBoolSuggest(it, comment)
5152
}
5253
}
5354

@@ -64,6 +65,6 @@ fun CommandComponent.player(
6465
dynamic: CommandComponentDynamic.() -> Unit = {}
6566
): CommandComponentDynamic {
6667
return dynamic(comment, optional, permission, dynamic).also {
67-
CommandComponent.playerSuggestProvider(it, comment, suggest)
68+
CommandSuggestProviderLoader.getProvider().providePlayerSuggest(it, comment, suggest)
6869
}
6970
}

common-platform-api/src/main/kotlin/taboolib/common/platform/command/ExtraComponentSuggest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package taboolib.common.platform.command
22

33
import taboolib.common.platform.ProxyCommandSender
44
import taboolib.common.platform.command.component.CommandComponentDynamic
5-
import taboolib.common.platform.command.component.ExecuteContext
65
import taboolib.common.platform.command.component.SuggestContext
76
import taboolib.common.platform.function.allWorlds
87
import taboolib.common.platform.function.onlinePlayers

common-platform-api/src/main/kotlin/taboolib/common/platform/command/component/CommandComponent.kt

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
package taboolib.common.platform.command.component
22

33
import taboolib.common.platform.command.CommandContext
4-
import taboolib.common.platform.command.restrictDouble
5-
import taboolib.common.platform.command.restrictInt
6-
import taboolib.common.platform.command.suggestBoolean
7-
import taboolib.common.platform.command.suggestPlayers
8-
import taboolib.common.platform.command.suggestUncheck
94

105
abstract class CommandComponent(val index: Int, var optional: Boolean, val permission: String = "") {
116

@@ -120,33 +115,4 @@ abstract class CommandComponent(val index: Int, var optional: Boolean, val permi
120115
}
121116
}
122117
}
123-
124-
companion object {
125-
126-
var intSuggestProvider: CommandComponentDynamic.(comment: String, suggest: List<String>) -> Unit = { comment, suggest ->
127-
// 如果没有额外建议则约束参数输入
128-
if (suggest.isEmpty()) {
129-
restrictInt()
130-
} else {
131-
suggestUncheck { suggest }
132-
}
133-
}
134-
135-
var decimalSuggestProvider: CommandComponentDynamic.(comment: String, suggest: List<String>) -> Unit = { comment, suggest ->
136-
// 如果没有额外建议则约束参数输入
137-
if (suggest.isEmpty()) {
138-
restrictDouble()
139-
} else {
140-
suggestUncheck { suggest }
141-
}
142-
}
143-
144-
var boolSuggestProvider: CommandComponentDynamic.(comment: String) -> Unit = { comment ->
145-
suggestBoolean()
146-
}
147-
148-
var playerSuggestProvider: CommandComponentDynamic.(comment: String, suggest: List<String>) -> Unit = { comment, suggest ->
149-
suggestPlayers(suggest)
150-
}
151-
}
152118
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package taboolib.common.platform.command.component
2+
3+
/**
4+
* 命令建议提供者接口
5+
*
6+
* 这是一个可选的扩展接口,用于统一管理不同类型参数的建议行为
7+
* 如果你想要统一定制所有类型的建议,可以实现此接口并通过 CommandComponent.applySuggestProvider() 应用
8+
*/
9+
interface CommandSuggestProvider {
10+
11+
/**
12+
* 提供整数类型的建议
13+
*
14+
* @param component 动态命令组件
15+
* @param comment 注释
16+
* @param suggest 额外的建议列表
17+
*/
18+
fun provideIntSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>)
19+
20+
/**
21+
* 提供小数类型的建议
22+
*
23+
* @param component 动态命令组件
24+
* @param comment 注释
25+
* @param suggest 额外的建议列表
26+
*/
27+
fun provideDecimalSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>)
28+
29+
/**
30+
* 提供布尔类型的建议
31+
*
32+
* @param component 动态命令组件
33+
* @param comment 注释
34+
*/
35+
fun provideBoolSuggest(component: CommandComponentDynamic, comment: String)
36+
37+
/**
38+
* 提供玩家类型的建议
39+
*
40+
* @param component 动态命令组件
41+
* @param comment 注释
42+
* @param suggest 额外的建议列表
43+
*/
44+
fun providePlayerSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>)
45+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package taboolib.common.platform.command.component
2+
3+
import java.util.*
4+
5+
/**
6+
* 命令建议提供者加载器
7+
*
8+
* 使用 Java ServiceLoader 机制加载自定义的建议提供者
9+
*/
10+
object CommandSuggestProviderLoader {
11+
12+
private var provider: CommandSuggestProvider? = null
13+
14+
/**
15+
* 获取当前的建议提供者
16+
*/
17+
fun getProvider(): CommandSuggestProvider {
18+
if (provider == null) {
19+
provider = loadProvider()
20+
}
21+
return provider!!
22+
}
23+
24+
/**
25+
* 手动设置建议提供者
26+
*/
27+
fun setProvider(provider: CommandSuggestProvider) {
28+
this.provider = provider
29+
}
30+
31+
/**
32+
* 重新加载提供者
33+
*/
34+
fun reload() {
35+
provider = loadProvider()
36+
}
37+
38+
private fun loadProvider(): CommandSuggestProvider {
39+
return try {
40+
val loader = ServiceLoader.load(
41+
CommandSuggestProvider::class.java,
42+
CommandSuggestProvider::class.java.classLoader
43+
)
44+
// 获取第一个自定义实现,如果没有则使用默认实现
45+
loader.firstOrNull() ?: createDefaultProvider()
46+
} catch (_: Exception) {
47+
// 如果加载失败,使用默认实现
48+
createDefaultProvider()
49+
}
50+
}
51+
52+
private fun createDefaultProvider(): CommandSuggestProvider {
53+
return DefaultCommandSuggestProvider()
54+
}
55+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package taboolib.common.platform.command.component
2+
3+
import taboolib.common.platform.command.restrictDouble
4+
import taboolib.common.platform.command.restrictInt
5+
import taboolib.common.platform.command.suggestBoolean
6+
import taboolib.common.platform.command.suggestPlayers
7+
import taboolib.common.platform.command.suggestUncheck
8+
9+
/**
10+
* 默认的命令建议提供者实现
11+
*/
12+
class DefaultCommandSuggestProvider : CommandSuggestProvider {
13+
14+
override fun provideIntSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>) {
15+
// 如果没有额外建议则约束参数输入
16+
if (suggest.isEmpty()) {
17+
component.restrictInt()
18+
} else {
19+
component.suggestUncheck { suggest }
20+
}
21+
}
22+
23+
override fun provideDecimalSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>) {
24+
// 如果没有额外建议则约束参数输入
25+
if (suggest.isEmpty()) {
26+
component.restrictDouble()
27+
} else {
28+
component.suggestUncheck { suggest }
29+
}
30+
}
31+
32+
override fun provideBoolSuggest(component: CommandComponentDynamic, comment: String) {
33+
component.suggestBoolean()
34+
}
35+
36+
override fun providePlayerSuggest(component: CommandComponentDynamic, comment: String, suggest: List<String>) {
37+
component.suggestPlayers(suggest)
38+
}
39+
}
40+

0 commit comments

Comments
 (0)