Sfoglia il codice sorgente

Added /start command

Vadik Sirekanyan 4 anni fa
parent
commit
a68c08a520

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

@@ -20,20 +20,20 @@ val delayedCommands = mutableMapOf<Long, Command>()
 private val primaryCommands: List<Command> =
     listOf(
         LocationCommand,
-        CityCommand("temp", "погода", AndersController::onCityCommand, AndersController::onWeatherCommand),
-        CityCommand("add", "добавить город", AndersController::onAddCity, AndersController::onCityMissing),
-        CityCommand("delete", "удалить город", AndersController::onDeleteCity, AndersController::onCityMissing),
-        CityCommand("forecast", "прогноз", AndersController::onForecastCommand, AndersController::onCityMissing),
+        CityCommand(listOf("/start", "/temp", "погода"), Controller::onCityCommand, Controller::onWeatherCommand),
+        CityCommand(listOf("/add", "добавить город"), Controller::onAddCity, Controller::onCityMissing),
+        CityCommand(listOf("/delete", "удалить город"), Controller::onDeleteCity, Controller::onCityMissing),
+        CityCommand(listOf("/forecast", "прогноз"), Controller::onForecastCommand, Controller::onCityMissing),
     )
 private val secondaryCommands: List<Command> =
     listOf(
-        RegexCommand("\\b(celsi|цельси)", AndersController::onCelsiusCommand),
-        RegexCommand("\\b((андерс|anders|погод[аеуы])\\b|градус)", AndersController::onWeatherCommand),
+        RegexCommand("\\b(celsi|цельси)", Controller::onCelsiusCommand),
+        RegexCommand("\\b((андерс|anders|погод[аеуы])\\b|градус)", Controller::onWeatherCommand),
     )
 
 class AndersRobot : DefaultAbsSender(DefaultBotOptions()), LongPollingBot {
 
-    private val factory = AndersControllerFactory()
+    private val factory = ControllerFactory()
 
     override fun getBotUsername(): String = botName
 

+ 1 - 1
src/main/kotlin/com/sirekanyan/andersrobot/AndersController.kt → src/main/kotlin/com/sirekanyan/andersrobot/Controller.kt

@@ -22,7 +22,7 @@ import javax.imageio.ImageIO
 
 private const val DEFAULT_CITY_ID = 524901L // Moscow
 
-class AndersController(
+class Controller(
     private val api: WeatherApi,
     private val repository: CityRepository,
     private val sender: AbsSender,

+ 3 - 3
src/main/kotlin/com/sirekanyan/andersrobot/AndersControllerFactory.kt → src/main/kotlin/com/sirekanyan/andersrobot/ControllerFactory.kt

@@ -6,12 +6,12 @@ import com.sirekanyan.andersrobot.config.ConfigKey.DB_URL
 import com.sirekanyan.andersrobot.repository.CityRepositoryImpl
 import org.telegram.telegrambots.meta.api.objects.Update
 
-class AndersControllerFactory {
+class ControllerFactory {
 
     private val api = WeatherApi()
     private val repository = CityRepositoryImpl(Config[DB_URL])
 
-    fun createController(sender: AndersRobot, update: Update): AndersController =
-        AndersController(api, repository, sender, update)
+    fun createController(sender: AndersRobot, update: Update): Controller =
+        Controller(api, repository, sender, update)
 
 }

+ 8 - 10
src/main/kotlin/com/sirekanyan/andersrobot/command/CityCommand.kt

@@ -1,22 +1,21 @@
 package com.sirekanyan.andersrobot.command
 
-import com.sirekanyan.andersrobot.AndersController
+import com.sirekanyan.andersrobot.Controller
 import com.sirekanyan.andersrobot.botName
 import org.telegram.telegrambots.meta.api.objects.Message
 import java.util.regex.Pattern
 import kotlin.text.RegexOption.IGNORE_CASE
 
 class CityCommand(
-    private val englishWord: String,
-    private val russianWord: String,
-    private val action: (AndersController, String) -> Unit,
-    private val onEmptyArguments: (AndersController, Command) -> Unit,
+    private val words: List<String>,
+    private val action: (Controller, String) -> Unit,
+    private val onEmptyArguments: (Controller, Command) -> Unit,
 ) : Command {
 
-    override fun execute(controller: AndersController, message: Message): Boolean =
+    override fun execute(controller: Controller, message: Message): Boolean =
         execute(controller, parseCityArgument(message.text))
 
-    override fun execute(controller: AndersController, arguments: String?): Boolean {
+    override fun execute(controller: Controller, arguments: String?): Boolean {
         when {
             arguments == null -> return false
             arguments.isBlank() -> onEmptyArguments(controller, this)
@@ -26,9 +25,8 @@ class CityCommand(
     }
 
     private fun parseCityArgument(text: String?): String? {
-        val en = Pattern.quote(englishWord)
-        val ru = Pattern.quote(russianWord)
-        val regex = Regex("(/$en(@$botName)?|$ru) ?(.*)", IGNORE_CASE)
+        val commands = words.flatMap { if (it.startsWith('/')) listOf(it, "$it@$botName") else listOf(it) }
+        val regex = Regex("(${commands.joinToString("|", transform = Pattern::quote)})( (.*))?", IGNORE_CASE)
         return regex.matchEntire(text.orEmpty())?.groupValues?.last()
     }
 

+ 3 - 3
src/main/kotlin/com/sirekanyan/andersrobot/command/Command.kt

@@ -1,13 +1,13 @@
 package com.sirekanyan.andersrobot.command
 
-import com.sirekanyan.andersrobot.AndersController
+import com.sirekanyan.andersrobot.Controller
 import org.telegram.telegrambots.meta.api.objects.Message
 
 interface Command {
 
-    fun execute(controller: AndersController, message: Message): Boolean
+    fun execute(controller: Controller, message: Message): Boolean
 
-    fun execute(controller: AndersController, arguments: String?): Boolean {
+    fun execute(controller: Controller, arguments: String?): Boolean {
         throw UnsupportedOperationException()
     }
 

+ 2 - 2
src/main/kotlin/com/sirekanyan/andersrobot/command/LocationCommand.kt

@@ -1,10 +1,10 @@
 package com.sirekanyan.andersrobot.command
 
-import com.sirekanyan.andersrobot.AndersController
+import com.sirekanyan.andersrobot.Controller
 import org.telegram.telegrambots.meta.api.objects.Message
 
 object LocationCommand : Command {
-    override fun execute(controller: AndersController, message: Message): Boolean {
+    override fun execute(controller: Controller, message: Message): Boolean {
         if (message.hasLocation()) {
             controller.onLocationCommand(message.location)
             return true

+ 3 - 3
src/main/kotlin/com/sirekanyan/andersrobot/command/RegexCommand.kt

@@ -1,14 +1,14 @@
 package com.sirekanyan.andersrobot.command
 
-import com.sirekanyan.andersrobot.AndersController
+import com.sirekanyan.andersrobot.Controller
 import org.telegram.telegrambots.meta.api.objects.Message
 import kotlin.text.RegexOption.IGNORE_CASE
 
 class RegexCommand(
     private val pattern: String,
-    private val action: (AndersController, Command) -> Unit,
+    private val action: (Controller, Command) -> Unit,
 ) : Command {
-    override fun execute(controller: AndersController, message: Message): Boolean {
+    override fun execute(controller: Controller, message: Message): Boolean {
         if (message.text?.contains(Regex(pattern, IGNORE_CASE)) == true) {
             action(controller, this)
             return true