Răsfoiți Sursa

Added commands with high priority

Vadik Sirekanyan 4 ani în urmă
părinte
comite
111ca24375

+ 18 - 6
src/main/kotlin/com/sirekanyan/andersrobot/AndersRobot.kt

@@ -17,13 +17,20 @@ import org.telegram.telegrambots.util.WebhookUtils
 val botName = Config[BOT_USERNAME]
 val adminId = Config[ADMIN_ID].toLong()
 val delayedCommands = mutableMapOf<Long, Command>()
-private val userCommands: List<Command> =
+private val primaryCommands: List<Command> =
     listOf(
         LocationCommand,
-        CityCommand("/temp", "погода", AndersController::onCityCommand, AndersController::onWeatherCommand),
-        CityCommand("/add", "добавить город", AndersController::onAddCity, AndersController::onCityMissing),
-        CityCommand("/del", "удалить город", AndersController::onDeleteCity, AndersController::onCityMissing),
-        CityCommand("/forecast", "прогноз", AndersController::onForecastCommand, AndersController::onCityMissing),
+        CityCommand("/temp(@$botName)?", AndersController::onCityCommand, AndersController::onWeatherCommand),
+        CityCommand("/add(@$botName)?", AndersController::onAddCity, AndersController::onCityMissing),
+        CityCommand("/delete(@$botName)?", AndersController::onDeleteCity, AndersController::onCityMissing),
+        CityCommand("/forecast(@$botName)?", AndersController::onForecastCommand, AndersController::onCityMissing),
+    )
+private val secondaryCommands: List<Command> =
+    listOf(
+        CityCommand("погода", AndersController::onCityCommand, AndersController::onWeatherCommand),
+        CityCommand("добавить город", AndersController::onAddCity, AndersController::onCityMissing),
+        CityCommand("удалить город", AndersController::onDeleteCity, AndersController::onCityMissing),
+        CityCommand("прогноз", AndersController::onForecastCommand, AndersController::onCityMissing),
         RegexCommand("\\b(celsi|цельси)", AndersController::onCelsiusCommand),
         RegexCommand("\\b((андерс|anders|погод[аеуы])\\b|градус)", AndersController::onWeatherCommand),
     )
@@ -54,12 +61,17 @@ class AndersRobot : DefaultAbsSender(DefaultBotOptions()), LongPollingBot {
         val text = message.text
         println("${message.from?.id} (chat $chatId) => $text")
         val controller = factory.createController(this, update)
+        for (command in primaryCommands) {
+            if (command.execute(controller, message)) {
+                return
+            }
+        }
         delayedCommands[chatId]?.let { command ->
             delayedCommands.remove(chatId)
             command.execute(controller, text)
             return
         }
-        for (command in userCommands) {
+        for (command in secondaryCommands) {
             if (command.execute(controller, message)) {
                 return
             }

+ 5 - 7
src/main/kotlin/com/sirekanyan/andersrobot/command/CityCommand.kt

@@ -1,18 +1,16 @@
 package com.sirekanyan.andersrobot.command
 
 import com.sirekanyan.andersrobot.AndersController
-import com.sirekanyan.andersrobot.botName
 import org.telegram.telegrambots.meta.api.objects.Message
 
 class CityCommand(
-    private val en: String,
-    private val ru: String,
+    private val pattern: String,
     private val action: (AndersController, String) -> Unit,
     private val onEmptyArguments: (AndersController, Command) -> Unit,
 ) : Command {
 
     override fun execute(controller: AndersController, message: Message): Boolean =
-        execute(controller, parseCityArgument(message.text, en, ru))
+        execute(controller, parseCityArgument(message.text))
 
     override fun execute(controller: AndersController, arguments: String?): Boolean {
         when {
@@ -23,9 +21,9 @@ class CityCommand(
         return true
     }
 
-    private fun parseCityArgument(text: String?, en: String, ru: String): String? {
-        val regex = Regex("($en(@$botName)?|$ru) ?(.*)", RegexOption.IGNORE_CASE)
-        return regex.matchEntire(text.orEmpty())?.groupValues?.get(3)
+    private fun parseCityArgument(text: String?): String? {
+        val regex = Regex("$pattern ?(.*)", RegexOption.IGNORE_CASE)
+        return regex.matchEntire(text.orEmpty())?.groupValues?.last()
     }
 
 }

+ 12 - 6
src/test/kotlin/com/sirekanyan/andersrobot/StringsTest.kt

@@ -1,8 +1,8 @@
 package com.sirekanyan.andersrobot
 
-import com.sirekanyan.andersrobot.extensions.isWeatherCommand
 import org.junit.Assert.assertEquals
 import org.junit.Test
+import kotlin.text.RegexOption.IGNORE_CASE
 
 class StringsTest {
 
@@ -18,8 +18,9 @@ class StringsTest {
         assertEquals(true, isWeatherCommand("скажи погоду"))
         assertEquals(true, isWeatherCommand("какая погода"))
         assertEquals(true, isWeatherCommand("что по погоде"))
-        assertEquals(true, isWeatherCommand("/temp"))
-        assertEquals(true, isWeatherCommand("/temp@AndersRobot"))
+        assertEquals(true, isPrimaryWeatherCommand("/temp"))
+        assertEquals(true, isPrimaryWeatherCommand("/TEMP"))
+        assertEquals(true, isPrimaryWeatherCommand("/temp@AndersRobot"))
     }
 
     @Test
@@ -28,9 +29,14 @@ class StringsTest {
         assertEquals(false, isWeatherCommand("погоди"))
         assertEquals(false, isWeatherCommand("погоди"))
         assertEquals(false, isWeatherCommand("погоди-ка"))
-        assertEquals(false, isWeatherCommand("/TEMP"))
-        assertEquals(false, isWeatherCommand("temp"))
-        assertEquals(false, isWeatherCommand("/temperature"))
+        assertEquals(false, isPrimaryWeatherCommand("temp"))
+        assertEquals(false, isPrimaryWeatherCommand("/temperature"))
     }
 
+    private fun isWeatherCommand(text: String) =
+        text.contains(Regex("\\b((андерс|anders|погод[аеуы])\\b|градус)", IGNORE_CASE))
+
+    private fun isPrimaryWeatherCommand(text: String) =
+        text.matches(Regex("/temp(@$botName)?", IGNORE_CASE))
+
 }