Compare commits

..

29 Commits
6.0.1 ... 7.3.0

Author SHA1 Message Date
439972e783 update dependencies 2023-11-05 20:52:30 +06:00
08907291c5 update dependencies 2023-11-05 19:34:43 +06:00
0f4819a83d start 7.3.0 2023-11-05 19:14:12 +06:00
7abdf18491 Merge pull request #86 from InsanusMokrassar/7.2.3
7.2.3
2023-10-11 15:31:46 +06:00
98a91ea357 update dependencies 2023-10-11 15:29:44 +06:00
934f603a8a 7.2.3 2023-10-11 15:23:23 +06:00
76e9cdae8d Merge pull request #85 from InsanusMokrassar/7.2.2
7.2.2
2023-10-01 15:59:58 +06:00
fbe166f2b4 get back koin dependency 2023-10-01 15:55:33 +06:00
30cf190461 conflicts resolvers customization 2023-10-01 15:28:00 +06:00
9d72d79321 start 7.2.2 2023-09-30 17:43:46 +06:00
33057dd2cb Merge pull request #84 from InsanusMokrassar/7.2.1
7.2.1
2023-09-29 22:58:51 +06:00
e1bb8e9799 update dependencies 2023-09-29 22:48:57 +06:00
fd5e979f11 start 7.2.1 2023-09-29 22:42:45 +06:00
20e1f042f1 Merge pull request #83 from InsanusMokrassar/7.2.0
7.2.0
2023-09-26 01:01:08 +06:00
0e65a425c3 Update CHANGELOG.md 2023-09-26 00:57:08 +06:00
517ab1e1a4 Update libs.versions.toml 2023-09-26 00:56:20 +06:00
977cf32669 update dependencies 2023-09-26 00:21:31 +06:00
5bd1916fb5 start 7.2.0 2023-09-26 00:11:41 +06:00
8c22b418f8 Merge pull request #82 from InsanusMokrassar/7.1.0
7.1.0
2023-08-20 14:41:16 +06:00
3663f987bc update dependencies 2023-08-20 14:38:05 +06:00
93d15af80d start 7.1.0 2023-08-20 14:35:29 +06:00
27c5f379a4 Merge pull request #81 from InsanusMokrassar/7.0.0
7.0.0
2023-07-01 16:20:14 +06:00
ae7a7b84ac fill changelog 2023-07-01 16:01:25 +06:00
5b98aef237 update dependencies 2023-07-01 15:52:08 +06:00
3755972394 start 7.0.0 2023-07-01 15:50:20 +06:00
5d5312c66f Merge pull request #80 from InsanusMokrassar/6.1.0
6.1.0
2023-06-19 23:27:16 +06:00
f79fef3dae update dependencies 2023-06-19 22:53:17 +06:00
2c8dc80eae start 6.1.0 2023-06-19 22:28:52 +06:00
a2a2fe7ef4 Merge pull request #79 from InsanusMokrassar/6.0.1
6.0.1
2023-06-03 21:36:06 +06:00
13 changed files with 177 additions and 26 deletions

View File

@@ -8,9 +8,9 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 11
java-version: 17
- name: Build with Gradle
run: ./gradlew build

View File

@@ -1,5 +1,59 @@
# Changelog
## 7.3.0
## 7.2.3
* `Versions`:
* `tgbotapi`: `9.2.2`
* `exposed`: `0.44.0`
* `koin`: `3.5.0`
* `ktor`: `2.3.5`
## 7.2.2
* `Bot`:
* Now you may customize both `onStart` and `onUpdate` conflicts resolvers
## 7.2.1
* `Versions`:
* `tgbotapi`: `9.2.1`
* `ktor`: `2.3.4`
## 7.2.0
* `Version`:
* `tgbotapi`: `9.2.0`
* `kslog`: `1.1.2`
* `sqlite`: `3.43.0.0`
## 7.1.0
* `Version`:
* `microutils`: `0.19.9`
* `tgbotapi`: `9.1.0`
* `ktor`: `2.3.3`
* `coroutines`: `1.7.3`
* `koin`: `3.4.3`
## 7.0.0
* `Version`:
* `microutils`: `0.19.7`
* `tgbotapi`: `9.0.0`
* `ktor`: `2.3.2`
* `coroutines`: `1.7.2`
## 6.1.0
* `Version`:
* `kotlin`: `1.8.22`
* `microutils`: `0.19.4`
* `tgbotapi`: `8.1.0`
* `koin`: `3.4.2`
* `sqlite`: `3.42.0.0`
## 6.0.1
* `Version`:

View File

@@ -2,6 +2,7 @@ plugins {
id 'org.jetbrains.kotlin.jvm'
id "org.jetbrains.kotlin.plugin.serialization"
id 'application'
id "com.google.devtools.ksp"
}
project.group="$group"
@@ -18,6 +19,7 @@ dependencies {
api libs.tgbotapi
api libs.tgbotapi.behaviourBuilder.fsm
api libs.microutils.repos.exposed
api libs.microutils.koin
api libs.kslog
api libs.sqlite
@@ -32,7 +34,10 @@ application {
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
ksp { // this generator do not require any arguments and we should left `ksp` empty
}

View File

@@ -2,11 +2,11 @@ apply plugin: 'maven-publish'
task javadocJar(type: Jar) {
from javadoc
classifier = 'javadoc'
archiveClassifier = 'javadoc'
}
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
archiveClassifier = 'sources'
}
publishing {
@@ -96,4 +96,27 @@ if (project.hasProperty("signing.gnupg.keyName")) {
dependsOn(it)
}
}
// Workaround to make android sign operations depend on signing tasks
project.getTasks().withType(AbstractPublishToMaven.class).configureEach {
def signingTasks = project.getTasks().withType(Sign.class)
mustRunAfter(signingTasks)
}
// Workaround to make test tasks use sign
project.getTasks().withType(Sign.class).configureEach { signTask ->
def withoutSign = (signTask.name.startsWith("sign") ? signTask.name.minus("sign") : signTask.name)
def pubName = withoutSign.endsWith("Publication") ? withoutSign.substring(0, withoutSign.length() - "Publication".length()) : withoutSign
// These tasks only exist for native targets, hence findByName() to avoid trying to find them for other targets
// Task ':linkDebugTest<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
def debugTestTask = tasks.findByName("linkDebugTest$pubName")
if (debugTestTask != null) {
signTask.mustRunAfter(debugTestTask)
}
// Task ':compileTestKotlin<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
def testTask = tasks.findByName("compileTestKotlin$pubName")
if (testTask != null) {
signTask.mustRunAfter(testTask)
}
}
}

View File

@@ -0,0 +1,16 @@
package dev.inmo.plagubot
import dev.inmo.micro_utils.fsm.common.State
fun interface OnStartContextsConflictResolver {
/**
* @param old Old state which is currently placed on the [State.context]
* @param new New state pretend to replace [old] one
* @return Should return:
*
* * Null in case when current realization unable to resolve conflict
* * False when current realization knows that [new] [State] must **not** replace [old] one
* * True when current realization knows that [new] [State] must replace [old] one
*/
suspend operator fun invoke(old: State, new: State): Boolean?
}

View File

@@ -0,0 +1,20 @@
package dev.inmo.plagubot
import dev.inmo.micro_utils.fsm.common.State
fun interface OnUpdateContextsConflictResolver {
/**
* This method will be called when [sourceStateWithOldContext] [State.context] and [newStateWithNewContext] are not equal and currently there is
* launched [currentStateOnNewContext] state on the chain with [State.context] from [currentStateOnNewContext]
*
* @param sourceStateWithOldContext Old state where from [newStateWithNewContext] came
* @param newStateWithNewContext New state with changing [State.context] (it is different with [sourceStateWithOldContext] [State.context])
* @param currentStateOnNewContext State which is currently running on [newStateWithNewContext] [State.context]
* @return Should return:
*
* * Null in case when current realization unable to resolve conflict
* * False when [currentStateOnNewContext] **should not** be stopped in favor to [newStateWithNewContext]
* * True when [currentStateOnNewContext] **should** be stopped in favor to [newStateWithNewContext]
*/
suspend operator fun invoke(sourceStateWithOldContext: State, newStateWithNewContext: State, currentStateOnNewContext: State): Boolean?
}

View File

@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.coroutines.runCatchingSafely
import dev.inmo.micro_utils.fsm.common.State
import dev.inmo.micro_utils.fsm.common.StatesManager
import dev.inmo.micro_utils.fsm.common.managers.*
import dev.inmo.micro_utils.koin.getAllDistinct
import dev.inmo.plagubot.config.*
import dev.inmo.tgbotapi.bot.ktor.telegramBot
import dev.inmo.tgbotapi.extensions.api.webhook.deleteWebhook
@@ -94,6 +95,8 @@ data class PlaguBot(
GlobalContext.startKoin(koinApp)
logger.i("Koin started")
lateinit var behaviourContext: BehaviourContext
val onStartContextsConflictResolver by lazy { koinApp.koin.getAllDistinct<OnStartContextsConflictResolver>() }
val onUpdateContextsConflictResolver by lazy { koinApp.koin.getAllDistinct<OnUpdateContextsConflictResolver>() }
bot.buildBehaviourWithFSM(
scope = scope,
defaultExceptionsHandler = {
@@ -101,7 +104,8 @@ data class PlaguBot(
},
statesManager = koinApp.koin.getOrNull<StatesManager<State>>() ?: DefaultStatesManager(
koinApp.koin.getOrNull<DefaultStatesManagerRepo<State>>() ?: InMemoryDefaultStatesManagerRepo<State>(),
onStartContextsConflictResolver = { _, _ -> false }
onStartContextsConflictResolver = { old, new -> onStartContextsConflictResolver.firstNotNullOfOrNull { it(old, new) } ?: false },
onUpdateContextsConflictResolver = { old, new, currentNew -> onUpdateContextsConflictResolver.firstNotNullOfOrNull { it(old, new, currentNew) } ?: false }
),
onStateHandlingErrorHandler = koinApp.koin.getOrNull<StateHandlingErrorHandler<State>>() ?: { state, e ->
logger.eS(e) { "Unable to handle state $state" }

View File

@@ -8,6 +8,7 @@ buildscript {
classpath libs.buildscript.kt.gradle
classpath libs.buildscript.kt.serialization
classpath libs.buildscript.gh.release
classpath libs.buildscript.ksp
}
}

View File

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

View File

@@ -1,26 +1,28 @@
[versions]
kt = "1.8.21"
kt-serialization = "1.5.1"
kt-coroutines = "1.6.4"
kt = "1.9.20"
kt-serialization = "1.6.0"
kt-coroutines = "1.7.3"
microutils = "0.19.2"
tgbotapi = "8.0.1"
kslog = "1.1.1"
microutils = "0.20.12"
tgbotapi = "9.3.0"
kslog = "1.2.3"
jb-exposed = "0.41.1"
jb-dokka = "1.8.10"
ksp = "1.9.20-1.0.14"
sqlite = "3.41.2.1"
jb-exposed = "0.44.1"
jb-dokka = "1.9.10"
klock = "4.0.3"
uuid = "0.7.1"
sqlite = "3.43.0.0"
ktor = "2.3.1"
klock = "4.0.10"
uuid = "0.8.1"
ktor = "2.3.5"
gh-release = "2.4.1"
koin = "3.4.1"
koin = "3.5.0"
[libraries]
@@ -32,6 +34,8 @@ kt-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json"
tgbotapi = { module = "dev.inmo:tgbotapi", version.ref = "tgbotapi" }
tgbotapi-behaviourBuilder-fsm = { module = "dev.inmo:tgbotapi.behaviour_builder.fsm", version.ref = "tgbotapi" }
microutils-repos-exposed = { module = "dev.inmo:micro_utils.repos.exposed", version.ref = "microutils" }
microutils-koin = { module = "dev.inmo:micro_utils.koin", version.ref = "microutils" }
microutils-koin-generator = { module = "dev.inmo:micro_utils.koin.generator", version.ref = "microutils" }
kslog = { module = "dev.inmo:kslog", version.ref = "kslog" }
koin = { module = "io.insert-koin:koin-core", version.ref = "koin" }
@@ -48,3 +52,4 @@ buildscript-kt-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin",
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" }
buildscript-ksp = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "ksp" }

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -19,6 +19,6 @@ dependencies {
}
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

View File

@@ -2,11 +2,11 @@ apply plugin: 'maven-publish'
task javadocJar(type: Jar) {
from javadoc
classifier = 'javadoc'
archiveClassifier = 'javadoc'
}
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
archiveClassifier = 'sources'
}
publishing {
@@ -96,4 +96,27 @@ if (project.hasProperty("signing.gnupg.keyName")) {
dependsOn(it)
}
}
// Workaround to make android sign operations depend on signing tasks
project.getTasks().withType(AbstractPublishToMaven.class).configureEach {
def signingTasks = project.getTasks().withType(Sign.class)
mustRunAfter(signingTasks)
}
// Workaround to make test tasks use sign
project.getTasks().withType(Sign.class).configureEach { signTask ->
def withoutSign = (signTask.name.startsWith("sign") ? signTask.name.minus("sign") : signTask.name)
def pubName = withoutSign.endsWith("Publication") ? withoutSign.substring(0, withoutSign.length() - "Publication".length()) : withoutSign
// These tasks only exist for native targets, hence findByName() to avoid trying to find them for other targets
// Task ':linkDebugTest<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
def debugTestTask = tasks.findByName("linkDebugTest$pubName")
if (debugTestTask != null) {
signTask.mustRunAfter(debugTestTask)
}
// Task ':compileTestKotlin<platform>' uses this output of task ':sign<platform>Publication' without declaring an explicit or implicit dependency
def testTask = tasks.findByName("compileTestKotlin$pubName")
if (testTask != null) {
signTask.mustRunAfter(testTask)
}
}
}