package dev.inmo.plagubot import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.plagubot.config.Config import dev.inmo.plagubot.config.database import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviour import dev.inmo.tgbotapi.types.BotCommand import dev.inmo.tgbotapi.types.botCommandsLimit import kotlinx.coroutines.* import kotlinx.serialization.Serializable import kotlinx.serialization.Transient import org.jetbrains.exposed.sql.Database const val DefaultPlaguBotParamsKey = "plagubot" val Map.plagubot get() = get(DefaultPlaguBotParamsKey) as? PlaguBot @Serializable data class PlaguBot( private val config: Config ) : Plugin { @Transient private val bot = telegramBot(config.botToken) @Transient private val paramsMap = config.params ?.toMap() ?: emptyMap() @Transient private val database = config.params ?.database ?: config.database.database override suspend fun getCommands(): List = config.plugins.flatMap { it.getCommands() } override suspend fun BehaviourContext.invoke(database: Database, params: Map) { config.plugins.forEach { it.apply { invoke(database, params) } } val commands = getCommands() val futureUnavailable = commands.drop(botCommandsLimit.last) if (futureUnavailable.isNotEmpty()) { println("Next commands are out of range in setting command request and will be unavailable from autocompleting: $futureUnavailable") } safelyWithoutExceptions { setMyCommands(commands.take(botCommandsLimit.last)) } } /** * This method will create an [Job] which will be the main [Job] of ran instance */ suspend fun start( scope: CoroutineScope = CoroutineScope(Dispatchers.Default) ): Job = bot.buildBehaviour(scope) { invoke(database, paramsMap) } }