From a0f9e31b04d7f0d9a87cf061585871d127277e1d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 13 May 2022 13:04:49 +0600 Subject: [PATCH] start migration --- bot/build.gradle | 28 +++-------- bot/pubconf.kpsb | 1 - bot/publish.gradle | 35 +++++++------ bot/publish.kpsb | 1 + .../main/kotlin/dev/inmo/plagubot/PlaguBot.kt | 4 +- .../kotlin/dev/inmo/plagubot/config/Config.kt | 6 +-- .../plagubot/config/PluginsConfiguration.kt | 1 - build.gradle | 9 ++-- gradle.properties | 14 ------ gradle/libs.versions.toml | 49 +++++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- plugin/build.gradle | 10 ++-- plugin/pubconf.kpsb | 1 - plugin/publish.gradle | 35 +++++++------ plugin/publish.kpsb | 1 + .../main/kotlin/dev/inmo/plagubot/Plugin.kt | 26 +++++----- .../dev/inmo/plagubot/PluginSerializer.kt | 49 ++++--------------- 17 files changed, 130 insertions(+), 142 deletions(-) delete mode 100644 bot/pubconf.kpsb create mode 100644 bot/publish.kpsb create mode 100644 gradle/libs.versions.toml delete mode 100644 plugin/pubconf.kpsb create mode 100644 plugin/publish.kpsb diff --git a/bot/build.gradle b/bot/build.gradle index 46e7105..ec782bc 100644 --- a/bot/build.gradle +++ b/bot/build.gradle @@ -1,7 +1,6 @@ plugins { id 'org.jetbrains.kotlin.jvm' id "org.jetbrains.kotlin.plugin.serialization" - id "org.jetbrains.kotlin.kapt" id 'application' } @@ -11,21 +10,17 @@ project.version="$version" apply from: "publish.gradle" dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" - api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialisation_runtime_version" - api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - api "org.jetbrains.exposed:exposed-jdbc:$kotlin_exposed_version" + implementation libs.kt.stdlib + api libs.kt.coroutines + api libs.kt.serialization + api libs.jb.exposed.jdbc - api "dev.inmo:tgbotapi:$tgbotapi_version" - api "dev.inmo:sdi:$sdi_version" - api "dev.inmo:micro_utils.repos.exposed:$microutils_version" + api libs.tgbotapi + api libs.microutils.repos.exposed - api "com.github.matfax.klassindex:library:$klassindex_version" - kapt "com.github.matfax.klassindex:processor:$klassindex_version" - api "org.xerial:sqlite-jdbc:$sqlite_version" + api libs.sqlite - testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" + testImplementation libs.kt.test.junit api project(":plagubot.plugin") } @@ -34,13 +29,6 @@ application { mainClassName = 'dev.inmo.plagubot.AppKt' } -kapt { - arguments { - arg("com.github.matfax.klassindex.IndexSubclasses", "dev.inmo.plagubot.Plugin") - arg("com.github.matfax.klassindex.IndexAnnotated", "dev.inmo.sdi.SDIIncluded") - } -} - java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 diff --git a/bot/pubconf.kpsb b/bot/pubconf.kpsb deleted file mode 100644 index aac6132..0000000 --- a/bot/pubconf.kpsb +++ /dev/null @@ -1 +0,0 @@ -{"bintrayConfig":{"repo":"PlaguBot","packageName":"${project.name}","packageVcs":"https://github.com/InsanusMokrassar/PlaguBot","autoPublish":true,"overridePublish":true},"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","includeGpgSigning":true,"publishToMavenCentral":true,"developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"}]},"type":"JVM"} \ No newline at end of file diff --git a/bot/publish.gradle b/bot/publish.gradle index b2257cc..a65131e 100644 --- a/bot/publish.gradle +++ b/bot/publish.gradle @@ -1,6 +1,4 @@ apply plugin: 'maven-publish' -apply plugin: 'signing' - task javadocJar(type: Jar) { from javadoc @@ -50,17 +48,8 @@ publishing { } } - - repositories { - maven { - name = "bintray" - url = uri("https://api.bintray.com/maven/${project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER')}/PlaguBot/${project.name}/;publish=1;override=1") - credentials { - username = project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER') - password = project.hasProperty('BINTRAY_KEY') ? project.property('BINTRAY_KEY') : System.getenv('BINTRAY_KEY') - } - } - + 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/") @@ -69,14 +58,24 @@ publishing { password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') } } - } - + } } } } -signing { - useGpgCmd() - sign publishing.publications +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/bot/publish.kpsb b/bot/publish.kpsb new file mode 100644 index 0000000..b1382ea --- /dev/null +++ b/bot/publish.kpsb @@ -0,0 +1 @@ +{"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/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt b/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt index 5cfa092..a07b70b 100644 --- a/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt +++ b/bot/src/main/kotlin/dev/inmo/plagubot/PlaguBot.kt @@ -2,7 +2,7 @@ package dev.inmo.plagubot import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.plagubot.config.* -import dev.inmo.tgbotapi.bot.Ktor.telegramBot +import dev.inmo.tgbotapi.bot.ktor.telegramBot import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.types.BotCommand @@ -24,8 +24,6 @@ data class PlaguBot( @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 { diff --git a/bot/src/main/kotlin/dev/inmo/plagubot/config/Config.kt b/bot/src/main/kotlin/dev/inmo/plagubot/config/Config.kt index d4b0238..67a624f 100644 --- a/bot/src/main/kotlin/dev/inmo/plagubot/config/Config.kt +++ b/bot/src/main/kotlin/dev/inmo/plagubot/config/Config.kt @@ -4,12 +4,12 @@ import dev.inmo.plagubot.Plugin import dev.inmo.sdi.Module import kotlinx.serialization.Contextual import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject @Serializable data class Config( - override val plugins: List<@Contextual Plugin>, + override val plugins: List, val database: DatabaseConfig = DatabaseConfig(), val botToken: String, - @Contextual - override val params: Module? = null + val rawConfig: JsonObject ) : PluginsConfiguration diff --git a/bot/src/main/kotlin/dev/inmo/plagubot/config/PluginsConfiguration.kt b/bot/src/main/kotlin/dev/inmo/plagubot/config/PluginsConfiguration.kt index c110de2..092858f 100644 --- a/bot/src/main/kotlin/dev/inmo/plagubot/config/PluginsConfiguration.kt +++ b/bot/src/main/kotlin/dev/inmo/plagubot/config/PluginsConfiguration.kt @@ -2,7 +2,6 @@ package dev.inmo.plagubot.config import com.github.matfax.klassindex.KlassIndex import dev.inmo.plagubot.Plugin -import dev.inmo.plagubot.PluginSerializer import dev.inmo.sdi.Module import dev.inmo.sdi.ModuleSerializer import kotlinx.serialization.* diff --git a/build.gradle b/build.gradle index 4d09d52..208b3a2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,20 +1,19 @@ buildscript { repositories { - jcenter() + mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" - classpath "com.github.breadmoirai:github-release:$github_release_plugin_version" + classpath libs.buildscript.kt.gradle + classpath libs.buildscript.kt.serialization + classpath libs.buildscript.gh.release } } allprojects { repositories { mavenCentral() - jcenter() mavenLocal() maven { url 'https://jitpack.io' } } diff --git a/gradle.properties b/gradle.properties index 41d4d83..5707ff5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,19 +4,5 @@ org.gradle.parallel=true kotlin.js.generate.externals=true kotlin.incremental=true -kotlin_version=1.6.10 -kotlin_coroutines_version=1.6.0 -kotlin_serialisation_runtime_version=1.3.2 -kotlin_exposed_version=0.37.2 - -sdi_version=0.6.0 -tgbotapi_version=0.38.4 -microutils_version=0.9.5 -klassindex_version=4.1.0-rc.1 - -sqlite_version=3.36.0.3 - -github_release_plugin_version=2.2.12 - group=dev.inmo version=1.0.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..8be3969 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,49 @@ +[versions] + +kt = "1.6.21" +kt-serialization = "1.3.3" +kt-coroutines = "1.6.1" + +microutils = "0.10.4" +tgbotapi = "1.0.1" + +jb-exposed = "0.38.2" +jb-dokka = "1.6.21" + +sqlite = "3.36.0.3" + +klock = "2.7.0" +uuid = "0.4.0" + +ktor = "2.0.1" + +gh-release = "2.3.7" + +android-gradle = "7.0.4" +dexcount = "3.0.1" +koin = "3.2.0" + +[libraries] + +kt-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kt" } + +kt-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kt-coroutines" } +kt-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kt-serialization" } + +tgbotapi = { module = "dev.inmo:tgbotapi", version.ref = "tgbotapi" } +microutils-repos-exposed = { module = "dev.inmo:micro_utils.repos.exposed", version.ref = "microutils" } + +koin = { module = "io.insert-koin:koin-core", version.ref = "koin" } + +jb-exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "jb-exposed" } + +sqlite = { module = "org.xerial:sqlite-jdbc", version.ref = "sqlite" } + + +kt-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kt" } + + +buildscript-kt-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kt" } +buildscript-kt-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kt" } +buildscript-jb-dokka = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "jb-dokka" } +buildscript-gh-release = { module = "com.github.breadmoirai:github-release", version.ref = "gh-release" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102..aa991fc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/plugin/build.gradle b/plugin/build.gradle index 3fcd11e..7e75844 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -9,11 +9,13 @@ project.version="$version" apply from: "publish.gradle" dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialisation_runtime_version" + implementation libs.kt.stdlib + api libs.kt.serialization - api "dev.inmo:tgbotapi:$tgbotapi_version" - api "dev.inmo:micro_utils.repos.exposed:$microutils_version" + api libs.tgbotapi + api libs.microutils.repos.exposed + + api libs.koin } java { diff --git a/plugin/pubconf.kpsb b/plugin/pubconf.kpsb deleted file mode 100644 index 433c2f0..0000000 --- a/plugin/pubconf.kpsb +++ /dev/null @@ -1 +0,0 @@ -{"bintrayConfig":{"repo":"PlaguBot","packageName":"${project.name}","packageVcs":"https://github.com/InsanusMokrassar/PlaguBot","autoPublish":true,"overridePublish":true},"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","includeGpgSigning":true,"publishToMavenCentral":true,"developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"}]},"type":"JVM"} \ No newline at end of file diff --git a/plugin/publish.gradle b/plugin/publish.gradle index 096e732..ed05a9d 100644 --- a/plugin/publish.gradle +++ b/plugin/publish.gradle @@ -1,6 +1,4 @@ apply plugin: 'maven-publish' -apply plugin: 'signing' - task javadocJar(type: Jar) { from javadoc @@ -50,17 +48,8 @@ publishing { } } - - repositories { - maven { - name = "bintray" - url = uri("https://api.bintray.com/maven/${project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER')}/PlaguBot/${project.name}/;publish=1;override=1") - credentials { - username = project.hasProperty('BINTRAY_USER') ? project.property('BINTRAY_USER') : System.getenv('BINTRAY_USER') - password = project.hasProperty('BINTRAY_KEY') ? project.property('BINTRAY_KEY') : System.getenv('BINTRAY_KEY') - } - } - + 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/") @@ -69,14 +58,24 @@ publishing { password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') } } - } - + } } } } -signing { - useGpgCmd() - sign publishing.publications +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/plugin/publish.kpsb b/plugin/publish.kpsb new file mode 100644 index 0000000..40f786b --- /dev/null +++ b/plugin/publish.kpsb @@ -0,0 +1 @@ +{"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/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt b/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt index 4f1ece8..ac86e7e 100644 --- a/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt +++ b/plugin/src/main/kotlin/dev/inmo/plagubot/Plugin.kt @@ -6,9 +6,13 @@ import dev.inmo.tgbotapi.types.BotCommand import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.CoroutineScope import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject import org.jetbrains.exposed.sql.Database +import org.koin.core.KoinApplication /** + * **ANY REALIZATION OF [Plugin] 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. @@ -22,26 +26,20 @@ interface Plugin { */ suspend fun getCommands(): List = emptyList() - @Deprecated("Override other method with receiver BehaviourContext") - suspend operator fun invoke( - bot: TelegramBot, + /** + * This method (usually) will be invoked just one time in the whole application. + */ + suspend operator fun BehaviourContext.invoke( database: Database, - updatesFilter: FlowsUpdatesFilter, - scope: CoroutineScope + koinApplication: KoinApplication, ) {} - /** - * This method (usually) will be invoked just one time in the whole application. - */ - suspend operator fun BehaviourContext.invoke( - database: Database - ) = invoke(bot, database, flowsUpdatesFilter, scope) - /** * This method (usually) will be invoked just one time in the whole application. */ suspend operator fun BehaviourContext.invoke( database: Database, - params: Map - ) = invoke(database) + koinApplication: KoinApplication, + params: JsonObject + ) = invoke(database, koinApplication) } diff --git a/plugin/src/main/kotlin/dev/inmo/plagubot/PluginSerializer.kt b/plugin/src/main/kotlin/dev/inmo/plagubot/PluginSerializer.kt index aa2b617..ad2252d 100644 --- a/plugin/src/main/kotlin/dev/inmo/plagubot/PluginSerializer.kt +++ b/plugin/src/main/kotlin/dev/inmo/plagubot/PluginSerializer.kt @@ -1,53 +1,24 @@ package dev.inmo.plagubot -import kotlinx.serialization.* +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 -import kotlinx.serialization.json.* - -private val defaultJson = Json { - ignoreUnknownKeys = true -} @Serializer(Plugin::class) -object PluginSerializer : KSerializer { - private val polymorphic = PolymorphicSerializer(Plugin::class) - override val descriptor: SerialDescriptor = JsonObject.serializer().descriptor +class PluginSerializer : KSerializer { + override val descriptor: SerialDescriptor + get() = String.serializer().descriptor - @OptIn(InternalSerializationApi::class) override fun deserialize(decoder: Decoder): Plugin { - val format = (decoder as? JsonDecoder) ?.json ?: defaultJson - val asJson = JsonElement.serializer().deserialize(decoder) - val jsonObject = (asJson as? JsonObject) - - val type = (jsonObject ?.get("type") as? JsonPrimitive) ?.contentOrNull - val external = if (type != null) { - try { - Class.forName(type) ?.kotlin ?.serializerOrNull() - } catch (e: Exception) { - null - } - } else { - null - } - - return if (jsonObject != null && external != null) { - format.decodeFromJsonElement( - external as KSerializer, - JsonObject(jsonObject.toMutableMap().also { it.remove("type") }) - ) - } else { - format.decodeFromJsonElement( - polymorphic, - asJson - ) - } + return Class.forName(decoder.decodeString()).getDeclaredConstructor().newInstance() as Plugin } - @OptIn(InternalSerializationApi::class) override fun serialize(encoder: Encoder, value: Plugin) { - val serializer = (value::class.serializerOrNull() ?: polymorphic) as KSerializer - serializer.serialize(encoder, value) + encoder.encodeString( + value::class.java.canonicalName + ) } }