From 751e9aa66cbab694832ee10f3e5f169beb3c7db0 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 13 Aug 2022 20:09:21 +0600 Subject: [PATCH] remove redundant modules --- bot/build.gradle | 1 + .../main/kotlin/dev/inmo/plagubot/PlaguBot.kt | 24 +++- .../plagubot/config/FallbackStateHandler.kt | 3 + fsm/bot/build.gradle | 38 ------ fsm/bot/publish.gradle | 81 ------------- fsm/bot/publish.kpsb | 1 - fsm/bot/src/main/kotlin/App.kt | 25 ---- fsm/bot/src/main/kotlin/FSMPlaguBot.kt | 112 ------------------ fsm/bot/src/main/kotlin/HelloFSMPlugin.kt | 37 ------ fsm/plugin/build.gradle | 21 ---- fsm/plugin/publish.gradle | 81 ------------- fsm/plugin/publish.kpsb | 1 - fsm/plugin/src/main/kotlin/FSMPlugin.kt | 24 ---- .../src/main/kotlin/FSMPluginSerializer.kt | 25 ---- .../main/kotlin/dev/inmo/plagubot/Plugin.kt | 5 + settings.gradle | 2 +- 16 files changed, 29 insertions(+), 452 deletions(-) create mode 100644 bot/src/main/kotlin/dev/inmo/plagubot/config/FallbackStateHandler.kt delete mode 100644 fsm/bot/build.gradle delete mode 100644 fsm/bot/publish.gradle delete mode 100644 fsm/bot/publish.kpsb delete mode 100644 fsm/bot/src/main/kotlin/App.kt delete mode 100644 fsm/bot/src/main/kotlin/FSMPlaguBot.kt delete mode 100644 fsm/bot/src/main/kotlin/HelloFSMPlugin.kt delete mode 100644 fsm/plugin/build.gradle delete mode 100644 fsm/plugin/publish.gradle delete mode 100644 fsm/plugin/publish.kpsb delete mode 100644 fsm/plugin/src/main/kotlin/FSMPlugin.kt delete mode 100644 fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt diff --git a/bot/build.gradle b/bot/build.gradle index fe93273..473692a 100644 --- a/bot/build.gradle +++ b/bot/build.gradle @@ -16,6 +16,7 @@ dependencies { api libs.jb.exposed.jdbc api libs.tgbotapi + api libs.tgbotapi.behaviourBuilder.fsm api libs.microutils.repos.exposed api libs.kslog diff --git a/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt b/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt index b850b49..917da19 100644 --- a/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt +++ b/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt @@ -3,12 +3,14 @@ package dev.inmo.plagubot import dev.inmo.kslog.common.* import dev.inmo.micro_utils.common.Warning import dev.inmo.micro_utils.coroutines.runCatchingSafely -import dev.inmo.plagubot.config.Config -import dev.inmo.plagubot.config.defaultJsonFormat +import dev.inmo.micro_utils.fsm.common.State +import dev.inmo.micro_utils.fsm.common.StatesManager +import dev.inmo.micro_utils.fsm.common.managers.DefaultStatesManager +import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo +import dev.inmo.plagubot.config.* import dev.inmo.tgbotapi.bot.ktor.telegramBot import dev.inmo.tgbotapi.extensions.api.webhook.deleteWebhook -import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviour +import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import kotlinx.coroutines.* import kotlinx.serialization.Serializable @@ -94,7 +96,19 @@ data class PlaguBot( GlobalContext.startKoin(koinApp) logger.i("Koin started") lateinit var behaviourContext: BehaviourContext - bot.buildBehaviour(scope = scope) { + bot.buildBehaviourWithFSM( + scope = scope, + defaultExceptionsHandler = { + logger.e("Something went wrong", it) + }, + statesManager = koinApp.koin.getOrNull>() ?: DefaultStatesManager( + InMemoryDefaultStatesManagerRepo() + ), + onStateHandlingErrorHandler = koinApp.koin.getOrNull>() ?: { state, e -> + logger.eS(e) { "Unable to handle state $state" } + null + } + ) { logger.i("Start setup of bot part") behaviourContext = this setupBotPlugin(koinApp.koin) diff --git a/bot/src/main/kotlin/dev/inmo/plagubot/config/FallbackStateHandler.kt b/bot/src/main/kotlin/dev/inmo/plagubot/config/FallbackStateHandler.kt new file mode 100644 index 0000000..05d944f --- /dev/null +++ b/bot/src/main/kotlin/dev/inmo/plagubot/config/FallbackStateHandler.kt @@ -0,0 +1,3 @@ +package dev.inmo.plagubot.config + +typealias FallbackStateHandler = suspend (T, Throwable) -> T? diff --git a/fsm/bot/build.gradle b/fsm/bot/build.gradle deleted file mode 100644 index 495dfa1..0000000 --- a/fsm/bot/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' - id "org.jetbrains.kotlin.plugin.serialization" - id 'application' -} - -project.group="$group" -project.version="$version" - -apply from: "publish.gradle" - -dependencies { - implementation libs.kt.stdlib - api libs.kt.coroutines - api libs.kt.serialization - api libs.jb.exposed.jdbc - - api libs.tgbotapi - api libs.microutils.repos.exposed - api libs.kslog - - api libs.sqlite - - testImplementation libs.kt.test.junit - - api project(":plagubot.bot") - api project(":plagubot.fsm.plugin") -} - -application { - mainClassName = 'dev.inmo.plagubot.AppKt' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - diff --git a/fsm/bot/publish.gradle b/fsm/bot/publish.gradle deleted file mode 100644 index a65131e..0000000 --- a/fsm/bot/publish.gradle +++ /dev/null @@ -1,81 +0,0 @@ -apply plugin: 'maven-publish' - -task javadocJar(type: Jar) { - from javadoc - classifier = 'javadoc' -} -task sourcesJar(type: Jar) { - from sourceSets.main.allSource - classifier = 'sources' -} - -publishing { - publications { - maven(MavenPublication) { - from components.java - - artifact javadocJar - artifact sourcesJar - - pom { - resolveStrategy = Closure.DELEGATE_FIRST - - description = "Base PlaguBot project" - name = "PlaguBot Bot" - url = "https://github.com/InsanusMokrassar/PlaguBot" - - scm { - developerConnection = "scm:git:[fetch=]ssh://git@github.com/InsanusMokrassar/PlaguBot.git[push=]ssh://git@github.com/InsanusMokrassar/PlaguBot.git" - url = "ssh://git@github.com/InsanusMokrassar/PlaguBot.git" - } - - developers { - - developer { - id = "InsanusMokrassar" - name = "Aleksei Ovsiannikov" - email = "ovsyannikov.alexey95@gmail.com" - } - - } - - licenses { - - license { - name = "Apache Software License 2.0" - url = "https://github.com/InsanusMokrassar/PlaguBot/LICENSE" - } - - } - } - repositories { - if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) { - maven { - name = "sonatype" - url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") - credentials { - username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') - password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') - } - } - } - } - } - } -} - -if (project.hasProperty("signing.gnupg.keyName")) { - apply plugin: 'signing' - - signing { - useGpgCmd() - - sign publishing.publications - } - - task signAll { - tasks.withType(Sign).forEach { - dependsOn(it) - } - } -} diff --git a/fsm/bot/publish.kpsb b/fsm/bot/publish.kpsb deleted file mode 100644 index b1382ea..0000000 --- a/fsm/bot/publish.kpsb +++ /dev/null @@ -1 +0,0 @@ -{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/PlaguBot/LICENSE"}],"mavenConfig":{"name":"PlaguBot Bot","description":"Base PlaguBot project","url":"https://github.com/InsanusMokrassar/PlaguBot","vcsUrl":"ssh://git@github.com/InsanusMokrassar/PlaguBot.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"}],"repositories":[{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}},"type":"JVM"} \ No newline at end of file diff --git a/fsm/bot/src/main/kotlin/App.kt b/fsm/bot/src/main/kotlin/App.kt deleted file mode 100644 index e23073c..0000000 --- a/fsm/bot/src/main/kotlin/App.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.inmo.plagubot - -import dev.inmo.kslog.common.KSLog -import dev.inmo.kslog.common.i -import dev.inmo.plagubot.config.Config -import dev.inmo.plagubot.config.defaultJsonFormat -import kotlinx.serialization.InternalSerializationApi -import kotlinx.serialization.json.jsonObject -import java.io.File - -/** - * This method by default expects one argument in [args] field: path to config - */ -@InternalSerializationApi -suspend fun main(args: Array) { - KSLog.default = KSLog("PlaguBot") - val (configPath) = args - val file = File(configPath) - KSLog.i("Start read config from ${file.absolutePath}") - val json = defaultJsonFormat.parseToJsonElement(file.readText()).jsonObject - val config = defaultJsonFormat.decodeFromJsonElement(Config.serializer(), json) - KSLog.i("Config has been read") - - FSMPlaguBot(json, config).start().join() -} diff --git a/fsm/bot/src/main/kotlin/FSMPlaguBot.kt b/fsm/bot/src/main/kotlin/FSMPlaguBot.kt deleted file mode 100644 index b771485..0000000 --- a/fsm/bot/src/main/kotlin/FSMPlaguBot.kt +++ /dev/null @@ -1,112 +0,0 @@ -package dev.inmo.plagubot - -import dev.inmo.kslog.common.* -import dev.inmo.micro_utils.common.Warning -import dev.inmo.micro_utils.coroutines.runCatchingSafely -import dev.inmo.plagubot.config.Config -import dev.inmo.plagubot.config.defaultJsonFormat -import dev.inmo.plagubot.fsm.FSMPlugin -import dev.inmo.tgbotapi.bot.ktor.telegramBot -import dev.inmo.tgbotapi.extensions.api.webhook.deleteWebhook -import dev.inmo.tgbotapi.extensions.behaviour_builder.* -import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling -import kotlinx.coroutines.* -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient -import kotlinx.serialization.json.JsonObject -import org.jetbrains.exposed.sql.Database -import org.koin.core.Koin -import org.koin.core.KoinApplication -import org.koin.core.context.GlobalContext -import org.koin.core.module.Module -import org.koin.core.scope.Scope -import org.koin.dsl.module - -val Scope.fsmPlagubot: FSMPlaguBot - get() = get() - -val Koin.fsmPlagubot: FSMPlaguBot - get() = get() - -@OptIn(Warning::class) -@Serializable -data class FSMPlaguBot( - private val json: JsonObject, - private val config: Config -) : FSMPlugin { - @Transient - private val bot = telegramBot(config.botToken) - - override fun Module.setupDI(database: Database, params: JsonObject) { - single { config } - single { config.plugins } - single { config.databaseConfig } - single { config.databaseConfig.database } - single { defaultJsonFormat } - single { this@FSMPlaguBot } - - includes( - config.plugins.mapNotNull { - runCatching { - module { - with(it) { - setupDI(database, params) - } - } - }.onFailure { e -> - logger.w("Unable to load DI part of $it", e) - }.getOrNull() - } - ) - } - - override suspend fun BehaviourContextWithFSM<*>.setupBotPlugin(koin: Koin) { - config.plugins.map { plugin -> - launch { - runCatchingSafely { - logger.i("Start loading of $plugin") - with(plugin) { - if (this is FSMPlugin) { - setupBotPlugin(koin) // use setupBotPlugin with BehaviourContextWithFSM as receiver - } else { - setupBotPlugin(koin) // use setupBotPlugin with BehaviourContext as receiver - } - } - }.onFailure { e -> - logger.w("Unable to load bot part of $plugin", e) - }.onSuccess { - logger.i("Complete loading of $plugin") - } - } - }.joinAll() - } - - /** - * This method will create an [Job] which will be the main [Job] of ran instance - */ - suspend fun start( - scope: CoroutineScope = CoroutineScope(Dispatchers.IO) - ): Job { - logger.i("Start initialization") - val koinApp = KoinApplication.init() - koinApp.modules( - module { - setupDI(config.databaseConfig.database, json) - } - ) - logger.i("Modules loaded") - GlobalContext.startKoin(koinApp) - logger.i("Koin started") - lateinit var behaviourContext: BehaviourContext - bot.buildBehaviourWithFSM (scope = scope) { - logger.i("Start setup of bot part") - behaviourContext = this - setupBotPlugin(koinApp.koin) - deleteWebhook() - } - logger.i("Behaviour builder has been setup") - return bot.startGettingOfUpdatesByLongPolling(scope = behaviourContext, updatesFilter = behaviourContext).also { - logger.i("Long polling has been started") - } - } -} diff --git a/fsm/bot/src/main/kotlin/HelloFSMPlugin.kt b/fsm/bot/src/main/kotlin/HelloFSMPlugin.kt deleted file mode 100644 index baa6b5b..0000000 --- a/fsm/bot/src/main/kotlin/HelloFSMPlugin.kt +++ /dev/null @@ -1,37 +0,0 @@ -package dev.inmo.plagubot - -import dev.inmo.kslog.common.* -import dev.inmo.tgbotapi.extensions.api.bot.getMe -import dev.inmo.tgbotapi.extensions.api.send.reply -import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonObject -import org.jetbrains.exposed.sql.Database -import org.koin.core.Koin -import org.koin.core.module.Module - -@Serializable -@SerialName("Hello") -object HelloFSMPlugin : Plugin { - @Serializable - data class HelloPluginConfig( - val print: String - ) - - override fun Module.setupDI(database: Database, params: JsonObject) { - single { - get().decodeFromJsonElement(HelloPluginConfig.serializer(), params["helloPlugin"] ?: return@single null) - } - } - - override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { - logger.d { koin.get().print } - logger.dS { getMe().toString() } - onCommand("hello_world") { - reply(it, "Hello :)") - } - } -} diff --git a/fsm/plugin/build.gradle b/fsm/plugin/build.gradle deleted file mode 100644 index 7d57c41..0000000 --- a/fsm/plugin/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' - id "org.jetbrains.kotlin.plugin.serialization" -} - -project.group="$group" -project.version="$version" - -apply from: "publish.gradle" - -dependencies { - implementation libs.kt.stdlib - - api libs.tgbotapi.behaviourBuilder.fsm - api project(":plagubot.plugin") -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} diff --git a/fsm/plugin/publish.gradle b/fsm/plugin/publish.gradle deleted file mode 100644 index ed05a9d..0000000 --- a/fsm/plugin/publish.gradle +++ /dev/null @@ -1,81 +0,0 @@ -apply plugin: 'maven-publish' - -task javadocJar(type: Jar) { - from javadoc - classifier = 'javadoc' -} -task sourcesJar(type: Jar) { - from sourceSets.main.allSource - classifier = 'sources' -} - -publishing { - publications { - maven(MavenPublication) { - from components.java - - artifact javadocJar - artifact sourcesJar - - pom { - resolveStrategy = Closure.DELEGATE_FIRST - - description = "Base dependency for whole PlaguBot project" - name = "PlaguBot Plugin" - url = "https://github.com/InsanusMokrassar/PlaguBot" - - scm { - developerConnection = "scm:git:[fetch=]ssh://git@github.com/InsanusMokrassar/PlaguBot.git[push=]ssh://git@github.com/InsanusMokrassar/PlaguBot.git" - url = "ssh://git@github.com/InsanusMokrassar/PlaguBot.git" - } - - developers { - - developer { - id = "InsanusMokrassar" - name = "Aleksei Ovsiannikov" - email = "ovsyannikov.alexey95@gmail.com" - } - - } - - licenses { - - license { - name = "Apache Software License 2.0" - url = "https://github.com/InsanusMokrassar/PlaguBot/LICENSE" - } - - } - } - repositories { - if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) { - maven { - name = "sonatype" - url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") - credentials { - username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') - password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') - } - } - } - } - } - } -} - -if (project.hasProperty("signing.gnupg.keyName")) { - apply plugin: 'signing' - - signing { - useGpgCmd() - - sign publishing.publications - } - - task signAll { - tasks.withType(Sign).forEach { - dependsOn(it) - } - } -} diff --git a/fsm/plugin/publish.kpsb b/fsm/plugin/publish.kpsb deleted file mode 100644 index 40f786b..0000000 --- a/fsm/plugin/publish.kpsb +++ /dev/null @@ -1 +0,0 @@ -{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/PlaguBot/LICENSE"}],"mavenConfig":{"name":"PlaguBot Plugin","description":"Base dependency for whole PlaguBot project","url":"https://github.com/InsanusMokrassar/PlaguBot","vcsUrl":"ssh://git@github.com/InsanusMokrassar/PlaguBot.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"}],"repositories":[{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}],"gpgSigning":{"type":"dev.inmo.kmppscriptbuilder.core.models.GpgSigning.Optional"}},"type":"JVM"} \ No newline at end of file diff --git a/fsm/plugin/src/main/kotlin/FSMPlugin.kt b/fsm/plugin/src/main/kotlin/FSMPlugin.kt deleted file mode 100644 index d089c15..0000000 --- a/fsm/plugin/src/main/kotlin/FSMPlugin.kt +++ /dev/null @@ -1,24 +0,0 @@ -package dev.inmo.plagubot.fsm - -import dev.inmo.plagubot.Plugin -import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextWithFSM -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonObject -import org.jetbrains.exposed.sql.Database -import org.koin.core.Koin -import org.koin.core.module.Module - -/** - * **ANY REALIZATION OF [FSMPlugin] MUST HAVE CONSTRUCTOR WITH ABSENCE OF INCOMING PARAMETERS** - * - * Use this interface for your bot. It is possible to use [kotlinx.serialization.SerialName] annotations on your plugins - * to set up short name for your plugin. Besides, simple name of your class will be used as key for deserialization - * too. - */ -@Serializable(FSMPluginSerializer::class) -interface FSMPlugin : Plugin { - suspend fun BehaviourContextWithFSM<*>.setupBotPlugin(koin: Koin) { - (this as BehaviourContext).setupBotPlugin(koin) - } -} diff --git a/fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt b/fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt deleted file mode 100644 index 40b6a51..0000000 --- a/fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.inmo.plagubot.fsm - -import kotlinx.serialization.KSerializer -import kotlinx.serialization.Serializer -import kotlinx.serialization.builtins.serializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder - -@Serializer(FSMPlugin::class) -class FSMPluginSerializer : KSerializer { - override val descriptor: SerialDescriptor - get() = String.serializer().descriptor - - override fun deserialize(decoder: Decoder): FSMPlugin { - val kclass = Class.forName(decoder.decodeString()).kotlin - return (kclass.objectInstance ?: kclass.constructors.first { it.parameters.isEmpty() }.call()) as FSMPlugin - } - - override fun serialize(encoder: Encoder, value: FSMPlugin) { - encoder.encodeString( - value::class.java.canonicalName - ) - } -} diff --git a/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt b/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt index 87cfdee..cd493c5 100644 --- a/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt +++ b/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt @@ -1,6 +1,8 @@ package dev.inmo.plagubot +import dev.inmo.micro_utils.fsm.common.State import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextWithFSM import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject import org.jetbrains.exposed.sql.Database @@ -26,4 +28,7 @@ interface Plugin { suspend fun BehaviourContext.setupBotPlugin( koin: Koin ) {} + suspend fun BehaviourContextWithFSM.setupBotPlugin(koin: Koin) { + (this as BehaviourContext).setupBotPlugin(koin) + } } diff --git a/settings.gradle b/settings.gradle index 24fa9bc..2e81cdb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -String[] toInclude = [":bot", ":plugin", ":fsm:bot", ":fsm:plugin"] +String[] toInclude = [":bot", ":plugin"] rootProject.name = 'plagubot'