Skip to content

Commit 48b5678

Browse files
committed
/tz command update processor
1 parent 86ef887 commit 48b5678

6 files changed

Lines changed: 133 additions & 2 deletions

File tree

runners/lambda/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ dependencies {
2222
implementation(project.projects.currencies)
2323
implementation(project.projects.herald.processor)
2424
implementation(project.projects.leetcode)
25+
implementation(project.projects.times.timezones.dynamodb)
26+
implementation(project.projects.times)
2527
}

runners/lambda/src/main/kotlin/by/jprof/telegram/bot/runners/lambda/config/database.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import by.jprof.telegram.bot.kotlin.dao.KotlinMentionsDAO
55
import by.jprof.telegram.bot.monies.dao.MoniesDAO
66
import by.jprof.telegram.bot.pins.dao.PinDAO
77
import by.jprof.telegram.bot.quizoji.dao.QuizojiDAO
8+
import by.jprof.telegram.bot.times.timezones.dao.TimeZoneDAO
89
import by.jprof.telegram.bot.votes.dao.VotesDAO
910
import by.jprof.telegram.bot.youtube.dao.YouTubeChannelsWhitelistDAO
1011
import kotlinx.serialization.ExperimentalSerializationApi
@@ -14,10 +15,11 @@ import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient
1415
import by.jprof.telegram.bot.dialogs.dynamodb.dao.DialogStateDAO as DynamoDBDialogStateDAO
1516
import by.jprof.telegram.bot.kotlin.dynamodb.dao.KotlinMentionsDAO as DynamoDBKotlinMentionsDAO
1617
import by.jprof.telegram.bot.monies.dynamodb.dao.MoniesDAO as DynamoDBMoniesDAO
18+
import by.jprof.telegram.bot.pins.dynamodb.dao.PinDAO as DynamoDBPinDAO
1719
import by.jprof.telegram.bot.quizoji.dynamodb.dao.QuizojiDAO as DynamoDBQuizojiDAO
20+
import by.jprof.telegram.bot.times.timezones.dynamodb.dao.TimeZoneDAO as DynamoDBTimeZoneDAO
1821
import by.jprof.telegram.bot.votes.dynamodb.dao.VotesDAO as DynamoDBVotesDAO
1922
import by.jprof.telegram.bot.youtube.dynamodb.dao.YouTubeChannelsWhitelistDAO as DynamoDBYouTubeChannelsWhitelistDAO
20-
import by.jprof.telegram.bot.pins.dynamodb.dao.PinDAO as DynamoDBPinDAO
2123

2224
@ExperimentalSerializationApi
2325
val databaseModule = module {
@@ -73,4 +75,11 @@ val databaseModule = module {
7375
get(named(TABLE_PINS))
7476
)
7577
}
78+
79+
single<TimeZoneDAO> {
80+
DynamoDBTimeZoneDAO(
81+
get(),
82+
get(named(TABLE_TIMEZONES))
83+
)
84+
}
7685
}

runners/lambda/src/main/kotlin/by/jprof/telegram/bot/runners/lambda/config/pipeline.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import by.jprof.telegram.bot.quizoji.QuizojiOptionUpdateProcessor
1717
import by.jprof.telegram.bot.quizoji.QuizojiQuestionUpdateProcessor
1818
import by.jprof.telegram.bot.quizoji.QuizojiStartCommandUpdateProcessor
1919
import by.jprof.telegram.bot.quizoji.QuizojiVoteUpdateProcessor
20+
import by.jprof.telegram.bot.times.TimeZoneCommandUpdateProcessor
2021
import by.jprof.telegram.bot.youtube.YouTubeUpdateProcessor
2122
import dev.inmo.tgbotapi.utils.PreviewFeature
2223
import org.koin.core.qualifier.named
@@ -137,4 +138,11 @@ val pipelineModule = module {
137138
bot = get(),
138139
)
139140
}
141+
142+
single<UpdateProcessor>(named("TimeZoneCommandUpdateProcessor")) {
143+
TimeZoneCommandUpdateProcessor(
144+
timeZoneDAO = get(),
145+
bot = get(),
146+
)
147+
}
140148
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package by.jprof.telegram.bot.times
2+
3+
import by.jprof.telegram.bot.core.UpdateProcessor
4+
import by.jprof.telegram.bot.times.model.TimeZoneRequest
5+
import by.jprof.telegram.bot.times.model.TimeZoneValue
6+
import by.jprof.telegram.bot.times.timezones.dao.TimeZoneDAO
7+
import by.jprof.telegram.bot.times.timezones.model.TimeZone
8+
import by.jprof.telegram.bot.times.utils.TimeZoneParser
9+
import by.jprof.telegram.bot.times.utils.timeZoneSet
10+
import by.jprof.telegram.bot.times.utils.unrecognizedValue
11+
import by.jprof.telegram.bot.times.utils.yourTimeZone
12+
import dev.inmo.tgbotapi.bot.RequestsExecutor
13+
import dev.inmo.tgbotapi.extensions.api.send.reply
14+
import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2
15+
import dev.inmo.tgbotapi.types.update.abstracts.Update
16+
import org.apache.logging.log4j.LogManager
17+
18+
class TimeZoneCommandUpdateProcessor(
19+
private val timeZoneDAO: TimeZoneDAO,
20+
private val bot: RequestsExecutor,
21+
private val timeZoneParser: TimeZoneParser = TimeZoneParser.DEFAULT,
22+
) : UpdateProcessor {
23+
companion object {
24+
private val logger = LogManager.getLogger(TimeZoneCommandUpdateProcessor::class.java)!!
25+
}
26+
27+
override suspend fun process(update: Update) {
28+
timeZoneParser(update)?.let { timeZone ->
29+
logger.info("TimeZone requested: {}", timeZone)
30+
31+
when (timeZone.value) {
32+
TimeZoneValue.Unrecognized -> replyToUnrecognizedTimeZoneRequest(timeZone)
33+
TimeZoneValue.Empty -> replyToEmptyTimeZoneRequest(timeZone)
34+
else -> setTimeZone(timeZone)
35+
}
36+
}
37+
}
38+
39+
private suspend fun replyToUnrecognizedTimeZoneRequest(timeZoneRequest: TimeZoneRequest) {
40+
bot.reply(to = timeZoneRequest.request, text = unrecognizedValue(), parseMode = MarkdownV2)
41+
}
42+
43+
private suspend fun replyToEmptyTimeZoneRequest(timeZoneRequest: TimeZoneRequest) {
44+
val timeZone = timeZoneDAO.get(timeZoneRequest.user.id.chatId, timeZoneRequest.chat.id.chatId)
45+
46+
bot.reply(to = timeZoneRequest.request, text = yourTimeZone(timeZone), parseMode = MarkdownV2)
47+
}
48+
49+
private suspend fun setTimeZone(timeZoneRequest: TimeZoneRequest) {
50+
val timeZone = TimeZone(
51+
user = timeZoneRequest.user.id.chatId,
52+
chat = timeZoneRequest.chat.id.chatId,
53+
).run {
54+
when (timeZoneRequest.value) {
55+
is TimeZoneValue.Id -> copy(zoneId = timeZoneRequest.value.id)
56+
is TimeZoneValue.Offset -> copy(offset = timeZoneRequest.value.offset)
57+
else -> this
58+
}
59+
}
60+
61+
timeZoneDAO.save(timeZone)
62+
63+
bot.reply(to = timeZoneRequest.request, text = timeZoneSet(timeZone), parseMode = MarkdownV2)
64+
}
65+
}

times/src/main/kotlin/by/jprof/telegram/bot/times/utils/TimeZoneParser.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ interface TimeZoneParser : (Update) -> TimeZoneRequest? {
3434
)
3535
}
3636

37-
private fun parse(argument: String?): TimeZoneValue = if (argument == null) {
37+
private fun parse(argument: String?): TimeZoneValue = if (argument.isNullOrBlank()) {
3838
TimeZoneValue.Empty
3939
} else {
4040
val zoneId = try {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package by.jprof.telegram.bot.times.utils
2+
3+
import by.jprof.telegram.bot.times.timezones.model.TimeZone
4+
import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common
5+
import java.text.MessageFormat
6+
7+
private val unrecognizedValueMessages = listOf(
8+
"Не могу разобрать таймзону\\!",
9+
"Не понимаю\\, чё ты тут написал\\!",
10+
"Не знаю такой таймзоны\\!",
11+
)
12+
13+
internal fun unrecognizedValue(): String {
14+
return unrecognizedValueMessages.random()
15+
}
16+
17+
private val emptyTimeZoneMessages = listOf(
18+
"Ты не установил свою таймзону \uD83D\uDE14",
19+
)
20+
21+
private val yourTimeZoneMessages = listOf(
22+
"Твоя таймзона: {0}\\.",
23+
)
24+
25+
internal fun yourTimeZone(timeZone: TimeZone?): String {
26+
return if ((null == timeZone) || ((timeZone.zoneId == null) && (timeZone.offset == null))) {
27+
emptyTimeZoneMessages.random()
28+
} else {
29+
MessageFormat(yourTimeZoneMessages.random()).format(
30+
arrayOf((timeZone.zoneId ?: timeZone.offset).toString().escapeMarkdownV2Common())
31+
)
32+
}
33+
}
34+
35+
private val timeZoneSetMessages = listOf(
36+
"Установлена таймзона: {0}\\.",
37+
)
38+
39+
internal fun timeZoneSet(timeZone: TimeZone?): String {
40+
return if ((null == timeZone) || ((timeZone.zoneId == null) && (timeZone.offset == null))) {
41+
emptyTimeZoneMessages.random()
42+
} else {
43+
MessageFormat(timeZoneSetMessages.random()).format(
44+
arrayOf((timeZone.zoneId ?: timeZone.offset).toString().escapeMarkdownV2Common())
45+
)
46+
}
47+
}

0 commit comments

Comments
 (0)