mirror of
https://github.com/InsanusMokrassar/PlaguBot.git
synced 2025-12-28 17:09:17 +00:00
start integration FSM oriented plagubot version
This commit is contained in:
24
fsm/plugin/src/main/kotlin/FSMPlugin.kt
Normal file
24
fsm/plugin/src/main/kotlin/FSMPlugin.kt
Normal file
@@ -0,0 +1,24 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
25
fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt
Normal file
25
fsm/plugin/src/main/kotlin/FSMPluginSerializer.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
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<FSMPlugin> {
|
||||
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
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user