From 7549286c842cf3cfba58d161587cb31b059f03db Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 9 Sep 2022 18:01:50 +0600 Subject: [PATCH] fixes --- .../commonMain/kotlin/DateTimeSerializer.kt | 11 +++++- .../kotlin/exposed/ExposedPostsRepo.kt | 4 +-- .../src/commonMain/kotlin/DefaultSelector.kt | 6 ++-- .../commonMain/kotlin/models/RatingConfig.kt | 36 ++++++++++++------- .../kotlin/models/SelectorConfigItem.kt | 2 +- ratings/selector/src/jvmMain/kotlin/Plugin.kt | 2 +- runner/build.gradle | 1 + 7 files changed, 41 insertions(+), 21 deletions(-) diff --git a/common/src/commonMain/kotlin/DateTimeSerializer.kt b/common/src/commonMain/kotlin/DateTimeSerializer.kt index 4597d3d..13c701e 100644 --- a/common/src/commonMain/kotlin/DateTimeSerializer.kt +++ b/common/src/commonMain/kotlin/DateTimeSerializer.kt @@ -1,7 +1,16 @@ package dev.inmo.plaguposter.common import com.soywiz.klock.DateTime +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(DateTime::class) -object DateTimeSerializer +object DateTimeSerializer : KSerializer { + override val descriptor: SerialDescriptor = Double.serializer().descriptor + override fun deserialize(decoder: Decoder): DateTime = DateTime(decoder.decodeDouble()) + override fun serialize(encoder: Encoder, value: DateTime) = encoder.encodeDouble(value.unixMillis) +} diff --git a/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt b/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt index 91f9462..036d40e 100644 --- a/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt +++ b/posts/src/jvmMain/kotlin/exposed/ExposedPostsRepo.kt @@ -22,9 +22,7 @@ class ExposedPostsRepo( tableName = "posts" ) { val idColumn = text("id").clientDefault { uuid4().toString() } - val createdColumn = double("datetime").default(0.0).clientDefault { - DateTime.nowUnix() - } + val createdColumn = double("datetime").default(0.0) private val contentRepo by lazy { ExposedContentInfoRepo( diff --git a/ratings/selector/src/commonMain/kotlin/DefaultSelector.kt b/ratings/selector/src/commonMain/kotlin/DefaultSelector.kt index 02b52ca..75bad45 100644 --- a/ratings/selector/src/commonMain/kotlin/DefaultSelector.kt +++ b/ratings/selector/src/commonMain/kotlin/DefaultSelector.kt @@ -2,18 +2,20 @@ package dev.inmo.plaguposter.ratings.selector import com.soywiz.klock.DateTime import dev.inmo.plaguposter.posts.models.PostId +import dev.inmo.plaguposter.posts.repo.PostsRepo import dev.inmo.plaguposter.ratings.repo.RatingsRepo import dev.inmo.plaguposter.ratings.selector.models.SelectorConfig class DefaultSelector ( private val config: SelectorConfig, - private val repo: RatingsRepo + private val ratingsRepo: RatingsRepo, + private val postsRepo: PostsRepo ) : Selector { override suspend fun take(n: Int, now: DateTime): List { val result = mutableListOf() do { - val selected = config.active(now.time) ?.ratings ?.select(repo, result) ?: break + val selected = config.active(now.time) ?.rating ?.select(ratingsRepo, postsRepo, result, now) ?: break result.add(selected) } while (result.size < n) diff --git a/ratings/selector/src/commonMain/kotlin/models/RatingConfig.kt b/ratings/selector/src/commonMain/kotlin/models/RatingConfig.kt index f024e35..3373b0b 100644 --- a/ratings/selector/src/commonMain/kotlin/models/RatingConfig.kt +++ b/ratings/selector/src/commonMain/kotlin/models/RatingConfig.kt @@ -1,28 +1,41 @@ package dev.inmo.plaguposter.ratings.selector.models +import com.soywiz.klock.DateTime +import com.soywiz.klock.seconds import dev.inmo.micro_utils.pagination.FirstPagePagination import dev.inmo.micro_utils.pagination.Pagination +import dev.inmo.micro_utils.pagination.utils.getAllByWithNextPaging +import dev.inmo.micro_utils.repos.pagination.getAll +import dev.inmo.plaguposter.common.DateTimeSerializer import dev.inmo.plaguposter.posts.models.PostId +import dev.inmo.plaguposter.posts.repo.PostsRepo import dev.inmo.plaguposter.ratings.models.Rating import dev.inmo.plaguposter.ratings.repo.RatingsRepo +import dev.inmo.tgbotapi.types.Seconds import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.serializer import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import kotlin.random.Random @Serializable data class RatingConfig( val min: Rating?, val max: Rating?, val prefer: Prefer, - val otherwise: RatingConfig? = null + val otherwise: RatingConfig? = null, + val postAge: Seconds? = null ) { - suspend fun select(repo: RatingsRepo, exclude: List): PostId? { + suspend fun select( + ratingsRepo: RatingsRepo, + postsRepo: PostsRepo, + exclude: List, + now: DateTime + ): PostId? { var reversed: Boolean = false var count: Int? = null + val allowedCreationTime = now - (postAge ?: 0).seconds when (prefer) { Prefer.Max -> { @@ -43,35 +56,32 @@ data class RatingConfig( null -> { when (max) { null -> { - repo.keys( - count ?.let { Pagination(0, it) } ?: FirstPagePagination(repo.count().toInt()), - reversed - ).results.filterNot { - it in exclude - } + ratingsRepo.getAllByWithNextPaging { keys(it) } } else -> { - repo.getPostsWithRatingLessEq(max, exclude = exclude).keys + ratingsRepo.getPostsWithRatingLessEq(max, exclude = exclude).keys } } } else -> { when (max) { null -> { - repo.getPostsWithRatingGreaterEq(min, exclude = exclude).keys + ratingsRepo.getPostsWithRatingGreaterEq(min, exclude = exclude).keys } else -> { - repo.getPosts(min .. max, reversed, count, exclude = exclude).keys + ratingsRepo.getPosts(min .. max, reversed, count, exclude = exclude).keys } } } + }.filter { + it !in exclude && (postsRepo.getPostCreationTime(it) ?.let { it < allowedCreationTime } ?: true) } return when (prefer) { Prefer.Max, Prefer.Min -> posts.firstOrNull() Prefer.Random -> posts.randomOrNull() - } ?: otherwise ?.select(repo, exclude) + } ?: otherwise ?.select(ratingsRepo, postsRepo, exclude, now) } @Serializable(Prefer.Serializer::class) diff --git a/ratings/selector/src/commonMain/kotlin/models/SelectorConfigItem.kt b/ratings/selector/src/commonMain/kotlin/models/SelectorConfigItem.kt index fc95497..2fa5bff 100644 --- a/ratings/selector/src/commonMain/kotlin/models/SelectorConfigItem.kt +++ b/ratings/selector/src/commonMain/kotlin/models/SelectorConfigItem.kt @@ -5,5 +5,5 @@ import kotlinx.serialization.Serializable @Serializable data class SelectorConfigItem( val time: TimeConfig, - val ratings: RatingConfig + val rating: RatingConfig ) diff --git a/ratings/selector/src/jvmMain/kotlin/Plugin.kt b/ratings/selector/src/jvmMain/kotlin/Plugin.kt index 62f2ad9..da75edb 100644 --- a/ratings/selector/src/jvmMain/kotlin/Plugin.kt +++ b/ratings/selector/src/jvmMain/kotlin/Plugin.kt @@ -9,6 +9,6 @@ import org.koin.core.module.Module object Plugin : Plugin { override fun Module.setupDI(database: Database, params: JsonObject) { single { get().decodeFromJsonElement(SelectorConfig.serializer(), params["selector"] ?: return@single null) } - single { DefaultSelector(get(), get()) } + single { DefaultSelector(get(), get(), get()) } } } diff --git a/runner/build.gradle b/runner/build.gradle index 3dbcdb0..2598c11 100644 --- a/runner/build.gradle +++ b/runner/build.gradle @@ -13,6 +13,7 @@ dependencies { api project(":plaguposter.posts") api project(":plaguposter.posts_registrar") api project(":plaguposter.triggers.command") + api project(":plaguposter.triggers.selector_with_timer") api project(":plaguposter.ratings") api project(":plaguposter.ratings.source") api project(":plaguposter.ratings.selector")