diff --git a/src/main/java/de/bixilon/minosoft/commands/parser/factory/ArgumentParserFactories.kt b/src/main/java/de/bixilon/minosoft/commands/parser/factory/ArgumentParserFactories.kt index 4e6b94ed6..d34a83483 100644 --- a/src/main/java/de/bixilon/minosoft/commands/parser/factory/ArgumentParserFactories.kt +++ b/src/main/java/de/bixilon/minosoft/commands/parser/factory/ArgumentParserFactories.kt @@ -19,6 +19,7 @@ import de.bixilon.minosoft.commands.parser.brigadier._int.IntParser import de.bixilon.minosoft.commands.parser.brigadier._long.LongParser import de.bixilon.minosoft.commands.parser.brigadier.bool.BooleanParser import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser +import de.bixilon.minosoft.commands.parser.minecraft.component.ChatComponentParser import de.bixilon.minosoft.commands.parser.minecraft.coordinate.angle.AngleParser import de.bixilon.minosoft.commands.parser.minecraft.coordinate.block.BlockPositionParser import de.bixilon.minosoft.commands.parser.minecraft.coordinate.rotation.RotationParser @@ -61,6 +62,8 @@ object ArgumentParserFactories : DefaultFactory>( AngleParser, RotationParser, + ChatComponentParser, + DummyParser, ScoreHolderParser, @@ -75,7 +78,6 @@ minecraft:block_predicate minecraft:item_stack minecraft:item_predicate minecraft:color -minecraft:component minecraft:message minecraft:nbt minecraft:nbt_path diff --git a/src/main/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParser.kt b/src/main/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParser.kt new file mode 100644 index 000000000..95bb64fdd --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParser.kt @@ -0,0 +1,52 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.commands.parser.minecraft.component + +import de.bixilon.minosoft.commands.parser.ArgumentParser +import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser +import de.bixilon.minosoft.commands.parser.factory.ArgumentParserFactory +import de.bixilon.minosoft.commands.util.CommandReader +import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.util.KUtil.toResourceLocation + +object ChatComponentParser : ArgumentParser, ArgumentParserFactory { + override val RESOURCE_LOCATION: ResourceLocation = "minecraft:component".toResourceLocation() + override val examples: List = listOf("", "hello", """{"text":"hello world"}""") + private val parser = StringParser(StringParser.StringModes.GREEDY) + override val placeholder = ChatComponent.of("") + + override fun parse(reader: CommandReader): ChatComponent { + if (!reader.canPeek()) { + return ChatComponent.EMPTY + } + val pointer = reader.pointer + try { + return ChatComponent.of(reader.readJson()) + } catch (ignored: Throwable) { + } + reader.pointer = pointer + return ChatComponent.of(parser.parse(reader)) + } + + override fun getSuggestions(reader: CommandReader): List { + if (reader.readString()?.isBlank() != false) { + return examples + } + return emptyList() + } + + override fun read(buffer: PlayInByteBuffer) = this +} diff --git a/src/test/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParserTest.kt b/src/test/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParserTest.kt new file mode 100644 index 000000000..2afe4654a --- /dev/null +++ b/src/test/java/de/bixilon/minosoft/commands/parser/minecraft/component/ChatComponentParserTest.kt @@ -0,0 +1,40 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.commands.parser.minecraft.component + +import de.bixilon.minosoft.commands.util.CommandReader +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + + +internal class ChatComponentParserTest { + + @Test + fun readEmpty() { + val reader = CommandReader("") + assertEquals(ChatComponentParser.parse(reader).message, "") + } + + @Test + fun readHelloWorld() { + val reader = CommandReader("hello world") + assertEquals(ChatComponentParser.parse(reader).message, "hello world") + } + + @Test + fun readBasicJsonText() { + val reader = CommandReader("""{"text":"hello world"}""") + assertEquals(ChatComponentParser.parse(reader).message, "hello world") + } +}