CityCommand.kt 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. package com.sirekanyan.andersrobot.command
  2. import com.sirekanyan.andersrobot.Controller
  3. import com.sirekanyan.andersrobot.botName
  4. import org.telegram.telegrambots.meta.api.objects.Message
  5. import java.util.regex.Pattern
  6. import kotlin.text.RegexOption.IGNORE_CASE
  7. class CityCommand(
  8. private val words: List<String>,
  9. private val action: (Controller, String) -> Unit,
  10. private val onEmptyArguments: (Controller, Command) -> Unit,
  11. ) : Command {
  12. override fun execute(controller: Controller, message: Message): Boolean =
  13. execute(controller, parseCityArgument(message.text))
  14. override fun execute(controller: Controller, arguments: String?): Boolean {
  15. when {
  16. arguments == null -> return false
  17. arguments.isBlank() -> onEmptyArguments(controller, this)
  18. else -> action(controller, arguments)
  19. }
  20. return true
  21. }
  22. private fun parseCityArgument(text: String?): String? {
  23. val commands = words.flatMap { if (it.startsWith('/')) listOf(it, "$it@$botName") else listOf(it) }
  24. val regex = Regex("(${commands.joinToString("|", transform = Pattern::quote)})( (.*))?", IGNORE_CASE)
  25. return regex.matchEntire(text.orEmpty())?.groupValues?.last()
  26. }
  27. }