This commit is contained in:
InsanusMokrassar 2022-12-13 13:16:55 +06:00
parent 74f3503413
commit 00803fa933
3 changed files with 88 additions and 45 deletions

View File

@ -15,6 +15,7 @@ dependencies {
api project(":plaguposter.posts_registrar") api project(":plaguposter.posts_registrar")
api project(":plaguposter.triggers.command") api project(":plaguposter.triggers.command")
api project(":plaguposter.triggers.selector_with_timer") api project(":plaguposter.triggers.selector_with_timer")
api project(":plaguposter.triggers.timer")
api project(":plaguposter.ratings") api project(":plaguposter.ratings")
api project(":plaguposter.ratings.source") api project(":plaguposter.ratings.source")
api project(":plaguposter.ratings.selector") api project(":plaguposter.ratings.selector")

View File

@ -6,42 +6,34 @@ import com.soywiz.klock.Month
import com.soywiz.klock.Year import com.soywiz.klock.Year
import dev.inmo.plaguposter.common.SuccessfulSymbol import dev.inmo.plaguposter.common.SuccessfulSymbol
import dev.inmo.plaguposter.posts.models.PostId import dev.inmo.plaguposter.posts.models.PostId
import dev.inmo.tgbotapi.extensions.api.answers.answer
import dev.inmo.tgbotapi.extensions.api.edit.edit import dev.inmo.tgbotapi.extensions.api.edit.edit
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMessageDataCallbackQuery import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMessageDataCallbackQuery
import dev.inmo.tgbotapi.extensions.utils.commonMessageOrNull
import dev.inmo.tgbotapi.extensions.utils.extensions.raw.reply_markup
import dev.inmo.tgbotapi.extensions.utils.ifCallbackDataInlineKeyboardButton
import dev.inmo.tgbotapi.extensions.utils.ifCommonMessage
import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton
import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard
import dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard import dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard
import dev.inmo.tgbotapi.extensions.utils.withContent
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
import dev.inmo.tgbotapi.types.queries.callback.MessageDataCallbackQuery
import dev.inmo.tgbotapi.utils.row import dev.inmo.tgbotapi.utils.row
object ButtonsBuilder { object ButtonsBuilder {
private const val changeHoursDataPrefix = "timer_hours" private const val changeHoursDataPrefix = "timer_h"
private const val changeMinutesDataPrefix = "timer_minutes" private const val changeMinutesDataPrefix = "timer_m"
private const val changeDayDataPrefix = "timer_day" private const val changeDayDataPrefix = "timer_d"
private const val changeMonthDataPrefix = "timer_month" private const val changeMonthDataPrefix = "timer_M"
private const val changeYearDataPrefix = "timer_year" private const val changeYearDataPrefix = "timer_y"
private const val changeDateDataPrefix = "timer_set" private const val changeDateDataPrefix = "timer_s"
private fun buildTimerButtons( fun buildTimerButtons(
postId: PostId, postId: PostId,
dateTime: DateTime dateTime: DateTimeTz
) = flatInlineKeyboard { ) = flatInlineKeyboard {
val unixMillis = dateTime.unixMillisLong val unixMillis = dateTime.utc.unixMillisLong
val local = dateTime.local dataButton(dateTime.hours.toString(), "$changeHoursDataPrefix $postId $unixMillis")
dataButton(local.hours.toString(), "$changeHoursDataPrefix $postId $unixMillis") dataButton(":${dateTime.minutes}", "$changeMinutesDataPrefix $postId $unixMillis")
dataButton(":${local.minutes}", "$changeMinutesDataPrefix $postId $unixMillis")
dataButton(local.dayOfMonth.toString(), "$changeDayDataPrefix $postId $unixMillis") dataButton(dateTime.dayOfMonth.toString(), "$changeDayDataPrefix $postId $unixMillis")
dataButton(".${local.month1}", "$changeMonthDataPrefix $postId $unixMillis") dataButton(".${dateTime.month1}", "$changeMonthDataPrefix $postId $unixMillis")
dataButton(".${local.yearInt}", "$changeYearDataPrefix $postId $unixMillis") dataButton(".${dateTime.yearInt}", "$changeYearDataPrefix $postId $unixMillis")
dataButton(SuccessfulSymbol, "$changeDateDataPrefix $postId $unixMillis") dataButton(SuccessfulSymbol, "$changeDateDataPrefix $postId $unixMillis")
} }
@ -51,13 +43,14 @@ object ButtonsBuilder {
prefix: String, prefix: String,
postId: PostId, postId: PostId,
values: Iterable<Int>, values: Iterable<Int>,
dateConverter: (Int) -> DateTime min: DateTime = DateTime.now(),
dateConverter: (Int) -> DateTimeTz
): InlineKeyboardMarkup { ): InlineKeyboardMarkup {
return inlineKeyboard { return inlineKeyboard {
values.chunked(5).forEach { values.chunked(5).forEach {
row { row {
it.forEach { it.forEach {
dataButton(it.toString(), "$prefix $postId ${dateConverter(it).unixMillisLong}") dataButton(it.toString(), "$prefix $postId ${dateConverter(it).utc.unixMillisLong.coerceAtLeast(min.unixMillisLong)}")
} }
} }
} }
@ -66,21 +59,21 @@ object ButtonsBuilder {
suspend fun buildStandardDataCallbackQuery( suspend fun buildStandardDataCallbackQuery(
prefix: String, prefix: String,
possibleValues: (DateTime) -> Iterable<Int>, possibleValues: (DateTimeTz) -> Iterable<Int>,
dateTimeConverter: (Int, DateTime) -> DateTime dateTimeConverter: (Int, DateTimeTz) -> DateTimeTz
) { ) {
val setPrefix = "${prefix}_set" val setPrefix = "${prefix}s"
onMessageDataCallbackQuery(Regex("$prefix .+")) { onMessageDataCallbackQuery(Regex("$prefix .+")) {
val (_, rawPostId, rawDateTimeMillis) = it.data.split(" ") val (_, rawPostId, rawDateTimeMillis) = it.data.split(" ")
val currentMillis = rawDateTimeMillis.toLongOrNull() ?: return@onMessageDataCallbackQuery val currentMillis = rawDateTimeMillis.toLongOrNull() ?: return@onMessageDataCallbackQuery
val currentDateTime = DateTime(currentMillis) val currentDateTime = DateTime(currentMillis).local
edit ( edit (
it.message, it.message,
replyMarkup = buildKeyboard( replyMarkup = buildKeyboard(
setPrefix, setPrefix,
PostId(rawPostId), PostId(rawPostId),
possibleValues(DateTime(currentMillis)) possibleValues(currentDateTime)
) { ) {
dateTimeConverter(it, currentDateTime) dateTimeConverter(it, currentDateTime)
} }
@ -96,7 +89,7 @@ object ButtonsBuilder {
it.message, it.message,
buildTimerButtons( buildTimerButtons(
PostId(rawPostId), PostId(rawPostId),
currentDateTime currentDateTime.local
) )
) )
} }
@ -108,64 +101,72 @@ object ButtonsBuilder {
changeHoursDataPrefix, changeHoursDataPrefix,
{ {
val now = DateTime.now().local val now = DateTime.now().local
val local = it.local
if (now.dateEq(local)) { if (now.dateEq(it)) {
now.hours .. 23 now.hours .. 23
} else { } else {
0 .. 23 0 .. 23
} }
} }
) { newValue, oldDateTime -> ) { newValue, oldDateTime ->
oldDateTime.copyDayOfMonth(hours = newValue) // TODO::Fix issue in case of local and utc diff DateTimeTz.local(
oldDateTime.local.copyDayOfMonth(hours = newValue),
oldDateTime.offset
)
} }
buildStandardDataCallbackQuery( buildStandardDataCallbackQuery(
changeMinutesDataPrefix, changeMinutesDataPrefix,
{ {
val now = DateTime.now().local val now = DateTime.now().local
val local = it.local
if (now.dateEq(local)) { if (now.dateEq(it) && now.hours >= it.hours) {
now.minutes .. 60 now.minutes until 60
} else { } else {
0 .. 60 0 until 60
} }
} }
) { newValue, oldDateTime -> ) { newValue, oldDateTime ->
oldDateTime.copyDayOfMonth(minutes = newValue) // TODO::Fix issue in case of local and utc diff DateTimeTz.local(
oldDateTime.local.copyDayOfMonth(minutes = newValue),
oldDateTime.offset
)
} }
buildStandardDataCallbackQuery( buildStandardDataCallbackQuery(
changeDayDataPrefix, changeDayDataPrefix,
{ {
val now = DateTime.now().local val now = DateTime.now().local
val local = it.local
if (now.dateEq(local)) { if (now.yearInt == it.yearInt && now.month0 == it.month0) {
now.dayOfMonth .. it.month.days(it.year) now.dayOfMonth .. it.month.days(it.year)
} else { } else {
1 .. it.month.days(it.year) 1 .. it.month.days(it.year)
} }
} }
) { newValue, oldDateTime -> ) { newValue, oldDateTime ->
oldDateTime.copyDayOfMonth(dayOfMonth = newValue) // TODO::Fix issue in case of local and utc diff DateTimeTz.local(
oldDateTime.local.copyDayOfMonth(dayOfMonth = newValue),
oldDateTime.offset
)
} }
buildStandardDataCallbackQuery( buildStandardDataCallbackQuery(
changeMonthDataPrefix, changeMonthDataPrefix,
{ {
val now = DateTime.now().local val now = DateTime.now().local
val local = it.local
if (now.year == local.year) { if (now.year == it.year) {
now.month1 .. 12 now.month1 .. 12
} else { } else {
1 .. 12 1 .. 12
} }
} }
) { newValue, oldDateTime -> ) { newValue, oldDateTime ->
oldDateTime.copyDayOfMonth(month = Month(newValue)) // TODO::Fix issue in case of local and utc diff DateTimeTz.local(
oldDateTime.local.copyDayOfMonth(month = Month(newValue)),
oldDateTime.offset
)
} }
buildStandardDataCallbackQuery( buildStandardDataCallbackQuery(
@ -174,7 +175,10 @@ object ButtonsBuilder {
(it.year.year .. (it.year.year + 5)) (it.year.year .. (it.year.year + 5))
} }
) { newValue, oldDateTime -> ) { newValue, oldDateTime ->
oldDateTime.copyDayOfMonth(year = Year(newValue)) // TODO::Fix issue in case of local and utc diff DateTimeTz.local(
oldDateTime.local.copyDayOfMonth(year = Year(newValue)),
oldDateTime.offset
)
} }
} }
} }

View File

@ -1,11 +1,49 @@
package dev.inmo.plaguposter.triggers.timer package dev.inmo.plaguposter.triggers.timer
import com.soywiz.klock.DateTime
import dev.inmo.micro_utils.coroutines.runCatchingSafely
import dev.inmo.plagubot.Plugin import dev.inmo.plagubot.Plugin
import dev.inmo.plaguposter.posts.repo.ReadPostsRepo
import dev.inmo.tgbotapi.extensions.api.edit.edit
import dev.inmo.tgbotapi.extensions.api.send.send
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Database
import org.koin.core.Koin
import org.koin.core.module.Module import org.koin.core.module.Module
object Plugin : Plugin { object Plugin : Plugin {
override fun Module.setupDI(database: Database, params: JsonObject) { override fun Module.setupDI(database: Database, params: JsonObject) {
} }
override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
val postsRepo = koin.get<ReadPostsRepo>()
with(ButtonsBuilder) {
includeKeyboardHandling()
}
onCommand("test") {
val reply = it.replyTo ?: return@onCommand
val postId = postsRepo.getIdByChatAndMessage(
reply.chat.id,
reply.messageId
) ?: return@onCommand
val buttons = ButtonsBuilder.buildTimerButtons(
postId,
DateTime.nowLocal()
)
runCatchingSafely {
edit(
it,
buttons
)
}.onFailure { _ ->
send(
it.chat,
"Buttons",
replyMarkup = buttons
)
}
}
}
} }