mirror of
https://github.com/InsanusMokrassar/PlaguPoster.git
synced 2025-12-05 20:45:40 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ce202a5f6 | |||
| 077f8c30a6 | |||
| 1e9559a2c9 | |||
| feef8efee1 | |||
| 54eb7515d3 | |||
| 1bb12bee0e | |||
| 467525e48d | |||
| 29e5a04135 | |||
| 6eb43055a7 | |||
| 57eebb61d5 | |||
| 87957dba30 | |||
| 20148c02f0 | |||
| e17cfa1c7c | |||
| 0a5ffee808 | |||
| 847b285ce3 |
46
CHANGELOG.md
46
CHANGELOG.md
@@ -1,5 +1,51 @@
|
||||
# PlaguPoster
|
||||
|
||||
## 0.3.0
|
||||
|
||||
* `Versions`:
|
||||
* `tgbotapi`: `9.1.0`
|
||||
* `plagubot`: `7.1.0`
|
||||
* `plagubot-plugins`: `0.14.0`
|
||||
|
||||
## 0.2.3
|
||||
|
||||
* Add opportunity to use several target chat ids
|
||||
* Update dependencies
|
||||
|
||||
## 0.2.2
|
||||
|
||||
* `GarbageCollector`:
|
||||
* Now on start will all clearing job done
|
||||
|
||||
## 0.2.1
|
||||
|
||||
* `Versions`:
|
||||
* `kotlin`: `1.8.21`
|
||||
* `tgbotapi`: `7.1.2`
|
||||
* `plagubot`: `5.1.2`
|
||||
* `microutils`: `0.18.1`
|
||||
* `kslog`: `1.1.1`
|
||||
* `plagubot.plugins`: `0.11.2`
|
||||
* `psql`: `42.6.0`
|
||||
|
||||
## 0.2.0
|
||||
|
||||
* `Versions`:
|
||||
* `tgbotapi`: `7.1.0`
|
||||
* `plagubot`: `5.1.0`
|
||||
* `krontab`: `1.0.0`
|
||||
* `plagubot.plugins`: `0.11.0`
|
||||
|
||||
## 0.1.2
|
||||
|
||||
* `Versions`:
|
||||
* `kotlin`: `1.8.20`
|
||||
* `plagubot`: `5.0.2`
|
||||
* `microutils`: `0.17.8`
|
||||
* `kslog`: `1.1.1`
|
||||
* `plagubot.plugins`: `0.10.2`
|
||||
* `psql`: `42.6.0`
|
||||
|
||||
## 0.1.1
|
||||
|
||||
* Update dependencies
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package dev.inmo.plaguposter.common
|
||||
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.FullChatIdentifierSerializer
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import kotlinx.serialization.SerialName
|
||||
@@ -10,14 +9,26 @@ import kotlinx.serialization.Serializable
|
||||
data class ChatConfig(
|
||||
@SerialName("targetChat")
|
||||
@Serializable(FullChatIdentifierSerializer::class)
|
||||
val targetChatId: IdChatIdentifier,
|
||||
val targetChatId: IdChatIdentifier? = null,
|
||||
@SerialName("sourceChat")
|
||||
@Serializable(FullChatIdentifierSerializer::class)
|
||||
val sourceChatId: IdChatIdentifier,
|
||||
@SerialName("cacheChat")
|
||||
@Serializable(FullChatIdentifierSerializer::class)
|
||||
val cacheChatId: IdChatIdentifier
|
||||
val cacheChatId: IdChatIdentifier,
|
||||
@SerialName("targetChats")
|
||||
val targetChatIds: List<@Serializable(FullChatIdentifierSerializer::class) IdChatIdentifier> = emptyList(),
|
||||
) {
|
||||
val allTargetChatIds by lazy {
|
||||
listOfNotNull(targetChatId) + targetChatIds
|
||||
}
|
||||
|
||||
init {
|
||||
require(targetChatId != null || targetChatIds.isNotEmpty()) {
|
||||
"One of fields, 'targetChat' or 'targetChats' should be presented"
|
||||
}
|
||||
}
|
||||
|
||||
fun check(chatId: IdChatIdentifier) = when (chatId) {
|
||||
targetChatId,
|
||||
sourceChatId,
|
||||
|
||||
@@ -2,13 +2,14 @@ package dev.inmo.plaguposter.common
|
||||
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.CommonMessageFilterExcludeMediaGroups
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
||||
import dev.inmo.tgbotapi.extensions.utils.contentMessageOrNull
|
||||
import dev.inmo.tgbotapi.extensions.utils.textContentOrNull
|
||||
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
|
||||
import dev.inmo.tgbotapi.types.BotCommand
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.*
|
||||
import dev.inmo.tgbotapi.types.message.content.TextContent
|
||||
import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource
|
||||
|
||||
val FirstSourceIsCommandsFilter = SimpleFilter<Message> {
|
||||
it is ContentMessage<*> && it.content.textContentOrNull() ?.textSources ?.firstOrNull {
|
||||
it is BotCommandTextSource
|
||||
} != null
|
||||
it.contentMessageOrNull() ?.withContentOrNull<TextContent>() ?.content ?.textSources ?.firstOrNull() is BotCommandTextSource
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.common
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.Serializer
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package dev.inmo.plaguposter.common
|
||||
|
||||
import dev.inmo.kslog.common.i
|
||||
import dev.inmo.kslog.common.iS
|
||||
import dev.inmo.kslog.common.logger
|
||||
import dev.inmo.plagubot.Plugin
|
||||
@@ -27,7 +26,7 @@ object CommonPlugin : Plugin {
|
||||
override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
|
||||
val config = koin.get<ChatConfig>()
|
||||
|
||||
Log.iS { "Target chat info: ${getChat(config.targetChatId)}" }
|
||||
Log.iS { "Target chats info: ${config.allTargetChatIds.map { getChat(it) }.joinToString()}" }
|
||||
Log.iS { "Source chat info: ${getChat(config.sourceChatId)}" }
|
||||
Log.iS { "Cache chat info: ${getChat(config.cacheChatId)}" }
|
||||
}
|
||||
|
||||
@@ -10,4 +10,4 @@ android.enableJetifier=true
|
||||
# Project data
|
||||
|
||||
group=dev.inmo
|
||||
version=0.1.1
|
||||
version=0.3.0
|
||||
|
||||
@@ -1,19 +1,18 @@
|
||||
[versions]
|
||||
|
||||
kotlin = "1.8.10"
|
||||
kotlin-serialization = "1.5.0"
|
||||
kotlin = "1.8.22"
|
||||
kotlin-serialization = "1.5.1"
|
||||
|
||||
plagubot = "5.0.1"
|
||||
tgbotapi = "7.0.1"
|
||||
microutils = "0.17.5"
|
||||
kslog = "1.0.0"
|
||||
krontab = "0.10.0"
|
||||
tgbotapi-libraries = "0.10.1"
|
||||
plagubot-plugins = "0.10.1"
|
||||
plagubot = "7.1.0"
|
||||
tgbotapi = "9.1.0"
|
||||
microutils = "0.19.9"
|
||||
kslog = "1.1.2"
|
||||
krontab = "2.1.2"
|
||||
plagubot-plugins = "0.14.0"
|
||||
|
||||
dokka = "1.8.10"
|
||||
dokka = "1.8.20"
|
||||
|
||||
psql = "42.5.0"
|
||||
psql = "42.6.0"
|
||||
|
||||
[libraries]
|
||||
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.posts.models
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.plaguposter.common.DateTimeSerializer
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.posts.repo
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||
import dev.inmo.plaguposter.posts.models.*
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
|
||||
@@ -18,7 +18,7 @@ class PostPublisher(
|
||||
private val bot: TelegramBot,
|
||||
private val postsRepo: PostsRepo,
|
||||
private val cachingChatId: IdChatIdentifier,
|
||||
private val targetChatId: IdChatIdentifier,
|
||||
private val targetChatIds: List<IdChatIdentifier>,
|
||||
private val deleteAfterPosting: Boolean = true
|
||||
) {
|
||||
suspend fun publish(postId: PostId) {
|
||||
@@ -38,17 +38,19 @@ class PostPublisher(
|
||||
|
||||
sortedMessagesContents.forEach { (_, contents) ->
|
||||
contents.singleOrNull() ?.also {
|
||||
runCatching {
|
||||
bot.copyMessage(targetChatId, it.chatId, it.messageId)
|
||||
}.onFailure { _ ->
|
||||
targetChatIds.forEach { targetChatId ->
|
||||
runCatching {
|
||||
bot.forwardMessage(
|
||||
it.chatId,
|
||||
targetChatId,
|
||||
it.messageId
|
||||
)
|
||||
}.onSuccess {
|
||||
bot.copyMessage(targetChatId, it)
|
||||
bot.copyMessage(targetChatId, it.chatId, it.messageId)
|
||||
}.onFailure { _ ->
|
||||
runCatching {
|
||||
bot.forwardMessage(
|
||||
it.chatId,
|
||||
targetChatId,
|
||||
it.messageId
|
||||
)
|
||||
}.onSuccess {
|
||||
bot.copyMessage(targetChatId, it)
|
||||
}
|
||||
}
|
||||
}
|
||||
return@forEach
|
||||
@@ -57,17 +59,23 @@ class PostPublisher(
|
||||
it.order to (bot.forwardMessage(toChatId = cachingChatId, fromChatId = it.chatId, messageId = it.messageId).contentMessageOrNull() ?: return@mapNotNull null)
|
||||
}.sortedBy { it.first }.mapNotNull { (_, forwardedMessage) ->
|
||||
forwardedMessage.withContentOrNull<MediaGroupPartContent>() ?: null.also { _ ->
|
||||
bot.copyMessage(targetChatId, forwardedMessage)
|
||||
targetChatIds.forEach { targetChatId ->
|
||||
bot.copyMessage(targetChatId, forwardedMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
resultContents.singleOrNull() ?.also {
|
||||
bot.copyMessage(targetChatId, it)
|
||||
targetChatIds.forEach { targetChatId ->
|
||||
bot.copyMessage(targetChatId, it)
|
||||
}
|
||||
return@forEach
|
||||
} ?: resultContents.chunked(mediaCountInMediaGroup.last).forEach {
|
||||
bot.send(
|
||||
targetChatId,
|
||||
it.map { it.content.toMediaGroupMemberTelegramMedia() }
|
||||
)
|
||||
targetChatIds.forEach { targetChatId ->
|
||||
bot.send(
|
||||
targetChatId,
|
||||
it.map { it.content.toMediaGroupMemberTelegramMedia() }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,6 @@ import kotlinx.serialization.json.*
|
||||
import org.jetbrains.exposed.sql.Database
|
||||
import org.koin.core.Koin
|
||||
import org.koin.core.module.Module
|
||||
import org.koin.dsl.binds
|
||||
|
||||
object Plugin : Plugin {
|
||||
@Serializable
|
||||
@@ -59,7 +58,7 @@ object Plugin : Plugin {
|
||||
}
|
||||
single {
|
||||
val config = get<Config>()
|
||||
PostPublisher(get(), get(), config.chats.cacheChatId, config.chats.targetChatId, config.deleteAfterPublishing)
|
||||
PostPublisher(get(), get(), config.chats.cacheChatId, config.chats.allTargetChatIds, config.deleteAfterPublishing)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.posts.cached
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.pagination.FirstPagePagination
|
||||
import dev.inmo.micro_utils.pagination.firstPageWithOneElementPagination
|
||||
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
||||
@@ -25,6 +25,7 @@ class CachedPostsRepo(
|
||||
parentRepo,
|
||||
kvCache,
|
||||
scope,
|
||||
skipStartInvalidate = false,
|
||||
{ it.id }
|
||||
) {
|
||||
override val removedPostsFlow: Flow<RegisteredPost> by parentRepo::removedPostsFlow
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.inmo.plaguposter.posts.exposed
|
||||
|
||||
import com.benasher44.uuid.uuid4
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.repos.KeyValuesRepo
|
||||
import dev.inmo.micro_utils.repos.UpdatedValuePair
|
||||
import dev.inmo.micro_utils.repos.exposed.AbstractExposedCRUDRepo
|
||||
|
||||
@@ -18,84 +18,95 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextWithFSM
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.*
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.strictlyOn
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.*
|
||||
import dev.inmo.tgbotapi.extensions.utils.extensions.raw.text
|
||||
import dev.inmo.tgbotapi.extensions.utils.extensions.sameChat
|
||||
import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage
|
||||
import dev.inmo.tgbotapi.extensions.utils.textContentOrNull
|
||||
import dev.inmo.tgbotapi.extensions.utils.types.buttons.*
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||
import dev.inmo.tgbotapi.types.message.content.MediaGroupContent
|
||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||
import dev.inmo.tgbotapi.utils.regular
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.serialization.Serializable
|
||||
import org.koin.core.Koin
|
||||
|
||||
@Serializable
|
||||
object Plugin : Plugin {
|
||||
@Serializable
|
||||
data class Config(
|
||||
val useInlineFinishingOpportunity: Boolean = true
|
||||
)
|
||||
|
||||
override suspend fun BehaviourContextWithFSM<State>.setupBotPlugin(koin: Koin) {
|
||||
val config = koin.get<ChatConfig>()
|
||||
val postsRepo = koin.get<PostsRepo>()
|
||||
|
||||
strictlyOn {state: RegistrationState.InProcess ->
|
||||
strictlyOn { state: RegistrationState.InProcess ->
|
||||
val buttonUuid = "finish"
|
||||
|
||||
val messageToDelete = send(
|
||||
state.context,
|
||||
dev.inmo.tgbotapi.utils.buildEntities {
|
||||
if (state.messages.isNotEmpty()) {
|
||||
regular("Your message(s) has been registered. You may send new ones or push \"Finish\" to finalize your post")
|
||||
val suggestionMessageDeferred = async {
|
||||
send(
|
||||
state.context,
|
||||
dev.inmo.tgbotapi.utils.buildEntities {
|
||||
if (state.messages.isNotEmpty()) {
|
||||
regular("Your message(s) has been registered. You may send new ones or push \"Finish\" to finalize your post")
|
||||
} else {
|
||||
regular("Ok, send me your messages for new post")
|
||||
}
|
||||
},
|
||||
replyMarkup = if (state.messages.isNotEmpty()) {
|
||||
flatInlineKeyboard {
|
||||
dataButton(
|
||||
"Finish",
|
||||
buttonUuid
|
||||
)
|
||||
}
|
||||
} else {
|
||||
regular("Ok, send me your messages for new post")
|
||||
null
|
||||
}
|
||||
},
|
||||
replyMarkup = if (state.messages.isNotEmpty()) {
|
||||
flatInlineKeyboard {
|
||||
dataButton(
|
||||
"Finish",
|
||||
buttonUuid
|
||||
)
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
val newMessagesInfo = firstOf {
|
||||
firstOf {
|
||||
add {
|
||||
listOf(
|
||||
waitAnyContentMessage().filter {
|
||||
it.chat.id == state.context && it.content.textContentOrNull() ?.text != "/finish_post"
|
||||
}.take(1).first()
|
||||
)
|
||||
val receivedMessage = waitAnyContentMessage().filter {
|
||||
it.sameChat(state.context)
|
||||
}.first()
|
||||
|
||||
when {
|
||||
receivedMessage.content.textContentOrNull() ?.text == "/finish_post" -> {
|
||||
val messageToDelete = suggestionMessageDeferred.await()
|
||||
edit(messageToDelete, "Ok, finishing your request")
|
||||
RegistrationState.Finish(
|
||||
state.context,
|
||||
state.messages
|
||||
)
|
||||
}
|
||||
else -> {
|
||||
RegistrationState.InProcess(
|
||||
state.context,
|
||||
state.messages + PostContentInfo.fromMessage(receivedMessage)
|
||||
).also {
|
||||
runCatchingSafely {
|
||||
suggestionMessageDeferred.cancel()
|
||||
}
|
||||
runCatchingSafely {
|
||||
delete(suggestionMessageDeferred.await())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
add {
|
||||
val messageToDelete = suggestionMessageDeferred.await()
|
||||
val finishPressed = waitMessageDataCallbackQuery().filter {
|
||||
it.message.sameMessage(messageToDelete) && it.data == buttonUuid
|
||||
}.first()
|
||||
emptyList<ContentMessage<MessageContent>>()
|
||||
}
|
||||
add {
|
||||
val finishPressed = waitTextMessage().filter {
|
||||
it.sameChat(messageToDelete) && it.content.text == "/finish_post"
|
||||
}.first()
|
||||
emptyList<ContentMessage<MessageContent>>()
|
||||
}
|
||||
}.ifEmpty {
|
||||
edit(messageToDelete, "Ok, finishing your request")
|
||||
return@strictlyOn RegistrationState.Finish(
|
||||
state.context,
|
||||
state.messages
|
||||
)
|
||||
}.flatMap {
|
||||
PostContentInfo.fromMessage(it)
|
||||
}
|
||||
|
||||
RegistrationState.InProcess(
|
||||
state.context,
|
||||
state.messages + newMessagesInfo
|
||||
).also {
|
||||
delete(messageToDelete)
|
||||
edit(messageToDelete, "Ok, finishing your request")
|
||||
RegistrationState.Finish(
|
||||
state.context,
|
||||
state.messages
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,12 +119,12 @@ object Plugin : Plugin {
|
||||
null
|
||||
}
|
||||
|
||||
onCommand("start_post", initialFilter = { it.chat.id == config.sourceChatId }) {
|
||||
onCommand("start_post", initialFilter = { it.sameChat(config.sourceChatId) }) {
|
||||
startChain(RegistrationState.InProcess(it.chat.id, emptyList()))
|
||||
}
|
||||
|
||||
onContentMessage(
|
||||
initialFilter = { it.chat.id == config.sourceChatId && !FirstSourceIsCommandsFilter(it) }
|
||||
initialFilter = { it.sameChat(config.sourceChatId) && !FirstSourceIsCommandsFilter(it) }
|
||||
) {
|
||||
startChain(RegistrationState.Finish(it.chat.id, PostContentInfo.fromMessage(it)))
|
||||
}
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
package dev.inmo.plaguposter.ratings.gc
|
||||
|
||||
import com.soywiz.klock.seconds
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.seconds
|
||||
import dev.inmo.krontab.KrontabTemplate
|
||||
import dev.inmo.krontab.toSchedule
|
||||
import dev.inmo.krontab.utils.asFlowWithDelays
|
||||
import dev.inmo.micro_utils.coroutines.runCatchingSafely
|
||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.repos.*
|
||||
import dev.inmo.plagubot.Plugin
|
||||
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
|
||||
@@ -41,21 +44,35 @@ object Plugin : Plugin {
|
||||
val config = koin.get<Config>()
|
||||
|
||||
config.immediateDrop ?.let { toDrop ->
|
||||
ratingsRepo.onNewValue.subscribeSafelyWithoutExceptions(this) {
|
||||
if (it.value <= toDrop) {
|
||||
postsRepo.deleteById(it.id)
|
||||
suspend fun checkAndOptionallyDrop(postId: PostId, rating: Rating) {
|
||||
if (rating <= toDrop) {
|
||||
postsRepo.deleteById(postId)
|
||||
}
|
||||
}
|
||||
ratingsRepo.getAll().forEach {
|
||||
runCatchingSafely {
|
||||
checkAndOptionallyDrop(it.key, it.value)
|
||||
}
|
||||
}
|
||||
ratingsRepo.onNewValue.subscribeSafelyWithoutExceptions(this) {
|
||||
checkAndOptionallyDrop(it.first, it.second)
|
||||
}
|
||||
}
|
||||
config.autoclear ?.let { autoclear ->
|
||||
autoclear.autoClearKrontab.toSchedule().asFlowWithDelays().subscribeSafelyWithoutExceptions(scope) {
|
||||
val dropCreatedBefore = it - (autoclear.skipPostAge ?: 0).seconds
|
||||
suspend fun doAutoClear() {
|
||||
val dropCreatedBefore = DateTime.now() - (autoclear.skipPostAge ?: 0).seconds
|
||||
ratingsRepo.getPostsWithRatingLessEq(autoclear.rating).keys.forEach {
|
||||
if ((postsRepo.getPostCreationTime(it) ?: return@forEach) < dropCreatedBefore) {
|
||||
postsRepo.deleteById(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
runCatchingSafely {
|
||||
doAutoClear()
|
||||
}
|
||||
autoclear.autoClearKrontab.toSchedule().asFlowWithDelays().subscribeSafelyWithoutExceptions(scope) {
|
||||
doAutoClear()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.ratings.selector
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.plaguposter.posts.models.PostId
|
||||
import dev.inmo.plaguposter.posts.repo.PostsRepo
|
||||
import dev.inmo.plaguposter.ratings.repo.RatingsRepo
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.ratings.selector
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.plaguposter.posts.models.PostId
|
||||
|
||||
interface Selector {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.inmo.plaguposter.ratings.selector.models
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import com.soywiz.klock.seconds
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.seconds
|
||||
import dev.inmo.micro_utils.pagination.FirstPagePagination
|
||||
import dev.inmo.micro_utils.pagination.Pagination
|
||||
import dev.inmo.micro_utils.pagination.utils.getAllByWithNextPaging
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.inmo.plaguposter.ratings.selector.models
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import com.soywiz.klock.Time
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.Time
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.ratings.selector.models
|
||||
|
||||
import com.soywiz.klock.*
|
||||
import korlibs.time.*
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.ratings.source.buttons
|
||||
|
||||
import com.soywiz.klock.DateFormat
|
||||
import korlibs.time.DateFormat
|
||||
import dev.inmo.kslog.common.TagLogger
|
||||
import dev.inmo.kslog.common.d
|
||||
import dev.inmo.kslog.common.i
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package dev.inmo.plaguposter.ratings.source.repos
|
||||
|
||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||
import dev.inmo.micro_utils.repos.cache.KeyValueCacheRepo
|
||||
import dev.inmo.micro_utils.repos.cache.cache.FullKVCache
|
||||
import dev.inmo.micro_utils.repos.cache.full.cached
|
||||
import dev.inmo.micro_utils.repos.cache.full.fullyCached
|
||||
import dev.inmo.plaguposter.common.ShortMessageInfo
|
||||
import dev.inmo.tgbotapi.types.PollIdentifier
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -12,4 +11,4 @@ class CachedPollsToMessagesInfoRepo(
|
||||
private val repo: PollsToMessagesInfoRepo,
|
||||
private val scope: CoroutineScope,
|
||||
private val kvCache: FullKVCache<PollIdentifier, ShortMessageInfo> = FullKVCache()
|
||||
) : PollsToMessagesInfoRepo, KeyValueRepo<PollIdentifier, ShortMessageInfo> by repo.cached(kvCache, scope)
|
||||
) : PollsToMessagesInfoRepo, KeyValueRepo<PollIdentifier, ShortMessageInfo> by repo.fullyCached(kvCache, scope)
|
||||
|
||||
@@ -2,8 +2,7 @@ package dev.inmo.plaguposter.ratings.source.repos
|
||||
|
||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||
import dev.inmo.micro_utils.repos.cache.cache.FullKVCache
|
||||
import dev.inmo.micro_utils.repos.cache.full.cached
|
||||
import dev.inmo.plaguposter.common.ShortMessageInfo
|
||||
import dev.inmo.micro_utils.repos.cache.full.fullyCached
|
||||
import dev.inmo.plaguposter.posts.models.PostId
|
||||
import dev.inmo.tgbotapi.types.PollIdentifier
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -12,4 +11,4 @@ class CachedPollsToPostsIdsRepo(
|
||||
private val repo: PollsToPostsIdsRepo,
|
||||
private val scope: CoroutineScope,
|
||||
private val kvCache: FullKVCache<PollIdentifier, PostId> = FullKVCache()
|
||||
) : PollsToPostsIdsRepo, KeyValueRepo<PollIdentifier, PostId> by repo.cached(kvCache, scope)
|
||||
) : PollsToPostsIdsRepo, KeyValueRepo<PollIdentifier, PostId> by repo.fullyCached(kvCache, scope)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
"dev.inmo.plaguposter.ratings.Plugin",
|
||||
"dev.inmo.plaguposter.ratings.source.Plugin",
|
||||
"dev.inmo.plaguposter.ratings.selector.Plugin",
|
||||
"dev.inmo.plaguposter.ratings.gc.Plugin",
|
||||
"dev.inmo.plaguposter.triggers.selector_with_timer.Plugin",
|
||||
"dev.inmo.plagubot.plugins.inline.queries.Plugin",
|
||||
"dev.inmo.plaguposter.triggers.command.Plugin",
|
||||
@@ -25,7 +26,9 @@
|
||||
"chats": {
|
||||
"targetChat": 12345678,
|
||||
"cacheChat": 12345678,
|
||||
"sourceChat": 12345678
|
||||
"sourceChat": 12345678,
|
||||
"targetChats": [12345678],
|
||||
"_note": "You must set targetChat or targetChats with at least one object"
|
||||
}
|
||||
},
|
||||
"ratingsPolls": {
|
||||
@@ -72,5 +75,13 @@
|
||||
},
|
||||
"publish_command": {
|
||||
"panelButtonText": "Publish"
|
||||
},
|
||||
"gc": {
|
||||
"autoclear": {
|
||||
"rating": -1,
|
||||
"autoClearKrontab": "0 0 0 * *",
|
||||
"skipPostAge": 86400
|
||||
},
|
||||
"immediateDrop": -6
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ function assert_success() {
|
||||
|
||||
app=plaguposter
|
||||
version="`grep ../gradle.properties -e "^version=" | sed -e "s/version=\(.*\)/\1/"`"
|
||||
server=docker.io/insanusmokrassar
|
||||
server=insanusmokrassar
|
||||
|
||||
assert_success ../gradlew build
|
||||
assert_success sudo docker build -t $app:"$version" .
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.selector_with_timer
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.plaguposter.posts.models.PostId
|
||||
|
||||
fun interface AutopostFilter {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.selector_with_timer
|
||||
|
||||
import com.soywiz.klock.DateFormat
|
||||
import korlibs.time.DateFormat
|
||||
import dev.inmo.krontab.KrontabTemplate
|
||||
import dev.inmo.krontab.toSchedule
|
||||
import dev.inmo.krontab.utils.asFlowWithDelays
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package dev.inmo.plaguposter.triggers.timer
|
||||
|
||||
import com.soywiz.klock.DateFormat
|
||||
import com.soywiz.klock.DateTime
|
||||
import com.soywiz.klock.DateTimeTz
|
||||
import com.soywiz.klock.Month
|
||||
import com.soywiz.klock.Year
|
||||
import korlibs.time.DateFormat
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.DateTimeTz
|
||||
import korlibs.time.Month
|
||||
import korlibs.time.Year
|
||||
import dev.inmo.micro_utils.coroutines.runCatchingSafely
|
||||
import dev.inmo.micro_utils.repos.unset
|
||||
import dev.inmo.plaguposter.common.SuccessfulSymbol
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dev.inmo.plaguposter.triggers.timer
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import com.soywiz.klock.minutes
|
||||
import korlibs.time.DateTime
|
||||
import korlibs.time.minutes
|
||||
|
||||
fun nearestAvailableTimerTime() = (DateTime.now() + 1.minutes).copyDayOfMonth(
|
||||
milliseconds = 0,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.timer
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.coroutines.launchSafelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.coroutines.plus
|
||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.timer
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||
import dev.inmo.plaguposter.posts.models.PostId
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.timer
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.coroutines.runCatchingSafely
|
||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.koin.singleWithRandomQualifierAndBinds
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package dev.inmo.plaguposter.triggers.timer.repo
|
||||
|
||||
import com.soywiz.klock.DateTime
|
||||
import korlibs.time.DateTime
|
||||
import dev.inmo.micro_utils.common.firstNotNull
|
||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.pagination.paginate
|
||||
|
||||
Reference in New Issue
Block a user