diff --git a/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/arguments/TestArguments.kt b/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/arguments/TestArguments.kt index abc529f..868e1f2 100644 --- a/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/arguments/TestArguments.kt +++ b/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/arguments/TestArguments.kt @@ -6,6 +6,8 @@ import io.github.null2264.tsukumogami.core.commands.ext.user class TestArguments : Arguments() { val test by string("Test") { + isGreedy = true + default("Lmao") } } diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/Arguments.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/Arguments.kt index 860e23e..92a9c04 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/Arguments.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/Arguments.kt @@ -17,12 +17,11 @@ abstract class Arguments { } suspend fun parse(context: Context) { - val currentValues = context.parseArguments() + val values = context.parseArguments()?.toMutableList() ?: return run { args.forEach { arg -> - val value = currentValues?.removeFirstOrNull() ?: return@run - arg.converter.parse(context, value) + arg.converter.consume(context, values) } } } diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/Converter.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/Converter.kt index 2824df3..20ebee2 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/Converter.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/Converter.kt @@ -7,11 +7,14 @@ import kotlin.reflect.KProperty abstract class Converter { + open var isGreedy = false + lateinit var argumentObj: Argument abstract var parsed: OutputType - abstract suspend fun parse(context: Context, input: String): OutputType + // FIXME: Maybe change the output to a boolean, indicates whether or not it successfully consume the inputs + abstract suspend fun consume(context: Context, inputs: MutableList): OutputType operator fun getValue(thisRef: Arguments, property: KProperty<*>): OutputType { return this.parsed diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/StringConverter.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/StringConverter.kt index 2a8a40d..e8d521a 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/StringConverter.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/StringConverter.kt @@ -7,8 +7,19 @@ class StringConverter : Converter() { override var parsed: String = "" - override suspend fun parse(context: Context, input: String): String { - this.parsed = input - return input + override suspend fun consume(context: Context, inputs: MutableList): String { + this.parsed = if (isGreedy && inputs.size > 1) run { + val limit = inputs.size + var buffer = "" + var count = 0 + for (i in (1..limit)) { + if (++count > 1) buffer += " " + if (count <= limit) { + buffer += inputs.removeFirstOrNull() ?: "" + } else break + } + buffer + } else inputs.removeFirstOrNull().orEmpty() + return this.parsed } } diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/UserConverter.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/UserConverter.kt index b88d27e..48a22eb 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/UserConverter.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/UserConverter.kt @@ -3,7 +3,6 @@ package io.github.null2264.tsukumogami.core.commands.converters.impl import dev.kord.common.entity.Snowflake import dev.kord.core.entity.User import io.github.null2264.tsukumogami.core.Context -import io.github.null2264.tsukumogami.core.annotation.TsukumogamiInternalApi import io.github.null2264.tsukumogami.core.commands.converters.Converter import io.github.null2264.tsukumogami.core.exceptions.CommandException import io.github.null2264.tsukumogami.core.ext.users @@ -11,9 +10,15 @@ import kotlinx.coroutines.flow.firstOrNull class UserConverter : Converter() { + override var isGreedy: Boolean + get() = false + set(_) { error("UserConverter can't be greedy") } + override lateinit var parsed: User - override suspend fun parse(context: Context, input: String): User { + override suspend fun consume(context: Context, inputs: MutableList): User { + val input = inputs.removeFirstOrNull() ?: throw CommandException("User ID is null") + if (input.equals("me", true)) { val user = context.author if (user != null) {