Compare commits

...

22 Commits

Author SHA1 Message Date
f8161c34a7 update dependencies 2022-09-15 20:07:23 +06:00
6fe333e437 start 2.3.2 2022-09-15 20:05:31 +06:00
5806fa1c31 Merge pull request #45 from InsanusMokrassar/2.3.1
2.3.1
2022-09-09 13:44:37 +06:00
2ff712327f Update CHANGELOG.md 2022-09-09 04:22:56 +06:00
72e8e35e3f Update libs.versions.toml 2022-09-09 04:20:09 +06:00
030f9546f2 Update gradle.properties 2022-09-09 04:18:05 +06:00
1b3c479766 Merge pull request #44 from InsanusMokrassar/2.3.0
2.3.0
2022-09-04 16:10:09 +06:00
dcfb66ef6c fixes 2022-09-04 15:57:40 +06:00
763718716d improve reconnect feature 2022-09-04 15:07:30 +06:00
dfbc7be6f2 add option waitForConnection in database config 2022-09-04 14:37:44 +06:00
ab0578b312 start 2.3.0 2022-09-04 14:31:46 +06:00
7b502e073d Merge pull request #43 from InsanusMokrassar/2.2.0
2.2.0
2022-08-27 13:47:59 +06:00
137a6c1c26 update dependencies 2022-08-27 13:45:26 +06:00
74f1ad496e start 2.2.0 2022-08-27 13:43:51 +06:00
e4a1e1f0be Merge pull request #42 from InsanusMokrassar/2.1.1
2.1.1
2022-08-20 22:30:51 +06:00
7286cf401b make it possible to get bot from DI 2022-08-20 22:10:08 +06:00
cdf94ec2eb start 2.1.1 2022-08-20 22:08:13 +06:00
5bfabfa284 Merge pull request #41 from InsanusMokrassar/2.1.0
2.1.0
2022-08-18 12:43:39 +06:00
ec2852beb0 complete with including of FSM 2022-08-18 12:42:34 +06:00
6c2cfbf06f a little upgrade of hello plugin 2022-08-18 12:27:11 +06:00
caa028b799 Update CHANGELOG.md 2022-08-17 09:55:54 +06:00
53667fa8b8 Update libs.versions.toml 2022-08-16 00:50:12 +06:00
8 changed files with 113 additions and 26 deletions

View File

@@ -1,11 +1,48 @@
# Changelog # Changelog
## 2.3.2
* `Versions`:
* `tgbotapi`: `3.2.3`
* `microutils`: `0.12.13`
* `kslog`: `0.5.2`
## 2.3.1
* `Versions`:
* `klock`: `3.1.0`
* `tgbotapi`: `3.2.1`
* `microutils`: `0.12.11`
* `ktor`: `2.1.1`
## 2.3.0
* `Bot`:
* Add option `reconnectOptions` in database config
## 2.2.0
* `Versions`:
* `serialization`: `1.4.0`
* `tgbotapi`: `3.2.0`
* `microutils`: `0.12.4`
* `kslog`: `0.5.1`
## 2.1.1
* `Bot`:
* Now it is possible to get bot from `koin`
## 2.1.0 ## 2.1.0
* `Versions`: * `Versions`:
* `tgbotapi`: `3.1.0` * `tgbotapi`: `3.1.1`
* `ktor`: `2.1.0` * `ktor`: `2.1.0`
* `microutils`: `0.12.1` * `microutils`: `0.12.1`
* `Plugins`:
* New fum of `Plugin` with `BehaviourContextWithFSM` receiver
* `Bot`:
* Now bot uses `buildBehaviourWithFSM` to be able to setup bot with FSM
## 2.0.0 ## 2.0.0

View File

@@ -5,10 +5,14 @@ import dev.inmo.micro_utils.fsm.common.State
import dev.inmo.plagubot.HelloPlugin.setupBotPlugin import dev.inmo.plagubot.HelloPlugin.setupBotPlugin
import dev.inmo.tgbotapi.extensions.api.bot.getMe import dev.inmo.tgbotapi.extensions.api.bot.getMe
import dev.inmo.tgbotapi.extensions.api.send.reply import dev.inmo.tgbotapi.extensions.api.send.reply
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.api.send.sendMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextWithFSM import dev.inmo.tgbotapi.extensions.behaviour_builder.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitText
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitTextMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUnhandledCommand import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUnhandledCommand
import dev.inmo.tgbotapi.types.ChatId
import kotlinx.coroutines.flow.first
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
@@ -28,14 +32,34 @@ object HelloPlugin : Plugin {
override fun Module.setupDI(database: Database, params: JsonObject) { override fun Module.setupDI(database: Database, params: JsonObject) {
single { single {
get<Json>().decodeFromJsonElement(HelloPluginConfig.serializer(), params["helloPlugin"] ?: return@single null) get<Json>().decodeFromJsonElement(HelloPluginConfig.serializer(), params["helloPlugin"] ?: return@single null)
} }
} }
override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) { private sealed interface InternalFSMState : State {
logger.d { koin.get<HelloPluginConfig>().print } override val context: ChatId
data class DidntSaidHello(override val context: ChatId) : InternalFSMState
data class SaidHelloOnce(override val context: ChatId) : InternalFSMState
}
override suspend fun BehaviourContextWithFSM<State>.setupBotPlugin(koin: Koin) {
val toPrint = koin.getOrNull<HelloPluginConfig>() ?.print ?: "Hello :)"
logger.d { toPrint }
logger.dS { getMe().toString() } logger.dS { getMe().toString() }
onCommand("hello_world") { onCommand("hello_world") {
reply(it, "Hello :)") startChain(InternalFSMState.DidntSaidHello(it.chat.id))
}
strictlyOn { state: InternalFSMState.DidntSaidHello ->
sendMessage(state.context, toPrint)
InternalFSMState.SaidHelloOnce(state.context)
}
strictlyOn { state: InternalFSMState.SaidHelloOnce ->
val message = waitTextMessage().first()
reply(message, "Sorry, I can answer only this: $toPrint")
InternalFSMState.SaidHelloOnce(state.context)
} }
} }
} }

View File

@@ -5,8 +5,7 @@ import dev.inmo.micro_utils.common.Warning
import dev.inmo.micro_utils.coroutines.runCatchingSafely import dev.inmo.micro_utils.coroutines.runCatchingSafely
import dev.inmo.micro_utils.fsm.common.State import dev.inmo.micro_utils.fsm.common.State
import dev.inmo.micro_utils.fsm.common.StatesManager 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.*
import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo
import dev.inmo.plagubot.config.* 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.webhook.deleteWebhook import dev.inmo.tgbotapi.extensions.api.webhook.deleteWebhook
@@ -46,6 +45,7 @@ data class PlaguBot(
single { config.databaseConfig.database } single { config.databaseConfig.database }
single { defaultJsonFormat } single { defaultJsonFormat }
single { this@PlaguBot } single { this@PlaguBot }
single { bot }
includes( includes(
config.plugins.mapNotNull { config.plugins.mapNotNull {
@@ -102,7 +102,8 @@ data class PlaguBot(
logger.e("Something went wrong", it) logger.e("Something went wrong", it)
}, },
statesManager = koinApp.koin.getOrNull<StatesManager<State>>() ?: DefaultStatesManager( statesManager = koinApp.koin.getOrNull<StatesManager<State>>() ?: DefaultStatesManager(
InMemoryDefaultStatesManagerRepo<State>() koinApp.koin.getOrNull<DefaultStatesManagerRepo<State>>() ?: InMemoryDefaultStatesManagerRepo<State>(),
onStartContextsConflictResolver = { _, _ -> false }
), ),
onStateHandlingErrorHandler = koinApp.koin.getOrNull<StateHandlingErrorHandler<State>>() ?: { state, e -> onStateHandlingErrorHandler = koinApp.koin.getOrNull<StateHandlingErrorHandler<State>>() ?: { state, e ->
logger.eS(e) { "Unable to handle state $state" } logger.eS(e) { "Unable to handle state $state" }

View File

@@ -0,0 +1,9 @@
package dev.inmo.plagubot.config
import kotlinx.serialization.Serializable
@Serializable
data class DBConnectOptions(
val attempts: Int = 3,
val delay: Long = 1000L
)

View File

@@ -1,11 +1,15 @@
package dev.inmo.plagubot.config package dev.inmo.plagubot.config
import dev.inmo.kslog.common.e
import dev.inmo.kslog.common.logger
import kotlinx.coroutines.delay
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient import kotlinx.serialization.Transient
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.transactions.transactionManager import org.jetbrains.exposed.sql.transactions.transactionManager
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.sqlite.JDBC import org.sqlite.JDBC
import java.lang.Exception
import java.sql.Connection import java.sql.Connection
inline val Scope.database: Database? inline val Scope.database: Database?
@@ -16,15 +20,24 @@ data class DatabaseConfig(
val url: String = "jdbc:sqlite:file:test?mode=memory&cache=shared", val url: String = "jdbc:sqlite:file:test?mode=memory&cache=shared",
val driver: String = JDBC::class.qualifiedName!!, val driver: String = JDBC::class.qualifiedName!!,
val username: String = "", val username: String = "",
val password: String = "" val password: String = "",
val reconnectOptions: DBConnectOptions? = DBConnectOptions()
) { ) {
@Transient @Transient
val database: Database = Database.connect( val database: Database = (0 until (reconnectOptions ?.attempts ?: 1)).firstNotNullOfOrNull {
url, runCatching {
driver, Database.connect(
username, url,
password driver,
).also { username,
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED password
} ).also {
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED
it.connector().close()
}
}.onFailure {
logger.e(it)
Thread.sleep(reconnectOptions ?.delay ?: return@onFailure)
}.getOrNull()
} ?: error("Unable to create database")
} }

View File

@@ -5,4 +5,4 @@ kotlin.js.generate.externals=true
kotlin.incremental=true kotlin.incremental=true
group=dev.inmo group=dev.inmo
version=2.1.0 version=2.3.2

View File

@@ -1,22 +1,22 @@
[versions] [versions]
kt = "1.7.10" kt = "1.7.10"
kt-serialization = "1.4.0-RC" kt-serialization = "1.4.0"
kt-coroutines = "1.6.4" kt-coroutines = "1.6.4"
microutils = "0.12.1" microutils = "0.12.13"
tgbotapi = "3.1.0" tgbotapi = "3.2.3"
kslog = "0.5.0" kslog = "0.5.2"
jb-exposed = "0.39.2" jb-exposed = "0.39.2"
jb-dokka = "1.7.10" jb-dokka = "1.7.10"
sqlite = "3.36.0.3" sqlite = "3.36.0.3"
klock = "3.0.0" klock = "3.1.0"
uuid = "0.5.0" uuid = "0.5.0"
ktor = "2.1.0" ktor = "2.1.1"
gh-release = "2.4.1" gh-release = "2.4.1"

View File

@@ -4,7 +4,10 @@
"driver": "org.sqlite.JDBC", "driver": "org.sqlite.JDBC",
"username": "OPTIONAL username", "username": "OPTIONAL username",
"password": "OPTIONAL password", "password": "OPTIONAL password",
"initAutomatically": false "reconnectOptions": {
"attempts": 3,
"delay": 1000
}
}, },
"botToken": "1234567890:ABCDEFGHIJKLMNOP_qrstuvwxyz12345678", "botToken": "1234567890:ABCDEFGHIJKLMNOP_qrstuvwxyz12345678",
"plugins": [ "plugins": [