Merge pull request #8 from InsanusMokrassar/0.1.3

0.1.3
This commit is contained in:
InsanusMokrassar 2021-02-18 00:41:18 +06:00 committed by GitHub
commit 8f88d4b1a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 69 additions and 6 deletions

View File

@ -1,5 +1,14 @@
# Changelog # Changelog
## 0.1.3
* `Versions`
* `tgbotapi`: `0.32.6` -> `0.32.7`
* `Bot`
* `initPlaguBot` now will return `Job`
* `Plugin`
* Plugin serializer
## 0.1.2 ## 0.1.2
* `Versions` * `Versions`

View File

@ -15,12 +15,12 @@ import java.io.File
suspend inline fun initPlaguBot( suspend inline fun initPlaguBot(
config: Config, config: Config,
scope: CoroutineScope = CoroutineScope(Dispatchers.Default) scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
) { ): Job {
val bot = telegramBot(config.botToken) val bot = telegramBot(config.botToken)
val paramsMap = config.params ?.toMap() ?: emptyMap() val paramsMap = config.params ?.toMap() ?: emptyMap()
val database = config.params ?.database ?: config.database.database val database = config.params ?.database ?: config.database.database
bot.buildBehaviour(scope) { return bot.buildBehaviour(scope) {
val commands = config.plugins.flatMap { val commands = config.plugins.flatMap {
it.apply { invoke(database, paramsMap) } it.apply { invoke(database, paramsMap) }
it.getCommands() it.getCommands()
@ -45,6 +45,5 @@ suspend fun main(args: Array<String>) {
val config = configSerialFormat.decodeFromString(Config.serializer(), file.readText()) val config = configSerialFormat.decodeFromString(Config.serializer(), file.readText())
val scope = CoroutineScope(Dispatchers.Default) val scope = CoroutineScope(Dispatchers.Default)
initPlaguBot(config, scope) initPlaguBot(config, scope).join()
scope.coroutineContext.job.join()
} }

View File

@ -10,7 +10,7 @@ kotlin_serialisation_runtime_version=1.1.0-RC
kotlin_exposed_version=0.29.1 kotlin_exposed_version=0.29.1
sdi_version=0.4.0-rc2 sdi_version=0.4.0-rc2
tgbotapi_version=0.32.6 tgbotapi_version=0.32.7
microutils_version=0.4.25 microutils_version=0.4.25
klassindex_version=4.1.0-rc.1 klassindex_version=4.1.0-rc.1
@ -19,4 +19,4 @@ sqlite_version=3.30.1
github_release_plugin_version=2.2.12 github_release_plugin_version=2.2.12
group=dev.inmo group=dev.inmo
version=0.1.2 version=0.1.3

View File

@ -5,6 +5,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
import dev.inmo.tgbotapi.types.BotCommand import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Database
/** /**
@ -12,6 +13,7 @@ import org.jetbrains.exposed.sql.Database
* to set up short name for your plugin. Besides, simple name of your class will be used as key for deserialization * to set up short name for your plugin. Besides, simple name of your class will be used as key for deserialization
* too. * too.
*/ */
@Serializable(PluginSerializer::class)
interface Plugin { interface Plugin {
/** /**
* In case you want to publish some processed by your plugin commands, you can provide it via this method * In case you want to publish some processed by your plugin commands, you can provide it via this method

View File

@ -0,0 +1,53 @@
package dev.inmo.plagubot
import kotlinx.serialization.*
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<Plugin> {
private val polymorphic = PolymorphicSerializer(Plugin::class)
override val descriptor: SerialDescriptor = JsonObject.serializer().descriptor
@InternalSerializationApi
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<Plugin>,
JsonObject(jsonObject.toMutableMap().also { it.remove("type") })
)
} else {
format.decodeFromJsonElement(
polymorphic,
asJson
)
}
}
@InternalSerializationApi
override fun serialize(encoder: Encoder, value: Plugin) {
val serializer = (value::class.serializerOrNull() ?: polymorphic) as KSerializer<Plugin>
serializer.serialize(encoder, value)
}
}