mirror of
				https://github.com/InsanusMokrassar/PlaguBot.git
				synced 2025-11-04 06:00:08 +00:00 
			
		
		
		
	complete 1.0.0
This commit is contained in:
		@@ -1,6 +1,9 @@
 | 
			
		||||
package dev.inmo.plagubot
 | 
			
		||||
 | 
			
		||||
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.*
 | 
			
		||||
import kotlinx.serialization.json.Json
 | 
			
		||||
import kotlinx.serialization.json.JsonObject
 | 
			
		||||
@@ -9,6 +12,7 @@ import org.koin.core.Koin
 | 
			
		||||
import org.koin.core.KoinApplication
 | 
			
		||||
import org.koin.core.component.KoinComponent
 | 
			
		||||
import org.koin.core.component.get
 | 
			
		||||
import org.koin.core.module.Module
 | 
			
		||||
import org.koin.dsl.module
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
@@ -18,16 +22,18 @@ class HelloPlugin : Plugin {
 | 
			
		||||
    data class HelloPluginConfig(
 | 
			
		||||
        val print: String
 | 
			
		||||
    )
 | 
			
		||||
    override suspend fun BehaviourContext.invoke(
 | 
			
		||||
        database: Database,
 | 
			
		||||
        params: JsonObject
 | 
			
		||||
    ) {
 | 
			
		||||
        loadModule {
 | 
			
		||||
            single {
 | 
			
		||||
                get<Json>().decodeFromJsonElement(HelloPluginConfig.serializer(), params["helloPlugin"] ?: return@single null)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        println(get<HelloPluginConfig>().print)
 | 
			
		||||
    override fun Module.setupDI(database: Database, params: JsonObject) {
 | 
			
		||||
        single {
 | 
			
		||||
            get<Json>().decodeFromJsonElement(HelloPluginConfig.serializer(), params["helloPlugin"] ?: return@single null)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
 | 
			
		||||
        println(koin.get<HelloPluginConfig>().print)
 | 
			
		||||
        println(getMe())
 | 
			
		||||
        onCommand("hello_world") {
 | 
			
		||||
            reply(it, "Hello :)")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package dev.inmo.plagubot
 | 
			
		||||
 | 
			
		||||
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.*
 | 
			
		||||
import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling
 | 
			
		||||
import kotlinx.coroutines.*
 | 
			
		||||
@@ -9,14 +10,14 @@ 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.component.get
 | 
			
		||||
import org.koin.core.context.GlobalContext
 | 
			
		||||
import org.koin.core.qualifier.named
 | 
			
		||||
import org.koin.core.module.Module
 | 
			
		||||
import org.koin.core.scope.Scope
 | 
			
		||||
import org.koin.dsl.module
 | 
			
		||||
 | 
			
		||||
const val DefaultPlaguBotParamsKey = "plagubot"
 | 
			
		||||
val Plugin.plagubot: PlaguBot
 | 
			
		||||
val Scope.plagubot: PlaguBot
 | 
			
		||||
    get() = get()
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
@@ -27,12 +28,30 @@ data class PlaguBot(
 | 
			
		||||
    @Transient
 | 
			
		||||
    private val bot = telegramBot(config.botToken)
 | 
			
		||||
 | 
			
		||||
    override suspend fun BehaviourContext.invoke(
 | 
			
		||||
        database: Database,
 | 
			
		||||
        params: JsonObject
 | 
			
		||||
    ) {
 | 
			
		||||
    override fun Module.setupDI(database: Database, params: JsonObject) {
 | 
			
		||||
        single { config }
 | 
			
		||||
        single { config.plugins }
 | 
			
		||||
        single { config.databaseConfig }
 | 
			
		||||
        single { config.databaseConfig.database }
 | 
			
		||||
        single { defaultJsonFormat }
 | 
			
		||||
        single { this@PlaguBot }
 | 
			
		||||
 | 
			
		||||
        includes(
 | 
			
		||||
            config.plugins.map {
 | 
			
		||||
                module {
 | 
			
		||||
                    with(it) {
 | 
			
		||||
                        setupDI(database, params)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
 | 
			
		||||
        config.plugins.forEach {
 | 
			
		||||
            it.apply { invoke(database, params) }
 | 
			
		||||
            with(it) {
 | 
			
		||||
                setupBotPlugin(koin)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -40,25 +59,21 @@ data class PlaguBot(
 | 
			
		||||
     * This method will create an [Job] which will be the main [Job] of ran instance
 | 
			
		||||
     */
 | 
			
		||||
    suspend fun start(
 | 
			
		||||
        scope: CoroutineScope = CoroutineScope(Dispatchers.Default)
 | 
			
		||||
        scope: CoroutineScope = CoroutineScope(Dispatchers.IO)
 | 
			
		||||
    ): Job {
 | 
			
		||||
        val koinApp = KoinApplication.init()
 | 
			
		||||
        koinApp.modules(
 | 
			
		||||
            module {
 | 
			
		||||
                single { config }
 | 
			
		||||
                single { config.plugins }
 | 
			
		||||
                single { config.database }
 | 
			
		||||
                single(named(defaultDatabaseParamsName)) { config.database.database }
 | 
			
		||||
                single { defaultJsonFormat }
 | 
			
		||||
                single(named(DefaultPlaguBotParamsKey)) { this@PlaguBot }
 | 
			
		||||
                setupDI(config.databaseConfig.database, json)
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
        GlobalContext.startKoin(koinApp)
 | 
			
		||||
        lateinit var behaviourContext: BehaviourContext
 | 
			
		||||
        bot.buildBehaviour(scope = scope) {
 | 
			
		||||
            invoke(config.database.database, json)
 | 
			
		||||
            behaviourContext = this
 | 
			
		||||
            setupBotPlugin(koinApp.koin)
 | 
			
		||||
            deleteWebhook()
 | 
			
		||||
        }
 | 
			
		||||
        GlobalContext.startKoin(koinApp)
 | 
			
		||||
        return bot.startGettingOfUpdatesByLongPolling(scope = behaviourContext, updatesFilter = behaviourContext)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
package dev.inmo.plagubot.config
 | 
			
		||||
 | 
			
		||||
import dev.inmo.plagubot.Plugin
 | 
			
		||||
import kotlinx.serialization.SerialName
 | 
			
		||||
import kotlinx.serialization.Serializable
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
data class Config(
 | 
			
		||||
    val botToken: String,
 | 
			
		||||
    val plugins: List<Plugin>,
 | 
			
		||||
    val database: DatabaseConfig = DatabaseConfig(),
 | 
			
		||||
    @SerialName("database")
 | 
			
		||||
    val databaseConfig: DatabaseConfig = DatabaseConfig(),
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,15 @@
 | 
			
		||||
package dev.inmo.plagubot.config
 | 
			
		||||
 | 
			
		||||
import dev.inmo.plagubot.Plugin
 | 
			
		||||
import kotlinx.serialization.Serializable
 | 
			
		||||
import kotlinx.serialization.Transient
 | 
			
		||||
import org.jetbrains.exposed.sql.Database
 | 
			
		||||
import org.jetbrains.exposed.sql.transactions.transactionManager
 | 
			
		||||
import org.koin.core.KoinApplication
 | 
			
		||||
import org.koin.core.context.loadKoinModules
 | 
			
		||||
import org.koin.core.qualifier.StringQualifier
 | 
			
		||||
import org.koin.core.qualifier.named
 | 
			
		||||
import org.koin.core.scope.Scope
 | 
			
		||||
import org.sqlite.JDBC
 | 
			
		||||
import java.sql.Connection
 | 
			
		||||
 | 
			
		||||
const val defaultDatabaseParamsName = "defaultDatabase"
 | 
			
		||||
inline val Plugin.database: Database?
 | 
			
		||||
    get() = getKoin().getOrNull<Database>(named(defaultDatabaseParamsName))
 | 
			
		||||
inline val Scope.database: Database?
 | 
			
		||||
    get() = getOrNull<Database>()
 | 
			
		||||
 | 
			
		||||
@Serializable
 | 
			
		||||
data class DatabaseConfig(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user