diff --git a/src/main/kotlin/App.kt b/src/main/kotlin/App.kt index ad5cc26..cdbe72a 100644 --- a/src/main/kotlin/App.kt +++ b/src/main/kotlin/App.kt @@ -155,11 +155,11 @@ suspend fun main(args: Array) { } onCommand(Regex("(help|start)"), requireOnlyCommandInMessage = true) { - reply(it, EnableArgsParser().getFormattedHelp().takeIf { it.isNotBlank() } ?: return@onCommand) + reply(it, EnableArgsParser(onlyQueryIsRequired = false).getFormattedHelp().takeIf { it.isNotBlank() } ?: return@onCommand) } onCommand("enable", requireOnlyCommandInMessage = false) { val args = it.content.textSources.drop(1).joinToString("") { it.source }.split(" ") - val parser = EnableArgsParser() + val parser = EnableArgsParser(onlyQueryIsRequired = false) runCatchingSafely { parser.parse(args) repo.set(it.chat.id, parser.resultSettings ?: return@runCatchingSafely) @@ -186,7 +186,7 @@ suspend fun main(args: Array) { return@onCommand } } else { - val parser = EnableArgsParser() + val parser = EnableArgsParser(onlyQueryIsRequired = true, repo.get(it.chat.id) ?: ChatSettings.DEFAULT) runCatchingSafely { parser.parse(args) parser.resultSettings diff --git a/src/main/kotlin/ChatSettings.kt b/src/main/kotlin/ChatSettings.kt index be9747a..d07612b 100644 --- a/src/main/kotlin/ChatSettings.kt +++ b/src/main/kotlin/ChatSettings.kt @@ -15,9 +15,9 @@ import net.kodehawa.lib.imageboards.entities.Rating @Serializable data class ChatSettings( val query: String, - val krontabTemplate: KrontabTemplate?, + val krontabTemplate: KrontabTemplate? = null, @Serializable(BoardSerializer::class) - private val boardBase: DefaultBoards, + private val boardBase: DefaultBoards = DefaultBoards.SAFEBOORU, val count: Int = 1, val gallery: Boolean = false, val rating: Rating? = null, @@ -58,4 +58,8 @@ data class ChatSettings( encoder.encodeString(value.name.lowercase()) } } + + companion object { + val DEFAULT = ChatSettings("", null, DefaultBoards.SAFEBOORU) + } } diff --git a/src/main/kotlin/EnableArgsParser.kt b/src/main/kotlin/EnableArgsParser.kt index 5b8373e..64ed05d 100644 --- a/src/main/kotlin/EnableArgsParser.kt +++ b/src/main/kotlin/EnableArgsParser.kt @@ -3,27 +3,50 @@ import com.github.ajalt.clikt.parameters.arguments.* import com.github.ajalt.clikt.parameters.options.* import com.github.ajalt.clikt.parameters.types.enum import com.github.ajalt.clikt.parameters.types.int -import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions -import dev.inmo.micro_utils.repos.KeyValueRepo -import dev.inmo.micro_utils.repos.set -import dev.inmo.tgbotapi.types.ChatId -import kotlinx.coroutines.CoroutineScope +import net.kodehawa.lib.imageboards.boards.DefaultBoards import net.kodehawa.lib.imageboards.entities.Rating -class EnableArgsParser: CliktCommand(name = "enable") { - val count by option("-n").int().help("Amount of pictures to grab each trigger time").default(1).check("Count should be in range 1-10") { - it in 1 .. 10 +class EnableArgsParser( + onlyQueryIsRequired: Boolean, + private val base: ChatSettings = ChatSettings("", null, DefaultBoards.SAFEBOORU) +) : CliktCommand(name = "enable") { + private fun NullableOption.default( + value: EachT?, + defaultForHelp: String = value.toString(), + ): NullableOption { + return if (value != null) { + transformAll(defaultForHelp) { it.lastOrNull() ?: value } + } else { + this + } } - val query by argument().multiple(required = true).help("Your query to booru. Use syntax \"-- -sometag\" to add excluding of some tag in query") - val krontab by option("-k", "--krontab").transformValues(5) { - it.joinToString(" ") - }.help("Krontab in format * * * * *. See https://bookstack.inmo.dev/books/krontab/page/string-format") - val board by option("-b", "--board").convert { - ChatSettings.BoardSerializer.types.getValue(it) - }.required().help("Board type. Possible values: ${ChatSettings.BoardSerializer.types.keys.joinToString { it }}") - val gallery by option("-g", "--gallery").flag(default = false).help("Effective only when count passed > 1. Will send chosen images as gallery instead of separated images") - val rating by option("-r", "--rating").enum { it.name.lowercase() } - val attachUrls by option("-a", "--attach_urls").flag(default = false) + val count by option("-n") + .int() + .help("Amount of pictures to grab each trigger time") + .check("Count should be in range 1-10") { it in 1 .. 10 } + val query by argument() + .multiple(required = true) + .help("Your query to booru. Use syntax \"-- -sometag\" to add excluding of some tag in query") + val krontab by option("-k", "--krontab") + .transformValues(5) { it.joinToString(" ") } + .help("Krontab in format * * * * *. See https://bookstack.inmo.dev/books/krontab/page/string-format") + val board by option("-b", "--board") + .convert { ChatSettings.BoardSerializer.types.getValue(it) } + .run { + if (onlyQueryIsRequired) { + this + } else { + required() + } + } + .help("Board type. Possible values: ${ChatSettings.BoardSerializer.types.keys.joinToString { it }}") + val gallery by option("-g", "--gallery") + .flag(default = base.gallery) + .help("Effective only when count passed > 1. Will send chosen images as gallery instead of separated images") + val rating by option("-r", "--rating") + .enum { it.name.lowercase() } + val attachUrls by option("-a", "--attach_urls") + .flag(default = base.attachUrls) var resultSettings: ChatSettings? = null private set @@ -32,8 +55,8 @@ class EnableArgsParser: CliktCommand(name = "enable") { resultSettings = ChatSettings( query.filterNot { it.isEmpty() }.joinToString(" ").trim(), krontab, - board, - count, + board ?: base.board.boardType as DefaultBoards, + count ?: base.count, gallery, rating, attachUrls