diff --git a/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/GeneralModule.kt b/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/GeneralModule.kt index ef0f70e..5fb0551 100644 --- a/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/GeneralModule.kt +++ b/bot/src/main/kotlin/io/github/null2264/tsukumogami/bot/core/module/GeneralModule.kt @@ -2,6 +2,7 @@ package io.github.null2264.tsukumogami.bot.core.module import dev.kord.core.entity.effectiveName import io.github.null2264.tsukumogami.bot.core.module.arguments.Test2Arguments +import io.github.null2264.tsukumogami.bot.core.module.arguments.Test3Arguments import io.github.null2264.tsukumogami.bot.core.module.arguments.TestArguments import io.github.null2264.tsukumogami.core.module.api.botModules import kotlinx.datetime.Clock @@ -17,9 +18,8 @@ val generalModule = botModules("General") { groups("group") { commands("test", arguments = ::Test2Arguments) { ctx, args -> ctx.reply("Hello world ${args.user}") } groups("group") { - commands("test", alias = setOf("t")) { ctx -> - ctx.reply("Hello world ${ctx.command?.module?.name}") - ctx.reply("Bot: ${ctx.bot.self().effectiveName}") + commands("test", alias = setOf("t"), arguments = ::Test3Arguments) { ctx, args -> + ctx.reply("URL: ${args.url}") } } } 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 868e1f2..6604a6b 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 @@ -2,6 +2,7 @@ package io.github.null2264.tsukumogami.bot.core.module.arguments import io.github.null2264.tsukumogami.core.commands.Arguments import io.github.null2264.tsukumogami.core.commands.ext.string +import io.github.null2264.tsukumogami.core.commands.ext.url import io.github.null2264.tsukumogami.core.commands.ext.user class TestArguments : Arguments() { @@ -15,3 +16,6 @@ class TestArguments : Arguments() { class Test2Arguments : Arguments() { val user by user("User") } +class Test3Arguments : Arguments() { + val url by url("Link") +} 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 20ebee2..1226476 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 @@ -13,8 +13,7 @@ abstract class Converter { abstract var parsed: 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 + abstract suspend fun consume(context: Context, inputs: MutableList): Boolean 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 e8d521a..6634b67 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,7 +7,7 @@ class StringConverter : Converter() { override var parsed: String = "" - override suspend fun consume(context: Context, inputs: MutableList): String { + override suspend fun consume(context: Context, inputs: MutableList): Boolean { this.parsed = if (isGreedy && inputs.size > 1) run { val limit = inputs.size var buffer = "" @@ -20,6 +20,6 @@ class StringConverter : Converter() { } buffer } else inputs.removeFirstOrNull().orEmpty() - return this.parsed + return this.parsed.isNotEmpty() } } diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URIConverter.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URIConverter.kt new file mode 100644 index 0000000..b34fe1b --- /dev/null +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URIConverter.kt @@ -0,0 +1,25 @@ +package io.github.null2264.tsukumogami.core.commands.converters.impl + +import io.github.null2264.tsukumogami.core.Context +import io.github.null2264.tsukumogami.core.commands.converters.Converter +import io.github.null2264.tsukumogami.core.exceptions.CommandException +import java.net.URI + +class URIConverter : Converter() { + + override var isGreedy: Boolean + get() = false + set(_) { error("HttpConverter can't be greedy") } + + override lateinit var parsed: URI + + override suspend fun consume(context: Context, inputs: MutableList): Boolean { + val input = inputs.getOrNull(0) ?: return false + this.parsed = try { + URI(input) + } catch (e: Exception) { + throw CommandException("Failed to parse URI", e) + } + return true + } +} diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URLConverter.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URLConverter.kt new file mode 100644 index 0000000..b59d862 --- /dev/null +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/converters/impl/URLConverter.kt @@ -0,0 +1,26 @@ +package io.github.null2264.tsukumogami.core.commands.converters.impl + +import io.github.null2264.tsukumogami.core.Context +import io.github.null2264.tsukumogami.core.commands.converters.Converter +import io.github.null2264.tsukumogami.core.exceptions.CommandException +import java.net.URI +import java.net.URL + +class URLConverter : Converter() { + + override var isGreedy: Boolean + get() = false + set(_) { error("HttpConverter can't be greedy") } + + override lateinit var parsed: URL + + override suspend fun consume(context: Context, inputs: MutableList): Boolean { + val input = inputs.getOrNull(0) ?: return false + this.parsed = try { + URL(input) + } catch (e: Exception) { + throw CommandException("Failed to parse URL", e) + } + return true + } +} 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 48a22eb..39c6032 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 @@ -16,25 +16,28 @@ class UserConverter : Converter() { override lateinit var parsed: User - override suspend fun consume(context: Context, inputs: MutableList): User { - val input = inputs.removeFirstOrNull() ?: throw CommandException("User ID is null") + override suspend fun consume(context: Context, inputs: MutableList): Boolean { + val input = inputs.getOrNull(0) ?: throw CommandException("User ID is null") if (input.equals("me", true)) { val user = context.author if (user != null) { this.parsed = user - return this.parsed + inputs.removeAt(0) + return true } } if (input.equals("you", true)) { this.parsed = context.bot.client.getSelf() - return this.parsed + inputs.removeAt(0) + return true } this.parsed = context.findUser(input) ?: throw CommandException("User not found") - return this.parsed + inputs.removeAt(0) + return true } private suspend fun Context.findUser(arg: String): User? = diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/ext/ArgumentsExtensions.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/ext/ArgumentsExtensions.kt index c603b45..899b6b3 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/ext/ArgumentsExtensions.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/commands/ext/ArgumentsExtensions.kt @@ -4,7 +4,11 @@ import dev.kord.core.entity.User import io.github.null2264.tsukumogami.core.commands.Arguments import io.github.null2264.tsukumogami.core.commands.converters.Converter import io.github.null2264.tsukumogami.core.commands.converters.impl.StringConverter +import io.github.null2264.tsukumogami.core.commands.converters.impl.URIConverter +import io.github.null2264.tsukumogami.core.commands.converters.impl.URLConverter import io.github.null2264.tsukumogami.core.commands.converters.impl.UserConverter +import java.net.URI +import java.net.URL fun Arguments.string(name: String, declaration: Converter.() -> Unit = {}): Converter { val converter = StringConverter() @@ -17,3 +21,15 @@ fun Arguments.user(name: String, declaration: Converter.() -> Unit = {}): declaration(converter) return args(name, converter) } + +fun Arguments.uri(name: String, declaration: Converter.() -> Unit = {}): Converter { + val converter = URIConverter() + declaration(converter) + return args(name, converter) +} + +fun Arguments.url(name: String, declaration: Converter.() -> Unit = {}): Converter { + val converter = URLConverter() + declaration(converter) + return args(name, converter) +} diff --git a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/exceptions/CommandException.kt b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/exceptions/CommandException.kt index 7d307aa..c5009cb 100644 --- a/core/src/main/kotlin/io/github/null2264/tsukumogami/core/exceptions/CommandException.kt +++ b/core/src/main/kotlin/io/github/null2264/tsukumogami/core/exceptions/CommandException.kt @@ -1,3 +1,9 @@ package io.github.null2264.tsukumogami.core.exceptions -open class CommandException(message: String = "Something went wrong while executing the command") : Exception(message) +open class CommandException( + message: String = "Something went wrong while executing the command", + /** + * Returns the original exception or null if this exception IS the original. + */ + original: Exception? = null, +) : Exception(message)