Sfoglia il codice sorgente

Updated telegrambots library to 8.0.0

Vadik Sirekanyan 1 anno fa
parent
commit
b5484b3a54

+ 2 - 1
build.gradle.kts

@@ -21,7 +21,8 @@ repositories {
 }
 
 dependencies {
-    implementation("org.sirekanyan:telegram-bots:6.9.7.1")
+    implementation("org.sirekanyan:telegram-bots:8.0.0")
+    implementation("org.telegram:telegrambots-client:8.0.0")
     implementation("io.ktor:ktor-client-cio:3.0.2")
     implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
     implementation("org.jetbrains.exposed:exposed-jdbc:0.57.0")

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

@@ -1,16 +1,15 @@
 package com.sirekanyan.andersrobot
 
 import com.sirekanyan.andersrobot.command.*
-import com.sirekanyan.andersrobot.config.ConfigKey.*
+import com.sirekanyan.andersrobot.config.ConfigKey.ADMIN_ID
+import com.sirekanyan.andersrobot.config.ConfigKey.BOT_USERNAME
 import com.sirekanyan.andersrobot.extensions.logError
-import com.sirekanyan.andersrobot.extensions.logInfo
-import org.telegram.telegrambots.bots.DefaultAbsSender
-import org.telegram.telegrambots.bots.DefaultBotOptions
+import org.telegram.telegrambots.client.okhttp.OkHttpTelegramClient
+import org.telegram.telegrambots.longpolling.util.LongPollingSingleThreadUpdateConsumer
 import org.telegram.telegrambots.meta.api.methods.commands.SetMyCommands
 import org.telegram.telegrambots.meta.api.objects.Update
 import org.telegram.telegrambots.meta.api.objects.commands.scope.BotCommandScopeDefault
-import org.telegram.telegrambots.meta.generics.LongPollingBot
-import org.telegram.telegrambots.util.WebhookUtils
+import org.telegram.telegrambots.meta.generics.TelegramClient
 
 val botName = Config[BOT_USERNAME]
 val adminId = Config[ADMIN_ID]
@@ -35,7 +34,10 @@ private val help = listOf(
     HelpDescription("/forecast", "Weather forecast", "Прогноз погоды"),
 )
 
-class AndersRobot : DefaultAbsSender(DefaultBotOptions(), Config[BOT_TOKEN]), LongPollingBot {
+class AndersRobot(
+    botToken: String,
+) : TelegramClient by OkHttpTelegramClient(botToken),
+    LongPollingSingleThreadUpdateConsumer {
 
     private val factory = ControllerFactory()
 
@@ -45,9 +47,7 @@ class AndersRobot : DefaultAbsSender(DefaultBotOptions(), Config[BOT_TOKEN]), Lo
         execute(SetMyCommands(help.map(HelpDescription::enCommand), scope, null))
     }
 
-    override fun getBotUsername(): String = botName
-
-    override fun onUpdateReceived(update: Update) {
+    override fun consume(update: Update) {
         try {
             onUpdate(update)
         } catch (exception: Exception) {
@@ -81,14 +81,4 @@ class AndersRobot : DefaultAbsSender(DefaultBotOptions(), Config[BOT_TOKEN]), Lo
             }
         }
     }
-
-    override fun clearWebhook() {
-        logInfo("Cleared.")
-        WebhookUtils.clearWebhook(this)
-    }
-
-    override fun onClosing() {
-        logInfo("Closed.")
-    }
-
-}
+}

+ 17 - 17
src/main/kotlin/com/sirekanyan/andersrobot/Controller.kt

@@ -16,7 +16,7 @@ import org.sirekanyan.telegrambots.extensions.sendPhoto
 import org.telegram.telegrambots.meta.api.objects.InputFile
 import org.telegram.telegrambots.meta.api.objects.Location
 import org.telegram.telegrambots.meta.api.objects.Update
-import org.telegram.telegrambots.meta.bots.AbsSender
+import org.telegram.telegrambots.meta.generics.TelegramClient
 import java.io.File
 import java.util.*
 import javax.imageio.ImageIO
@@ -26,7 +26,7 @@ private const val DEFAULT_CITY_ID = 616052L // Yerevan
 class Controller(
     private val api: WeatherApi,
     private val repository: CityRepository,
-    private val sender: AbsSender,
+    private val client: TelegramClient,
     update: Update,
 ) {
 
@@ -38,7 +38,7 @@ class Controller(
     fun onLocationCommand(location: Location) {
         val weather = api.getWeather(location, language)
         if (weather == null) {
-            sender.sendMessage(chatId, "Не знаю такого места")
+            client.sendMessage(chatId, "Не знаю такого места")
         } else {
             showWeather(weather)
         }
@@ -47,7 +47,7 @@ class Controller(
     fun onCityCommand(city: String) {
         val weather = api.getWeather(city, language)
         if (weather == null) {
-            sender.sendMessage(chatId, "Не знаю такого города")
+            client.sendMessage(chatId, "Не знаю такого города")
         } else {
             showWeather(weather)
         }
@@ -56,7 +56,7 @@ class Controller(
     fun onAddCity(city: String) {
         val weather = api.getWeather(city, language)
         if (weather == null) {
-            sender.sendMessage(chatId, "Не знаю такого города")
+            client.sendMessage(chatId, "Не знаю такого города")
         } else {
             repository.putCity(chatId, weather.id)
             showWeathers()
@@ -66,16 +66,16 @@ class Controller(
     fun onDeleteCity(city: String) {
         val temperature = api.getWeather(city, language)
         when {
-            temperature == null -> sender.sendMessage(chatId, "Не знаю такого города")
-            repository.deleteCity(chatId, temperature.id) -> sender.sendMessage(chatId, "Удалено")
-            else -> sender.sendMessage(chatId, "Нет такого города")
+            temperature == null -> client.sendMessage(chatId, "Не знаю такого города")
+            repository.deleteCity(chatId, temperature.id) -> client.sendMessage(chatId, "Удалено")
+            else -> client.sendMessage(chatId, "Нет такого города")
         }
     }
 
     fun onForecastCommand(city: String) {
         val forecast = api.getForecast(city, language)
         if (forecast == null) {
-            sender.sendMessage(chatId, "Не знаю такого города")
+            client.sendMessage(chatId, "Не знаю такого города")
         } else {
             showForecast(forecast)
         }
@@ -83,7 +83,7 @@ class Controller(
 
     @Suppress("UNUSED_PARAMETER")
     fun onCelsiusCommand(command: Command) {
-        sender.sendMessage(chatId, "Можешь звать меня просто Андерс")
+        client.sendMessage(chatId, "Можешь звать меня просто Андерс")
     }
 
     @Suppress("UNUSED_PARAMETER")
@@ -93,14 +93,14 @@ class Controller(
 
     fun onCityMissing(command: Command) {
         delayedCommands[chatId] = command
-        sender.sendMessage(chatId, "Какой город?")
+        client.sendMessage(chatId, "Какой город?")
     }
 
     private fun showWeather(weather: Weather) {
         weather.findStickerFile()?.let { icon ->
-            sender.sendSticker(chatId, icon)
+            client.sendSticker(chatId, icon)
         }
-        sender.sendMessage(chatId, "${weather.name} ${weather.temperature}")
+        client.sendMessage(chatId, "${weather.name} ${weather.temperature}")
     }
 
     private fun showWeathers() {
@@ -115,17 +115,17 @@ class Controller(
         try {
             val file = File("weather-$chatId.png")
             ImageIO.write(generateImage(weathers), "png", file)
-            sender.sendPhoto(chatId, InputFile(file))
+            client.sendPhoto(chatId, InputFile(file))
         } catch (exception: Exception) {
-            sender.logError("Cannot send image to $chatId", exception)
-            sender.sendMessage(chatId, weathers.joinToString("\n") { it.format() })
+            client.logError("Cannot send image to $chatId", exception)
+            client.sendMessage(chatId, weathers.joinToString("\n") { it.format() })
         }
     }
 
     private fun showForecast(forecast: Forecast) {
         val city = forecast.city.name
         ggsave(plotForecast(forecast, locale), "$city.png")
-        sender.sendPhoto(chatId, InputFile(File("lets-plot-images/$city.png")))
+        client.sendPhoto(chatId, InputFile(File("lets-plot-images/$city.png")))
     }
 
 }

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

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

+ 4 - 3
src/main/kotlin/com/sirekanyan/andersrobot/Main.kt

@@ -3,12 +3,13 @@
 package com.sirekanyan.andersrobot
 
 import com.sirekanyan.andersrobot.config.ConfigKey
+import com.sirekanyan.andersrobot.config.ConfigKey.BOT_TOKEN
 import org.sirekanyan.telegrambots.BotConfig
-import org.telegram.telegrambots.meta.TelegramBotsApi
-import org.telegram.telegrambots.updatesreceivers.DefaultBotSession
+import org.telegram.telegrambots.longpolling.TelegramBotsLongPollingApplication
 
 val Config = BotConfig(ConfigKey.entries)
+private val BotToken = Config[BOT_TOKEN]
 
 fun main() {
-    TelegramBotsApi(DefaultBotSession::class.java).registerBot(AndersRobot())
+    TelegramBotsLongPollingApplication().registerBot(BotToken, AndersRobot(BotToken))
 }

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

@@ -2,7 +2,7 @@ package com.sirekanyan.andersrobot.command
 
 import com.sirekanyan.andersrobot.Controller
 import com.sirekanyan.andersrobot.botName
-import org.telegram.telegrambots.meta.api.objects.Message
+import org.telegram.telegrambots.meta.api.objects.message.Message
 import java.util.regex.Pattern
 import kotlin.text.RegexOption.IGNORE_CASE
 

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

@@ -1,7 +1,7 @@
 package com.sirekanyan.andersrobot.command
 
 import com.sirekanyan.andersrobot.Controller
-import org.telegram.telegrambots.meta.api.objects.Message
+import org.telegram.telegrambots.meta.api.objects.message.Message
 
 interface Command {
 

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

@@ -1,7 +1,7 @@
 package com.sirekanyan.andersrobot.command
 
 import com.sirekanyan.andersrobot.Controller
-import org.telegram.telegrambots.meta.api.objects.Message
+import org.telegram.telegrambots.meta.api.objects.message.Message
 
 object LocationCommand : Command {
     override fun execute(controller: Controller, message: Message): Boolean {

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

@@ -1,7 +1,7 @@
 package com.sirekanyan.andersrobot.command
 
 import com.sirekanyan.andersrobot.Controller
-import org.telegram.telegrambots.meta.api.objects.Message
+import org.telegram.telegrambots.meta.api.objects.message.Message
 import kotlin.text.RegexOption.IGNORE_CASE
 
 class RegexCommand(

+ 4 - 4
src/main/kotlin/com/sirekanyan/andersrobot/extensions/Logger.kt

@@ -5,15 +5,15 @@ import org.telegram.telegrambots.meta.api.methods.send.SendDocument
 import org.telegram.telegrambots.meta.api.methods.send.SendMessage
 import org.telegram.telegrambots.meta.api.objects.InputFile
 import org.telegram.telegrambots.meta.api.objects.Update
-import org.telegram.telegrambots.meta.bots.AbsSender
+import org.telegram.telegrambots.meta.generics.TelegramClient
 import java.io.ByteArrayOutputStream
 import java.io.PrintStream
 
-fun AbsSender.logInfo(text: String) {
+fun TelegramClient.logInfo(text: String) {
     execute(SendMessage(adminId, text))
 }
 
-fun AbsSender.logError(text: String, throwable: Throwable) {
+fun TelegramClient.logError(text: String, throwable: Throwable) {
     try {
         val stream = ByteArrayOutputStream()
         throwable.printStackTrace(PrintStream(stream))
@@ -23,7 +23,7 @@ fun AbsSender.logError(text: String, throwable: Throwable) {
     }
 }
 
-fun AbsSender.logError(update: Update) {
+fun TelegramClient.logError(update: Update) {
     try {
         val input = update.toString().byteInputStream()
         val document = InputFile(input, "update.txt")

+ 2 - 2
src/main/kotlin/com/sirekanyan/andersrobot/extensions/AbsSender.kt → src/main/kotlin/com/sirekanyan/andersrobot/extensions/TelegramClient.kt

@@ -2,13 +2,13 @@ package com.sirekanyan.andersrobot.extensions
 
 import org.telegram.telegrambots.meta.api.methods.send.SendSticker
 import org.telegram.telegrambots.meta.api.objects.InputFile
-import org.telegram.telegrambots.meta.bots.AbsSender
+import org.telegram.telegrambots.meta.generics.TelegramClient
 import java.io.File
 import java.util.concurrent.ConcurrentHashMap
 
 private val cachedFileIds: MutableMap<File, String> = ConcurrentHashMap()
 
-fun AbsSender.sendSticker(chatId: Long, file: File) {
+fun TelegramClient.sendSticker(chatId: Long, file: File) {
     fun send(f: InputFile) = execute(SendSticker(chatId.toString(), f))
     val cachedFileId = cachedFileIds[file]
     if (cachedFileId == null) {