1
1
package com.github.smaugfm.telegram.handlers
2
2
3
+ import com.elbekD.bot.types.CallbackQuery
3
4
import com.elbekD.bot.types.InlineKeyboardMarkup
4
5
import com.elbekD.bot.types.Message
5
6
import com.elbekD.bot.types.MessageEntity
6
7
import com.github.smaugfm.events.Event
8
+ import com.github.smaugfm.events.Handler
7
9
import com.github.smaugfm.events.HandlersBuilder
8
10
import com.github.smaugfm.events.IEventDispatcher
9
- import com.github.smaugfm.events.IEventsHandlerRegistrar
10
11
import com.github.smaugfm.settings.Mappings
11
12
import com.github.smaugfm.telegram.TelegramApi
12
13
import com.github.smaugfm.telegram.TransactionActionType
@@ -20,37 +21,46 @@ private val logger = KotlinLogging.logger {}
20
21
class CallbackQueryHandler (
21
22
private val telegram : TelegramApi ,
22
23
val mappings : Mappings ,
23
- ) : IEventsHandlerRegistrar {
24
- override fun registerEvents (builder : HandlersBuilder ) {
25
- builder.apply {
26
- registerUnit(this @CallbackQueryHandler::handle)
27
- }
24
+ ) : Handler() {
25
+
26
+ override fun HandlersBuilder.registerHandlerFunctions () {
27
+ registerUnit(this @CallbackQueryHandler::handle)
28
28
}
29
29
30
30
suspend fun handle (
31
31
dispatch : IEventDispatcher ,
32
32
event : Event .Telegram .CallbackQueryReceived ,
33
33
) {
34
- val type = TransactionActionType .deserialize(event.data, event.message)
34
+ val callbackQuery = event.callbackQuery
35
+ if (callbackQuery.from.id !in mappings.getTelegramChatIds()) {
36
+ logger.warn(" Received Telegram callbackQuery from unknown chatId: ${callbackQuery.from.id} " )
37
+ return
38
+ }
39
+
40
+ val (callbackQueryId, data, message) =
41
+ extractFromCallbackQuery(callbackQuery) ? : return
42
+
43
+ val type = TransactionActionType .deserialize(data, message)
35
44
? : return Unit .also {
36
45
telegram.answerCallbackQuery(
37
- event. callbackQueryId,
46
+ callbackQueryId,
38
47
TelegramHandler .UNKNOWN_ERROR_MSG
39
48
)
40
49
}
50
+
41
51
logger.info(" Found callbackQuery action type $type " )
42
52
43
53
val updatedTransaction = dispatch(Event .Ynab .TransactionAction (type)).also {
44
- telegram.answerCallbackQuery(event. callbackQueryId)
54
+ telegram.answerCallbackQuery(callbackQueryId)
45
55
}
46
56
47
- val updatedText = updateHTMLStatementMessage(updatedTransaction, event. message)
48
- val updatedMarkup = updateMarkupKeyboard(type, event. message.reply_markup!! )
57
+ val updatedText = updateHTMLStatementMessage(updatedTransaction, message)
58
+ val updatedMarkup = updateMarkupKeyboard(type, message.reply_markup!! )
49
59
50
- if (stripHTMLTagsFromMessage(updatedText) != event. message.text ||
51
- updatedMarkup != event. message.reply_markup
60
+ if (stripHTMLTagsFromMessage(updatedText) != message.text ||
61
+ updatedMarkup != message.reply_markup
52
62
) {
53
- with (event. message) {
63
+ with (message) {
54
64
telegram.editMessage(
55
65
chat.id,
56
66
message_id,
@@ -64,7 +74,7 @@ class CallbackQueryHandler(
64
74
65
75
private fun updateHTMLStatementMessage (
66
76
updatedTransaction : YnabTransactionDetail ,
67
- oldMessage : Message
77
+ oldMessage : Message ,
68
78
): String {
69
79
val oldText = oldMessage.text!!
70
80
val oldTextLines = oldText.split(" \n " ).filter { it.isNotBlank() }
@@ -85,6 +95,18 @@ class CallbackQueryHandler(
85
95
)
86
96
}
87
97
98
+ private fun extractFromCallbackQuery (callbackQuery : CallbackQuery ): Triple <String , String , Message >? {
99
+ val callbackQueryId = callbackQuery.id
100
+ val data = callbackQuery.data.takeUnless { it.isNullOrBlank() }
101
+ ? : logger.warn(" Received Telegram callbackQuery with empty data.\n $callbackQuery " )
102
+ .let { return null }
103
+ val message =
104
+ callbackQuery.message ? : logger.warn(" Received Telegram callbacQuery with empty message" )
105
+ .let { return null }
106
+
107
+ return Triple (callbackQueryId, data, message)
108
+ }
109
+
88
110
private fun pressedButtons (oldKeyboard : InlineKeyboardMarkup ): Set <KClass <out TransactionActionType >> =
89
111
oldKeyboard
90
112
.inline_keyboard
@@ -98,7 +120,7 @@ class CallbackQueryHandler(
98
120
99
121
private fun updateMarkupKeyboard (
100
122
type : TransactionActionType ,
101
- oldKeyboard : InlineKeyboardMarkup
123
+ oldKeyboard : InlineKeyboardMarkup ,
102
124
): InlineKeyboardMarkup =
103
125
formatInlineKeyboard(pressedButtons(oldKeyboard) + type::class )
104
126
}
0 commit comments